![]() |
Re: TForm Freigeben
Die Fenster werden Manuell(Über einen Beenden Button aufgerufen (Methode close)) über das "X oben Rechts" bzw. manchmal auch automatisch aus einer Aktion.
ABetr immer im Fenster selber. extrem selten das ein Fenster mal von einem anderen Fenster gesteuert wird. Gibt es eine möglichkeit abzuprüfen oder der wert noch gültig ist? if not Gültig(Form1) then Form1 := TForm1.Create; |
Re: TForm Freigeben
Du köntest ein spezielles Feld in die Klasse einbauen, dass du in einem try-except-Block abfragst. Aber 100% sicher und auch schön ist es nicht.
Wie wär es mit einem Ereignis, was ausgelöst wird, und die Referenz auf nil setzt? |
Re: TForm Freigeben
das Problem ist, das die Klasse die Referenzen nicht kennt.
Bsp: Ich weiß nicht,wer weiß wo ich Wohne. Und da bringt mir das Feld leider auch nichts, da es das ja auch nicht mehr gibt. |
Re: TForm Freigeben
Ich verstehe deinen Code nicht. Wieviele Referenzen erwartest du denn und warum?
|
Re: TForm Freigeben
Grundsätzlich erwarte ich nur eine Referenz.
|
Re: TForm Freigeben
Na dann brauchts du doch auch nur die auf Null setzen:
Concept-MainForm:
Delphi-Quellcode:
Form2:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } Form2:TForm2; //hier ist die wichtige Reference procedure DoClearReference; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if assigned(Form2) then Form2.BringToFront else begin Form2:=TForm2.Create(nil); Form2.clearReference:=DoClearReference; Form2.Show; end; end; procedure TForm1.DoClearReference; begin Form2:=nil; end;
Delphi-Quellcode:
type
TForm2 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); public ClearReference:procedure of object; end; implementation {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin if assigned(clearReference) then ClearReference; end; end. |
Re: TForm Freigeben
die Idee ist an sich nicht verkehrt.
Das Problem ist, das ist bei 150 Fenster weder überschaubar noch pflegbar. Deswegen würde ich das ja gerne Automatisieren, bzw. dafür sorgen, das sich das ganze selber überwacht |
Re: TForm Freigeben
Wie jetzt? Wenn du 150 Fenster hast, müsstest du ja auch 150 Referenzen haben. Dann baust du sie halt in einer Liste, oder so.
|
Re: TForm Freigeben
ja klar ein Referenz pro Fenster.
Wie kann ich diese Referenzen in einer liste speichern? |
Re: TForm Freigeben
Vielleicht wie folgt:
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; SpinEdit1: TSpinEdit; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FForms:TComponentList; procedure DoClearReference(aFensterNr:Integer); procedure AddForm(aForm:TMeinForm); function ExistsForm(aFensterNr:Integer):boolean; function GetForm(aFensterNr:Integer):TMeinForm; procedure ClearForm(aFensterNr:Integer); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MeinForm:TMeinForm; begin if ExistsForm(SpinEdit1.Value) then GetForm(SpinEdit1.Value).BringToFront else begin MeinForm:=TMeinform.Create(self); MeinForm.ClearReference:=doClearReference; MeinForm.Fensternr:=SpinEdit1.Value; AddForm(MeinForm); MeinForm.Show; end; end; procedure TForm1.DoClearReference(aFensterNr:Integer); begin ClearForm(aFensterNr); end; procedure TForm1.FormDestroy(Sender: TObject); begin FForms.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin FForms:=TComponentList.Create(false); end; procedure TForm1.AddForm(aForm: TMeinForm); begin FForms.Add(aForm); end; procedure TForm1.ClearForm(aFensterNr: Integer); var i:integer; begin for i:=FForms.count-1 downto 0 do if (FForms[i] as TMeinForm).Fensternr=aFensterNr then FForms.Delete(i); end; function TForm1.ExistsForm(aFensterNr: Integer): boolean; begin result:=GetForm(aFensterNr)<>nil; end; function TForm1.GetForm(aFensterNr: Integer): TMeinForm; var i:integer; begin result:=nil; for i:=0 to FForms.Count-1 do begin result:=(FForms[i] as TMeinForm); if result.Fensternr=aFensterNr then break; result:=nil; end; end;
Delphi-Quellcode:
Ob man die Listenverwaltung nochmal einzeln kapselt wäre sicher angebracht. Ich wollte es jetzt nicht zu umständlich/speziell machen.
type
TMeinForm = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); public Fensternr : Integer; //habe ich mal als Erkennung von gleichen Fenstern genommen ClearReference:procedure(aFensterNr:Integer) of object; end; implementation {$R *.dfm} procedure TMeinForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if assigned(clearReference) then ClearReference(FensterNr); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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 by Thomas Breitkreuz