AGB  ·  Datenschutz  ·  Impressum  







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

TForm Freigeben

Ein Thema von Pro_RJ · begonnen am 3. Sep 2008 · letzter Beitrag vom 10. Aug 2009
Antwort Antwort
Seite 4 von 4   « Erste     234   
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#31

Re: TForm Freigeben

  Alt 3. Sep 2008, 22:13
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
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#32

Re: TForm Freigeben

  Alt 5. Sep 2008, 09:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#33

Re: TForm Freigeben

  Alt 5. Sep 2008, 09:11
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#34

Re: TForm Freigeben

  Alt 10. Aug 2009, 08:47
*altenThreadausgrab*

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

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.
Angehängte Dateien
Dateityp: pas udynamicformmanager_937.pas (1,7 KB, 6x aufgerufen)
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 16:35 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