![]() |
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:
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.
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; |
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.
|
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? |
AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
Delphi-Quellcode:
procedure THistory.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := TCloseAction.caFree; end; |
AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
Zitat:
Wie wäre dein Vorgehen um an diese Info zu kommen? Ich will ja nicht jedes mal die Leute hier bemühen.:oops: |
AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
Zitat:
|
AW: Verständnissfrage zum Freigeben einer dynamisch erzeugten Form
Zitat:
|
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. |
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. |
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