Dynamiczne kontrolki "piramidka"

0

Witam
Dziś jak zawsze nietypowy kłopot mianowicie tworze dynamicznie kontrolki jedna na drugiej różnych typów i mam kłopot z odwołaniem się do nazwy kontrolki poprzedniej ponieważ przy uruchamianiu programu kompilator zwraca mi błąd związany z brakiem kontrolki niższej ponieważ wówczas ona jeszcze nie istnieje.

 with TPanel.Create(self) do begin
            Width:=50;
            Height:=50;
            Left:=50;
            top:=50;
            Parent:=self;
            Visible:=True;
            Name:='Panel1';
            Caption:=' ';
            end;

  with TLabel.Create(self.FindComponent('Panel1')) do begin
            Left:=65;
            top:=65;
            Visible:=True;
            Parent:=self.Panel1;
            Name:='nazwa_labela';
            Caption:='napis';
            end;

Kombinowałem i wpadłem na pomysł, żeby zamiast Parent:=self.Panel1 wpisać Parent:=self.FindComponent('Panel1').name; jednak dostaję komunikat o niezgodności typów. Zna ktoś sposób na rozwiązanie tego problemu?

0

Chyba chodzi Tobie o coś takiego jak poniżej. A i przecież FindComponent znajduje komponent o podanym polu Name,
wystarczyło w google zobaczyć po przykładach jak ta funkcja działa. Także nie wiem coś Ty wymyślił z jakimś ...Name
jeszcze, po prostu rzutujesz na dany typ obiektu i używasz FindComponent, toć to są "banalne banalności" i podstawy.

  with TPanel.Create(Self) do
  begin
    Width := 250;
    Height := 250;
    Left := 50;
    top := 50;
    Parent := Self;
    Visible := True;
    Name := 'Panel1';
    Caption := ' ';
  end;
  with TLabel.Create(Self.FindComponent('Panel1')) do
  begin
    Left := 65;
    top := 65;
    Visible := True;
    Parent := TPanel(Self.FindComponent('Panel1'));
    Name := 'nazwa_labela';
    Caption := 'napis';
  end;
0

:=findcontrol('nazwa'); //albo coś w ten deseń

odwołujesz się do nazwy, której wcześniej nigdzie pewnie nie zadeklarowałeś. Delphi nie jest takie naiwne, i nawet nie raczy podjąć próby kompilacji.

//edit
No i masz, Olesio był szybszy:)

0

Tak Olesio masz rację kombinowałem z opcją self dokładnie w odwrotną stronę na zasadzie
self. ... a powinno być TPanel(self. ....)

Dziękuję już w programie poprawiłem i działa.

0

Chyba nie trzeba aż tak kombinować i dać wszędzie self jako parent (czyli parent=form). Czyżbyś tworzył i zwalniał te kontrolki setki razy przed zamknięciem okna?

0

Ja to robię tak:

 label:=TLabel.CreatE(nil);
 label.Parent:=Self;

i wtedy mam tego labela w Components[]. On nie ma, nie musi i nawet nie powinien mieć żadnej nazwy. Wystarczy zmienna label.

A potem gdzies na końcu
label.Free;

Można też TLabel.Create(Self) ale tu miewałem problemy, bo automatyka mi się parę razy pogryzła. Generalna zasada - tworzysz ręcznie, to zwalniasz ręcznie.

0

God damn.
Jeszcze raz zobaczę taki temat i mnie szlag trafi.

NIE TWORZYĆ OBIEKTÓW Z UŻYCIEM WITH

A po drugie są tablice, są listy, są listy obiektów, itp, które po coś są jednak i należy je wykorzystywać.

0

"NIE TWORZYĆ OBIEKTÓW Z UŻYCIEM WITH" -> niby czemu?
W docach masz typowe przykłady

with TForm.Create(nil) do
 try
  ShowModal;
 finally
 Free;
 end

i co w tym złego?

Natomiast
TLabel.Create(Self.FindComponent('Panel1')
to szczyt głupoty, z uwagi na ownera, którego nie powinno być, a nawet jeśli, to na pewno nie tak znajdowany. I to Self też po co.

1 użytkowników online, w tym zalogowanych: 0, gości: 1