Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verständnissfrage zum Freigeben einer dynamisch erzeugten Form (https://www.delphipraxis.net/209102-verstaendnissfrage-zum-freigeben-einer-dynamisch-erzeugten-form.html)

fisipjm 26. Okt 2021 13:51

Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Hi,

Ich hab eine Verständissfrage. Aktuell habe ich ein Stringgrid, beim doppelklick auf eine Zelle wir ein Formular aufgerufen welches weitere Informationen zu Verfügung stellt. Um es mir einfach zu machen, habe ich eine Form mit den design Elementen erzeugt (Klasse THistory). Funktioniert soweit auch. Ich mache über den folgenden Code den Aufruf, fühlt sich aber nach Speicherleck an, weis aber auch nicht wie ich es besser machen kann.

Delphi-Quellcode:
procedure TBaustellen.StringGridBindSourceDB1CellDblClick(const Column: TColumn;
  const Row: Integer);
var
  lHistoryView: THistory;
begin
  inherited;
  lHistoryView := FindComponent('History'+FDMemtableMain.FieldByName('GGUID').AsGUID.ToString.Replace('{','').Replace('}','').Replace('-','')) as THistory;

  if lHistoryView = nil then
  begin
    lHistoryView := THistory.Create(self);
    lHistoryView.Name := 'History'+FDMemtableMain.FieldByName('GGUID').AsGUID.ToString.Replace('{','').Replace('}','').replace('-','');
    lHistoryView.Description := 'Änderungsverlauf '+FDMemtableMain.FieldByName('Projektnummer').AsString;
    lHistoryView.TargetTable := 'Demotable';
    lHistoryView.TargetGUID := FDMemtableMain.FieldByName('GGUID').AsGUID;
    lHistoryView.Show;
  end;
  lHistoryView.Show;
  lHistoryView.BringToFront;
end;
Wenn ich das Free über ein Try Finally machen, verschwindet die Form logischerweise sofort wieder. Wenn ich Release in der Form selbst bei on hide aufrufe, dann bekommt findComponent nichts davon mit, die Form existiert also dann wahrscheinlich noch. Deshalb meine Frage wie geht das richtig? ShowModal ist keine Lösung, das Fenster soll über mehrfache Instanzen geöffnet werden können.

Uwe Raabe 26. Okt 2021 13:57

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Da du bei THistory.Create das Self als Owner übergibst, sorgt dieses Self auch für die Freigabe.

fisipjm 26. Okt 2021 14:07

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Okay, also spätestens wenn ich die Form mit der Stringgrid schließe werden mir alle anderen Formen auch freigegeben, macht Sinn.

Jetzt sagen wir mal ich hätte das gern früher, weil die Subform wahnsinnig viel RAM schluckt und die Benutzer immer 1000 instanzen davon öffnen. Wie würde man das lösen?

BerndS 26. Okt 2021 14:13

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Delphi-Quellcode:
procedure THistory.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

fisipjm 26. Okt 2021 14:51

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Zitat:

Zitat von BerndS (Beitrag 1496632)
Delphi-Quellcode:
procedure THistory.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

:oops: das war ja super einfach. Hast du noch ein bisschen Hilfe zur Selbsthilfe für mich. Ich such mir gefühlt den Wolf und komm auf sowas einfaches nicht.
Wie wäre dein Vorgehen um an diese Info zu kommen? Ich will ja nicht jedes mal die Leute hier bemühen.:oops:

Uwe Raabe 26. Okt 2021 15:03

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Zitat:

Zitat von fisipjm (Beitrag 1496631)
Jetzt sagen wir mal ich hätte das gern früher

Wann genau früher?

Uwe Raabe 26. Okt 2021 15:07

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Zitat:

Zitat von fisipjm (Beitrag 1496628)
Wenn ich Release in der Form selbst bei on hide aufrufe, dann bekommt findComponent nichts davon mit, die Form existiert also dann wahrscheinlich noch.

Wieso sollte das nichts davon mitbekommen? Wenn eine Komponente, deren Owner ich bin, freigegeben wird, bekomme ich das mit und entferne meine Referenzen darauf. Der direkte Aufruf von Release om FormHide ist aber nicht so der Hit. Der Ansatz mit caFree im FormClose ist deutlich besser.

BerndS 26. Okt 2021 15:15

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Schwer zu sagen, wenn ich etwas suche dann meist zuerst g**gle oder direkt hier im Forum.

Z.B. suche per G**gle nach delphi form free findet gleich einen passenden Thread hier im Forum.

Sonst schaue ich gerne in die Quellen von Delphi oder die der gekauften Komponenten.
Zu den Propertys und Events bekommt man per F1 meist auch eine gute Hilfe.

Blup 26. Okt 2021 19:03

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Achtung caFree nicht in Formularen einsetzen die mit ShowModal aufgerufen werden.
Das kann schon Zugriffsverletzungen beim Schließen des Formulars noch vor dem Verlassen der Methode ShowModal geben.
Nach Showmodal sollte man das Fenster selbst freigeben.

himitsu 27. Okt 2021 16:16

AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
 
Man kann sich sogar ins Notivy reinhängen und bekommt dann mit, wenn Childs verschinden, deren Owner man ist/war.


Und im ComponentState (glaub ich) gab es doch ein csModal ... wenn das aktiv ist, dann macht man :=caFree einfach nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz