Конференция "KOL" » переменная сама меняет значения
 
  • tippa © (21.03.10 13:53) [0]
    Вот для тестовая програмка:
    program Test;

    uses
    KOL,windows;

    type
    PForm1 = ^TForm1;
    TForm1 = object(TObj)
      Form, Button: PControl;
    public
      procedure ButtonClick(Sender: PObj);
    end;

    var
    Form1: PForm1;

    procedure NewForm1(var Result: PForm1; AParent: PControl);
    begin
    New(Result,Create);
    with Result^ do
    begin
      Form := NewForm(AParent,'Form1').SetSize(240,240);
      Button := NewButton(Form,'Test').CenterOnParent;
      Button.OnClick := ButtonClick;
    end;
    end;

    procedure TForm1.ButtonClick(Sender: PObj);
    var a:integer;
         function EnumWindowsError(H:Hwnd;L:LParam):Bool;stdcall;
         begin
         showmessage(int2str(a));//а тут =46
         Result:=false;
         end;
    begin
    a:=10;
    showmessage(int2str(a));//тут =10
    EnumWindows(@EnumWindowsError,0);
    showmessage(int2str(a));//тут опять =10
    end;

    begin
    Applet := NewApplet('Test');
    NewForm1(Form1,Applet);
    Run(Applet);
    end.


    Это косяк или я чего-то не понимаю?
  • Vladimir Kladov © (21.03.10 14:49) [1]
    Как по-вашему локальная функция получает доступ к переменной процедуры в которую она вложена? Если вы ее используете как Callback-функцию, вызываемую из операционной системы, то последовательность кадров в стеке не та, на которую рассчитывал компилятор, вот и разгадка всей вашей мистики.
  • tippa © (21.03.10 16:26) [2]
    Ничего не понял, к сожалению. И как поступить? Если делать Callback-функию глобальной, но тогда и все локальные переменные надо глобольно объявлять, если объявлять переменные глобально, то это как-то некрасиво получается. Или объясните почему 10 меняется на 46(а не 45 например) - тогда может разберусь.
  • Vladimir Kladov © (21.03.10 16:38) [3]
    Сделайте переменную глобальной. Да, все переменные, которые нужны этой процедуре. Вообще, лучше callback-функции не делать вложенными подпрограммами, это не ваш код их вызывает, а система. Красота тут ни при чем. Надо просто понимать, что делается, когда код исполняется.
  • tippa © (21.03.10 19:32) [4]
    спасибо, когда-нибудь я точно научусь это понимать))
 
Конференция "KOL" » переменная сама меняет значения
Есть новые Нет новых   [134430   +3][b:0][p:0.001]