AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular korrekt Freigeben

Ein Thema von QuickAndDirty · begonnen am 2. Jun 2016 · letzter Beitrag vom 2. Jun 2016
Antwort Antwort
Seite 1 von 2  1 2      
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 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
FarAndBeyond
(Gast)

n/a Beiträge
 
#2

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 11:43
"Release" und "Nil" sollte doch eigentlich reichen?

Warum schickst du dir nicht 'ne Message an das Hauptfenster und wenn das Hauptfenster diese empfängt, dann wird freigegeben?
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 11:53
Auch mit Release und nil ohne close
kommt es (wenn ich es mit breakpoint provoziere) zu besagter zugriffsverletzung.

Ich habe das bisher so gemacht wie es ist, weil der Fehler in Android scheinbar nicht auftritt und in Windows nur sehr sehr selten. Bin halt gerade eben erst auf die Ursache gestoßen.

Das Release findet im Navigations Befehl statt.
Ich könnte das also per PosMessage auslösen.
PostMessage mag ich nur nicht so gerne, weil man nie weiß wo ein Processmessages einem die Reihenfolge der Queue wieder durcheinander bringt.


Macht ihr das auch so?


Es müsste ein Timer sein in dem
TFmxFormState.Engaged in self.Formstate abgefragt wird.
Ist das korrekt?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 2. Jun 2016 um 12:08 Uhr)
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#4

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:09
Aus dem Event heraus das Fenster freizugeben sieht für mich nicht gut aus...
Wenn du Postmessage nicht magst dann versuch doch irgendwo Sendmessage einzubauen oder gibt es in FMX QueueAsyncCall bzw. etwas ähnliches?
"IAsyncCall" ??? oder so...

Da muß es doch noch was geben was man nehmen kann...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:13
Delphi-Quellcode:
var
  [WEAK] Form: TForm;

Form.Free; // oder Form.Close, wenn FireMonkes auch sowas wie caFree hat
Wenn die Form freigegeben wird, wird die Variable automatisch auf NIL gesetzt.

Aber nur, in NextGen-Compilern.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:17
@FarAndBeyond:
Ja die Lazarus Leute haben da genau das was ich jetzt bräuchte.

Ich weiß auch nicht ob WindowsMessages so eine tolle Sache sind wenn die App in Android läuft.

@himitsu:
Ich habe probleme damit dass nach dem DoChange ereignis von TListview noch
newcursor := Obj.cursor passiert.
Es findet noch Verarbeitung des "Mouseereignesses" statt.

Ich bräuchte ein Ereignis das feuert wenn der Formstate kein "Engaged" mehr enthält. So das dann dort die Navigation und die implizite Freigabe des Formulars stattfinden kann.
Oder ich bräuchte ne möglichkeit die Navigation delayed zu feuern. Ich kann mir das bauen mit nem Timer...es wäre halt nur schöner wenn es was fertiges gäbe.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 2. Jun 2016 um 12:29 Uhr)
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#7

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:26
Gutes Argument...
Stimmt, da hängt Android echt hinterher... sie kriegen es einfach nicht hin die WINApi zu integrieren...
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:34
Hab den Fehler....
ohne Processmessages nach Release funktioniert alles wie es soll. Release zerstört es verzögert, via Messagequeue.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 2. Jun 2016 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:34
Zitat:
Oder ich bräuchte ne möglichkeit die Navigation delayed zu feuern. Ich kann mir das bauen mit nem Timer...es wäre halt nur schöner wenn es was fertiges gäbe.
theoretisch
Delphi-Quellcode:
TThread.Queue(procedure
  begin
    // machwas, aber nicht gleich
  end);
Aber zumindestens im Windows ist das so blöd implementiert, dass es eben nicht verzögert ausgeführt wird, wenn man das im VCL-MainThread ausführt.
http://www.delphipraxis.net/179193-t...der-queue.html
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#10

AW: Formular korrekt Freigeben

  Alt 2. Jun 2016, 12:51
Zitat:
Hab den Fehler....
ohne Processmessages nach Release funktioniert alles wie es soll. Release zerstört es verzögert, via Messagequeue.
Ich höre sowieso immer man soll das "ProcessMessages" nicht benutzen... warum ist mir entgangen...
Und ich wollte gerade fragen wo du dann den Timer wieder freigibst, den sollte man ja auch nicht aus seinem eigenen Event freigeben...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz