Zmienne dynamiczne w dwoch procedurach - Delphi

0

Witam, mam następujący problem. W jednej procedurze tworze dynamicznie obiekty typu TLabel i nadaje im nazwy : Prostokat1,Prostokat2 ... Prostokat10 oraz ustawiam Visible:=true . Do tego momętu wszystko jest ok (prostokąty wyświetlają się na formie), lecz gdy w innej procedurze chcę np. Prostokat1 ustawić na niewidoczny (Visible:=false) kompilator nie wykrywa mi nazwy tego obiektu. Jak rozwiązać ten problem zważywszy na to, że obie instrukcje muszą być w zupełnie innych procedurach (pierwsza należy do Form1, druga do innego watku).

0

Pewnie chodzi Ci o with Form1 do begin {kod} end; - o ile Form1 to TForm1 zadeklarowane w tym samym unicie.

0

Pomijając szczegóły kod wygląda mniej więcej tak:


procedure TForm1.level1;
  {dynamiczne twoczenie obiektow - bloczkow}
  var
  i,n,z,j: integer;
 begin
  n:=8;
  z:=10;
   for j:=1 to 13 do
    begin
    for i:=1 to n do
        with TLabel.Create(self) do
         begin
            Name:='Cegla'+IntToStr(j)+IntToStr(i);
            Color:=clGreen;
            Width:=40;
            Height:=20;
            Left:=z;
            Top:=i*(Height);
            Caption:='Cegla'+IntToStr(j)+IntToStr(i);
            Font.Color:=clBlack;
            Parent:=self;
            Visible:=True;
         end;

    z:=z+50;
    end;
 end;

{tutaj reszta procedur}

procedure procedura2.Ruch;  {Ruch - procedura nalezaca do watku Moj_Watek}
  begin

with Form1 do
 begin
if .... then 
....
if .... then 
....
if .... then 
....
if .... then 
....

if ... then   // **kluczowa dla mnie sprawa nie wykrywa Cegla12 **
begin
 Cegla12.Visible:=false;
 end;
end;
end;
 

Jakieś pomysły ?

0

A czy Cegla12 na pewno jest elementem klasy TForm1 zadeklarowanej w sekcji public lub private? Bo jeżeli tak to musi działać. Ewentualnie wklej jak i gdzie deklarujesz swoje zmienne. A i taką ilośc komponentów lepiej najlepiej przechowywać w Tablicy albo w TList albo w TObjectList.

0

Odpowiadając na twoje pytanie to Cegla12 nie jest elementem tej klasy, gdyż jest tworzona dynamicznie (jak widać w kodzie u góry), ale procedura, w której jest tworzona czyli level1 jest już elementem tej klasy. Na dole umieszczam deklarację klasy.

type
  TForm1 = class(TForm)
   

{jakieś procedury, obiekty itp.}

  private
    { Private declarations }
  public
   procedure level1; //procedura, w ktorej dynamicznie tworze komponenty typy Label
    { Public declarations }
  end;

 
0

Do tak utworzonego komponentu można się odwołać:

Form1.Caption:= (Form1.FindComponent('Ceglal12') as TLabel).Caption;

co jest logiczne, bo Cegla12 nie jest elementem zadeklarowanym jawnie w TForm1.

0

Oczywiście przy takim tworzeniu komponentów kompilator nie ma pojęcia co to jest Cegla12. Ale FindComponent powinien sobie z tym poradzić.
(trochę się spóźniłem)

0

A jak zrobić, by komponent znikał. W deklaracji :

 Cegla12.Visible:=false;

nadal nie wykrywa. Domyślam się, że trzeba użyć funkcji podanej na górze, tylko jak to zrobić ?

0

No bez przesady Panie Programisto, skoro masz podane jak zmienić Caption to co za problem z inymi właściwościami:

procedure JakasProcedura;
var MyLabel: TLabel;
begin
 MyLabel:= Form1.FindComponent('Ceglal12') as TLabel;
 If MyLabel <> nil then
    MyLabel.Visible:= False;
end;
0

Dzięki wielkie, wszystko śmiga, aż miło.

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