[Delphi] kurze Delphi Frage

laskif

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
388
kurze frage..
Wie check ich ob ein Objekt existiert? In meinem Fall ein TPanel in dem code meint er Panel0 existiert nicht. Was ja auch richtig ist, wird ja erst erstellt...

Code:
If Assigned(Panel0) then
showmessage('läuft nicht')
else
begin
for i:=0 to 6 do
    begin
    temp:=TPanel.Create(self);
    temp.Parent:=Self;
    temp.Name:='Panel'+IntToStr(i);
    temp.left:=(10+(61*i));
    temp.top:=(10);
    temp.Width:=(60);
    yesyesjo[i]:=temp;
    yesyesjo[i].caption:=inttostr(lotto(1));
    end;
end;
 
Ein Test mit Assigned ist okay. Damit das dauerhaft klappt, musst du wenn du ein Objekt zerstörst (mit einem Aufruf von Free) diesem auch wieder nil zuweisen.
 
ja problem ist, wenn ich das so ausführen will, sagt der compiler Panel0 existiert nicht ? Also kann ich nicht compilieren....?
 
Aaah, ein Compile-Zeit-Fehler ist gemeint. :)

Panel0 ist natürlich erstmal nur eine Variable für (einen Zeiger auf) ein Objekt. Und die muss auch deklariert werden, wie Ste_Ett schon gesagt hat.

Wenn du willst, dass das Panel hinterher "Panel0" heißt, musst du das der Eigenschaft Name zuweisen.
 
laskif schrieb:
Code:
If Assigned(Panel0) then
showmessage('läuft nicht')
else
begin
for i:=0 to 6 do
    begin
    temp:=TPanel.Create(self);
    temp.Parent:=Self;
    temp.Name:='Panel'+IntToStr(i);
    temp.left:=(10+(61*i));
    temp.top:=(10);
    temp.Width:=(60);
    yesyesjo[i]:=temp;
    yesyesjo[i].caption:=inttostr(lotto(1));
    end;
end;

Ich nehme mal an, dass "yesyesjo" ein "array of TPanel" ist. :)
Dann kannst du dir den Umweg über Temp sparen und das Panel sofort im array erstellen.

Code:
// Prüfen, ob dem ersten Element im array etwas zugewiesen wurde
If Assigned(yesyesjo[0]) then
showmessage('läuft nicht')
else
begin
for i:=0 to 6 do
    begin
//**********
      yesyesjo[i] := TPanel.Create(self);
      yesyesjo[i].Parent := Self;
      yesyesjo[i].Name := 'Panel'+IntToStr(i);
      yesyesjo[i].Left := (10+(61*i));
      yesyesjo[i].Top := 10;
      yesyesjo[i].Width := 60;
//      yesyesjo[i].Height := ?
      yesyesjo[i].caption := IntToStr(lotto(1));
//**********
    end;
end;
 
Zuletzt bearbeitet:
hmm, ok danke ich muss also quasi erstmal das deklarieren bevor ich es eigentlich erstelle? Wie mach ich den sowas? Und dann ist das ja mal gar nicht mehr so dynamisch oder? (nur mal so ne zwischen Frage ;))
 
Wenn du Panels nach dem Durchlauf der Prozdur/Funktion noch erhalten bleiben sollen, musst du sie global deklarieren, d.h. ausserhalb der Prozeduren/Funktionen.

In jedem neuen Programm siehst du diesen Code:

Code:
var
  Form1: TForm1;

Das ist eine globale Deklaration für diese Unit.
Dort muss dein Array hin.

Code:
var
  Form1: TForm1;
  PanelArray: array of TPanel; // TPanel ist in ExtCtrls deklariert, ggf. mit einbinden unter "uses"

Mit "SetLength" kannst du den Array erweitern, so hast du immer einen Zeiger auf deine Klasseninstanz von TPanel und damit am Ende des Programms die Instanz wieder freigeben.

Code:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
begin
  for i := 0 to High(PanelArray) do
    PanelArray[i].Free;
  Finalize(PanelArray);
end;

Alternativ kannst du auch deine Panel beim Erstellen der form zuweisen:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
    SetLength(PanelArray, Length(PanelArray)+1);
    PanelArray[High(PanelArray)] := TPanel.Create(Self); // Self ist hier die Instanz von TForm1, also Form1
// ...

Über Form1 werden am Ende alle zugewiesenen Komponenten wieder freigegeben.


Die Länge des Array ist beliebig veränderbar, wenn du keine Länge bei der Deklaration angibst.
Du kannst die Länge dynamisch verändern.
 
super danke :)
 
Zurück
Oben