Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 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