Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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 TForm Freigeben (https://www.delphipraxis.net/119935-tform-freigeben.html)

Pro_RJ 3. Sep 2008 21:13

Re: TForm Freigeben
 
Vielen dank
ich schaue mal ob ich die idee bei mir einbasteln kann. ich geb dir nochmal info.
Danke aber schonmal für die ideeen

Pro_RJ 5. Sep 2008 08:03

Re: TForm Freigeben
 
Also ich habs jetzt mal bei mir Implementiert:
Ich habe
1. Alle Referenzen (Form1 : TForm1) rausgeschmissen.
2. eine Objectlist erstellt wo ich im Constructor von TMeinForm das neu erzeugte Fenster eintrage und im Destuctor aus dieser Liste wieder rausschmeiße.
3. Jedes DFenster hat eine eindeutige Nummer bekommen, welche ich in dem Object Speichere.
4. Es gibt nur noch eine Function, die mir an Hand der FensterNr das Object oder Nil zurück gibt.
damit ist sichergestellt das keinerlei Referenzen hängen bleiben können.
Einziger nachteil, Wenn ich auf Form1 zugreifen will muss ich jetzt immer TForm1(Fenster(123)) schreiben aber das ist ok.

sirius 5. Sep 2008 08:11

Re: TForm Freigeben
 
Den kleinen Nachteil könnte man jetzt auch noch umgehe,n indem man von der ComponentList eine eigene Liste ableitet, die nach außen hin mit TForm arbeitet. Aber da dürfte der Aufwand höher sein. Ich mach das nur ganz selten und meist, wenn ich sowieso die Listenklasse umschreiben muss.

Sko 10. Aug 2009 07:47

Re: TForm Freigeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
*altenThreadausgrab*

Das gleiche Thema mit dem Freigeben dynamisch erzeugter Forms hatte ich jetzt auch in meinem aktuellen Projekt.

Zitat:

Zitat von sirius
Den kleinen Nachteil könnte man jetzt auch noch umgehe,n indem man von der ComponentList eine eigene Liste ableitet, die nach außen hin mit TForm arbeitet. Aber da dürfte der Aufwand höher sein. Ich mach das nur ganz selten und meist, wenn ich sowieso die Listenklasse umschreiben muss.

Genau das hab ich dafür mal gemacht. In den Anhang hab ich die Unit gepackt, Verbesserungsvorschläge seh ich gerne, so oft hab ich noch keine neuen Klassen von anderen abgeleitet.

Ich hab die Klasse TDynamicFormManager von TObjectList abgeleitet und die Funktionen implementiert die ich brauchte:
  • der DynamicFormManager wird im OnCreate der Anwendung erzeugt und im OnClose wieder freigegeben
  • Forms werden normal erzeugt und mit AddForm() dem FormManager hinzugefügt, Beispiel:
    Delphi-Quellcode:
    procedure TMainForm.BBlubbClick(Sender: TObject);
    var
      AnyForm: TAnyForm;
    begin
      AnyForm := TAnyForm.Create(nil);
      <machwasmitAnyform>;
      DynFormManager.AddForm(AnyForm);
    end;
    AddForm setzt die Tag-Eigenschaft des Fensters auf einen einmaligen Wert (interner Zähler, wird bei jedem Aufruf der Funktion erhöht)
  • die Forms werden mit DeleteFormByInternalIndex() freigegeben. Dazu wird der Funktion einfach der Tag des Fensters übergeben.
  • in meinem Projekt hab ich zwei Arten von dynamischen Forms: welche die nur einmal aufgerufen werden sollen, und welche die mehrmals (mit unterschiedlichen Inhalten) aufgerufen werden können.
    Ob die Form bereits existiert kann im ersten Fall durch GetFormByClassName() und im zweiten Fall durch GetFormByName() geprüft werden. Komplett sieht das bei mir so aus:
    Delphi-Quellcode:
    procedure TMainForm.BBlubbClick(Sender: TObject);
    var
      AnyForm: TAnyForm;
    begin
      AnyForm := TAnyForm(DynFormManager.GetFormByClassName('TAnyForm')); // oder z. B. AnyForm := TAnyForm(DynFormManager.GetFormByName('AnyForm1')); wenn mehrere Forms der Klasse TAnyForm möglich sein sollen
      if Assigned(AnyForm) then
      begin
        AnyForm.Show;
        AnyForm.BringToFront;
      end
      else
      begin
        AnyForm:= TAnyForm.Create(nil);
        <machwasmitAnyForm>
        DynFormManager.AddForm(AnyForm);
        AnyForm.Show;
      end;
    end;
Den Tag der Form als Eigenschaft zur eindeutigen Identifikation der Form zu verwenden hat den Vorteil das man mit TForm arbeiten kann und nicht noch ne Klasse von TForm ableiten muss. Wenn man natürlich den Tag anderweitig verwendet, funktioniert das nicht mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 4 von 4   « Erste     234   

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