Hallo.
Ich gebe ein Firemonkey Formular frei, ausgelöst durch eine Benutzer aktion auf dem selbigen.
Irgendwo innerhalb von TListview.OnChange kommt dieser Code.
Delphi-Quellcode:
Form.Close;
Form.Release;
Application.processmessages;
Form := nil;
Meist funktioniert das.
Seltsamer weise nicht immer.
Ich kann eine Zugriffverletzung provozieren, wenn ich im TListview.DoChange einen Breakpoint hinterlege.
Die Zugriffsverletzung passiert dann in der Mousdown Behandlung.
Delphi-Quellcode:
procedure TCommonCustomForm.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
P: TPointF;
Obj: IControl;
SG: ISizeGrip;
NewCursor: TCursor;
begin
Engage;
try
{ translate coord }
FMousePos := PointF(X, Y);
FDownPos := FMousePos;
NewCursor := Cursor; // use the form cursor only if no control has been clicked
Obj := ObjectAtPoint(ClientToScreen(FMousePos));
if Obj <> nil then
if (IInterface(Obj).QueryInterface(ISizeGrip, SG) = 0) then
StartWindowResize
else
begin
P := Obj.ScreenToLocal(ClientToScreen(FMousePos));
if (Obj.DragMode = TDragMode.dmAutomatic) and (Button = TMouseButton.mbLeft) then
Obj.BeginAutoDrag
else
Obj.MouseDown(Button, Shift, P.X, P.Y);
NewCursor := Obj.Cursor; //<<< hier passiert die Zugriffsverletzung
end
else
DoMouseDown(Button, Shift, X, Y);
if FCursorService <> nil then
FCursorService.SetCursor(NewCursor);
finally
Disengage;
end;
end;
Eigentlich sollte es vermutlich immer schiefgehen. Seltsamer weise ist das nicht der Fall.
TListview verwendet einen DelayedIncidentTimer vielleicht liegt es daran, dass es in 99% der Fälle klappt.
Muss ich das Formular über einen eigenen DelayTimer freigeben oder gibts eine vorgefertigte Methode die das leistet?