![]() |
Dynamisch Erzeugte Frames finden
Moin Jungs und Mädels,
wie findet man Dynamisch erzeugte Frames auf einer Form? im Normalfall mache ich das mit for i := 0 to FindComponent... und sofern ich den Frame über Delphi auf die Form lege funktioniert das auch. Allerdings nicht mehr sobald ich den Frame Dynamisch zur Laufzeit auf der Hauptform erzeuge. Irgendwelche Ideen? |
AW: Dynamisch Erzeugte Frames finden
Hallo,
da du die Frames selber erzeugst, pack die in eine Liste (TList) zum Suchen. |
AW: Dynamisch Erzeugte Frames finden
Moin...8-)
Dann aber lieber die TObjectList<TFrame>. Wenn die Frames mit .Create(nil) erzeugt werden und in die Liste eingetragen werden, ist die Liste der Eigentümer. Dann kannst du den Frame wegwerfen und damit den Speicher freigeben. (ObjectList.Delete) :thumb: |
AW: Dynamisch Erzeugte Frames finden
Zitat:
Also auch hier aufpassen. |
AW: Dynamisch Erzeugte Frames finden
Zitat:
Delphi-Quellcode:
als Pendant zu der alten
TComponentList<TComponent>
Delphi-Quellcode:
in System.Contnrs. Dort brauchte man sich auch darum nicht kümmern.
TComponentList
|
AW: Dynamisch Erzeugte Frames finden
Zitat:
Das ist falsch, Du verwechselst hier "Owner" und "Parent". Der Parent gibt nichts frei, nur der Owner. Schokohase hat Recht, TWinControl.Destroy gibt alle Controls frei. Aber im Prinzip gilt: Für die Freigabe eines Objekts (auch Controls sind Objekte) sollte immer nur einer zuständig sein: * Owner (bei Components) - oder * TObjectList - oder * der eigene Code (z.B. per try ..finally Interfaces lasse ich jetzt mal außen vor, das würde nur verwirren. |
AW: Dynamisch Erzeugte Frames finden
Zitat:
Was sagt die Doku dazu? ![]() Zitat:
|
AW: Dynamisch Erzeugte Frames finden
Zitat:
Kompliziertere Antwort: Das kommt darauf an, wie Du sie erzeugst. Z.B.:
Delphi-Quellcode:
Um den Frame dann zu finden kann man folgenden Code nehmen:
procedure TMyForm.OnCreate(_Sender: TObject);
var Frame: TFrame; begin Frame := TSomeFrame.Create(Self); // ab hier steht der Frame in der Components-Liste der Form Frame.Name := 'SomeMeaningfulName'; // und jetzt hat er einen Namen, über den man ihn finden kann. Frame.Parent := Self; // jetzt steht er auch in der Controls-Liste der Form // Alternativ: // Frame.Parent := SomePanel; // Jetzt steht er in der Controls-Liste von SomePanel end;
Delphi-Quellcode:
Wenn Du aber schon von vorneherein weißt, dass Du später auf den Frame zugreifen willst, dann deklarierst Du einfach ein Field dafür:
function TMyForm.FindSomeFrame: TSomeFrame;
var i: integer; begin for i := 0 to ComponentCount - 1 do begin if Components[i] is TSomeFrame then begin // das isser! Result := TSomeFrame(Components[i]); // falls es mehrere Frames dieser Klasse gibt, auch noch den // Namen überpruefen if Result.Name = 'SomeMeaningfulName' then Exit; //==> raus end; end; // nicht gefunden? raise Exception.Create('Frame nicht gefunden'); end;
Delphi-Quellcode:
type TMyForm = class(TForm) // [...] private FSomeFrame: TSomeFrame; // [...] end; // [...] procedure TMyForm.OnCreate(_Sender: TObject); begin FSomeFrame := TSomeFrame.Create(Self); FSomeFrame.Name := 'SomeMeaningfulName'; FSomeFrame.Parent := Self; end; // diese Function kann man sich dann eigentlich schenken: function TMyForm.FindSomeFrame: TSomeFrame; begin Result := FSomeFrame; end; |
AW: Dynamisch Erzeugte Frames finden
Zitat:
Ich bin versucht, die Doku in Zweifel zu ziehen (wäre nicht das erst Mal, dass da Mist steht), aber ich werde mir gleich mal den Source dazu ansehen und es testen. OK, Du hast Recht und die Doku stimmt:
Delphi-Quellcode:
Gut, dass ich keine Wette drauf abgeschlossen habe.
destructor TWinControl.Destroy;
var I: Integer; Instance: TControl; begin // [...] I := ControlCount; while I <> 0 do begin Instance := Controls[I - 1]; Remove(Instance); Instance.Destroy; I := ControlCount; end; // [...] inherited Destroy; end; [Weitere Bemerkung gelöscht.] |
AW: Dynamisch Erzeugte Frames finden
Danke für die Antworten, ich werde mich mal schlau lesen.
Allerdings kann ich schon sagen, dass ich den dynamischen Frame schon einen Namen zugewiesen habe und dieser nach dem erzeugen auf Form 1 immer noch nicht über FindComponent Schleife zu finden ist. Kurze Zusatzfrage. Ich habe eine kleine Funktion welche den Namen des Frames zurückgeben sollte wenn ein Button (befindet sich auf dem frame) gedrückt wird. Leider gibt dieser nichts zurück.
Delphi-Quellcode:
function GetFrameName : String:
Begin Result := TFrame(self).Name; end; |
AW: Dynamisch Erzeugte Frames finden
Zitat:
|
AW: Dynamisch Erzeugte Frames finden
Zitat:
Delphi-Quellcode:
function TFormFoo.Searchcomponent(Value: TObject):TObject;
var i: integer; Finded: TComponent; begin For i := 0 to Self.ComponentCount -1 do begin if Self.Components[i].Name = Value.Name then Result := Self.Compoents[i]; end; end; Zitat:
Du solltest dies aber so erreichen können:
Delphi-Quellcode:
Statt in Searchcomponent alle Components zu durchlaufen, könntest du da auch Findkomponent aufrufen und dessen Rückgabewert auswerten. Allerdings hättest du mit Searchcomponent viel mehr Möglichkeiten. Du könntest in einem weiteren Parameter den Container angeben, der durchsucht werden soll oder in einer Liste alle Komponenten eines bestimmten Tips zurückgeben oder ...
function TFormFoo.Searchcomponent(Value: TObject):TObject;
var i: integer; [s]Finded: TComponent[/s]; begin For i := 0 to Self.ComponentCount -1 do begin if Self.Components is TFrame then begin if Self.Components[i].Name = Value.Name then Result := Self.Compoents[i]; end; end; end; function TFormFoo.GetFrameName((Value: String) : String: var Value: TFrame; Begin ComponentName := Searchcomponent(Value) Result := TFrame(self).Name; end; Gruss Delbor PS: Da ich selbst ![]() |
AW: Dynamisch Erzeugte Frames finden
Hi Uwe Raabe
Zitat:
Gruss Delbor |
AW: Dynamisch Erzeugte Frames finden
Zitat:
Aus dem Eingangspost ist aber zu erkennen, daß FindComponent eben auf die Form angewendet wird. Somit können auch nur Komponenten gefunden werden, bei denen die Form der Owner ist. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 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