-
Вот для тестовая програмка: 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)); Result:=false;
end;
begin
a:=10;
showmessage(int2str(a)); EnumWindows(@EnumWindowsError,0);
showmessage(int2str(a)); end;
begin
Applet := NewApplet('Test');
NewForm1(Form1,Applet);
Run(Applet);
end. Это косяк или я чего-то не понимаю?
-
Как по-вашему локальная функция получает доступ к переменной процедуры в которую она вложена? Если вы ее используете как Callback-функцию, вызываемую из операционной системы, то последовательность кадров в стеке не та, на которую рассчитывал компилятор, вот и разгадка всей вашей мистики.
-
Ничего не понял, к сожалению. И как поступить? Если делать Callback-функию глобальной, но тогда и все локальные переменные надо глобольно объявлять, если объявлять переменные глобально, то это как-то некрасиво получается. Или объясните почему 10 меняется на 46(а не 45 например) - тогда может разберусь.
-
Сделайте переменную глобальной. Да, все переменные, которые нужны этой процедуре. Вообще, лучше callback-функции не делать вложенными подпрограммами, это не ваш код их вызывает, а система. Красота тут ни при чем. Надо просто понимать, что делается, когда код исполняется.
-
спасибо, когда-нибудь я точно научусь это понимать))
|