Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamisch Erzeugte Frames finden (https://www.delphipraxis.net/201173-dynamisch-erzeugte-frames-finden.html)

jacky213 28. Jun 2019 22:13

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?

hoika 29. Jun 2019 06:22

AW: Dynamisch Erzeugte Frames finden
 
Hallo,
da du die Frames selber erzeugst,
pack die in eine Liste (TList) zum Suchen.

haentschman 29. Jun 2019 07:15

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:

Schokohase 29. Jun 2019 07:59

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von haentschman (Beitrag 1435591)
ist die Liste der Eigentümer

Dabei sollte man aber beachten, dass alle Controls, denen man einen Parent zuweist auch schon einen Eigentümer haben. Wird dieser Parent jetzt aus dem Speicher geworfen dann nimmt der alle seine Kinder mit und in der schönen Liste stehen ungültige Referenzen und es rummst beim Versuch diese zu löschen.

Also auch hier aufpassen.

Uwe Raabe 29. Jun 2019 08:14

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von Schokohase (Beitrag 1435593)
und in der schönen Liste stehen ungültige Referenzen und es rummst beim Versuch diese zu löschen.

In System.Generics.Collection vermisse ich eine
Delphi-Quellcode:
TComponentList<TComponent>
als Pendant zu der alten
Delphi-Quellcode:
TComponentList
in System.Contnrs. Dort brauchte man sich auch darum nicht kümmern.

dummzeuch 29. Jun 2019 08:21

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von Schokohase (Beitrag 1435593)
Zitat:

Zitat von haentschman (Beitrag 1435591)
ist die Liste der Eigentümer

Dabei sollte man aber beachten, dass alle Controls, denen man einen Parent zuweist auch schon einen Eigentümer haben. Wird dieser Parent jetzt aus dem Speicher geworfen dann nimmt der alle seine Kinder mit und in der schönen Liste stehen ungültige Referenzen und es rummst beim Versuch diese zu löschen.

Also auch hier aufpassen.

EDIT: Folgendes stimmte nicht:
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.

Schokohase 29. Jun 2019 08:37

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von dummzeuch (Beitrag 1435595)
Das ist falsch, Du verwechselst hier "Owner" und "Parent". Der Parent gibt nichts frei, nur der Owner.

Aha, tu ich das?

Was sagt die Doku dazu?

http://docwiki.embarcadero.com/Libra...Control.Parent

Zitat:

Anmerkung: Die in
Delphi-Quellcode:
TControl
deklarierte Eigenschaft
Delphi-Quellcode:
Parent
ähnelt der Eigenschaft
Delphi-Quellcode:
Owner
von
Delphi-Quellcode:
TComponent
darin, dass die hier angegebenen Objekte für das Freigeben des Steuerelements zuständig sind.
Gut, die VCL ist ja auch Neuland, das kann man nicht wissen

dummzeuch 29. Jun 2019 08:37

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von jacky213 (Beitrag 1435587)
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.

Einfache Antwort: Gib dem Frame einen eindeutigen Namen, dann funktioniert FindComponent auch damit.

Kompliziertere Antwort:

Das kommt darauf an, wie Du sie erzeugst. Z.B.:
Delphi-Quellcode:
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;
Um den Frame dann zu finden kann man folgenden Code nehmen:
Delphi-Quellcode:
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;
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:

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;

dummzeuch 29. Jun 2019 08:51

AW: Dynamisch Erzeugte Frames finden
 
Zitat:

Zitat von Schokohase (Beitrag 1435597)
Zitat:

Zitat von dummzeuch (Beitrag 1435595)
Das ist falsch, Du verwechselst hier "Owner" und "Parent". Der Parent gibt nichts frei, nur der Owner.

Aha, tu ich das?

Was sagt die Doku dazu?

http://docwiki.embarcadero.com/Libra...Control.Parent

Zitat:

Anmerkung: Die in
Delphi-Quellcode:
TControl
deklarierte Eigenschaft
Delphi-Quellcode:
Parent
ähnelt der Eigenschaft
Delphi-Quellcode:
Owner
von
Delphi-Quellcode:
TComponent
darin, dass die hier angegebenen Objekte für das Freigeben des Steuerelements zuständig sind.


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:
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;
Gut, dass ich keine Wette drauf abgeschlossen habe.

[Weitere Bemerkung gelöscht.]

jacky213 29. Jun 2019 09:00

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr.
Seite 1 von 2  1 2      

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