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).
Pewnie chodzi Ci o with Form1 do begin {kod} end;
- o ile Form1 to TForm1 zadeklarowane w tym samym unicie.
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 ?
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.
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;
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.
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)
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ć ?
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;
Dzięki wielkie, wszystko śmiga, aż miło.