Alle Variablen/Parameter, welche von außen in die anonyme Methode (die Prozedur im Queue) rein gereicht werden,
werden als Kopie in einem "internen" Interface abgelegt, welches die übergeordnete Prozedur und die Anonyme sich teilen.
Ups ja, das betrifft doch nicht FOnLoadPicture.
In Wirklichkeit sieht es bei dir ja so aus.
Delphi-Quellcode:
TThread.Queue(nil,
procedure
begin
Self.FOnLoadPicture({Self.?}FBitmap);
end
);
Beispiel:
Delphi-Quellcode:
procedure TMiau.ABC(Param: Irgendwas);
var
Blubb: Sonstwas;
begin
Blubb := ...;
TThread.Queue(nil,
procedure
begin
Machwas(Param, Blubb);
{Self.}FOnLoadPicture({Self.}FBitmap);
end
);
und intern sieht es dann eigentlich so aus, nach dem Kompilieren (so in etwa)
Delphi-Quellcode:
procedure TMiau.ABC(Param: Irgendwas);
type
IGeheimesVariablenInterface = interface
Self: TMiau;
Blubb: Sonstwas;
Param: Irgendwas;
end;
TGeheimesVariablenInterface = class(TInterfacedObject, IGeheimesVariablenInterface)
..
end;
var
XXX: IGeheimesVariablenInterface;
begin
XXX := TGeheimesVariablenInterface.Create;
XXX.Param := Param;
XXX.Blubb := ...;
TThread.Queue(nil,
procedure
var
YYY: IGeheimesVariablenInterface := XXX;
begin
Machwas(XXX.Param, XXX.Blubb);
XXX.Self.FOnLoadPicture(XXX.Self.FBitmap);
end
);
Also ja, wenn Self (dein Thread) weg ist, dann wäre auch FOnLoadPicture weg,
es sei denn du legst dir innerhalb deiner übergeordneten Prozedur eine lokale Variable an, wo dieser Wert gespeichert und der dann an die Queue übergeben wird. (entsprechend Blubb)
Wäre "Self" wiederum ein Interface, anstatt eines Objektes, dann sähe die Sache wieder etwas anders aus,
da die zusätzliche Referenz dessen Lebensdauer ja verlängern würde, bis die anonyme Methode beendet ist.
Ein Therapeut entspricht 1024 Gigapeut.