AGB  ·  Datenschutz  ·  Impressum  







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

Dynamisch Erzeugte Frames finden

Ein Thema von jacky213 · begonnen am 28. Jun 2019 · letzter Beitrag vom 29. Jun 2019
Antwort Antwort
Seite 1 von 2  1 2      
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#1

Dynamisch Erzeugte Frames finden

  Alt 28. Jun 2019, 23:13
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?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 07:22
Hallo,
da du die Frames selber erzeugst,
pack die in eine Liste (TList) zum Suchen.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 08:15
Moin...

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)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 08:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 09:14
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 TComponentList<TComponent> als Pendant zu der alten TComponentList in System.Contnrs. Dort brauchte man sich auch darum nicht kümmern.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 09:21
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.
Thomas Mueller

Geändert von dummzeuch (29. Jun 2019 um 10:02 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 09:37
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 TControl deklarierte Eigenschaft Parent ähnelt der Eigenschaft Owner von 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
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 09:37
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 = 'SomeMeaningfulNamethen
        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;
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 09:51
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 TControl deklarierte Eigenschaft Parent ähnelt der Eigenschaft Owner von 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.]
Thomas Mueller

Geändert von dummzeuch (29. Jun 2019 um 10:01 Uhr)
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#10

AW: Dynamisch Erzeugte Frames finden

  Alt 29. Jun 2019, 10:00
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:52 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