Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

Formular korrekt Freigeben

  Alt 2. Jun 2016, 11:36
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 2. Jun 2016 um 11:45 Uhr)
  Mit Zitat antworten Zitat