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;