Dynamiczne tworzenie komponentow i wspolne nadawanie im wlas

0

var
led1 : TLEDLabel;
ping1 : TPing;
begin
led1 := TLEDLabel.Create(Form1);
led1.Parent := Form1; // Przypisanie rodzica
led1.Caption := 'Przycisk 1';
led1.Left := 100;
led1.Top := 100;

ping1 := TPing.Create(Form1);
ping1.Address := '192.168.0.1';
end;

To jest to co mam obecnie :-) A chcialbym zeby tworzylo mi sie np 10 komponentow (jak juz program dziala oczywiscie ;-) ) i do kazdego przypisana byla procedura:
procedure TForm1.Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
begin
if Error = 0 then begin led1.Lit := True;
led1.Color := lcRed;
end else begin
led1.Color := lcGreen;
led1.Lit := True
end;
end;

Problem jest taki, ze nie chce pisac 10 razy (czy moze 100) tej procedury, tylko chcialbym zeby bylo cos na zasadzie led(x).color czy procedure TForm1.Ping(x)EchoReply... gdzie x bedzie wyznaczala petla. Czy moglby mi ktos fragment jakiegos kodziku przydatnego w tym problemie przedstawic ??

0

Czy te komponenty maja byc tworzone dynamicznie w trakcie dzialania programu?
Bo jak tak to nie da rady stworzyc nowej procedury obslugi do kazdego nowego komponentu, mozna tylko przypisac jakas istniejaca.

0

pewnie zle zrozumialem ten problem, ale.. :D
[code]procedure Prop(var JakasDana: JakisTyp) ;
begin
JakasDana.X = 10 ;
end ;
[/code]
Teraz tylko potrzebujesz stworzyc tabliczke:
[code]Tabliczka: array[1..n] of JakisTyp ;[/code]
gdzie elementami sa obiekty takie jak JakasDana ;] no i tym samym masz ponumerowane wszystkie obiekty i sie mozesz do nich dowolnie odwolywac :D Jesli Cie to nie satysfakcjonuje to mozesz sobie tworzyc 'takie jak chcesz dlugie' Tablice dynamiczne za pomoca SetLength() ;

0

WYJASNIENIE
Wytlumacze jeszcze raz o co chodzi (na innym przykladzie).
Powiedzmy Form1, ktory wczytuje z pliku podczas uruchomiania jakas x : Integer (to jeszcze umiem ;-) ).
I chodzi o to, zeby tworzylo sie powiedzmy tyle buttonow (albo innych komponentow) ile wynosi x, przy czym zeby po kliknieciu na utworzony komponent pojawial sie np ShowMessage, ale z innym tekstem dla kazdego komponentu.

Z gory dzieki wielkie za pomoc. Jezeli ktos jeszcze dokladnie nie wie o co chodzi albo tez ma taki problem to GG: 1454813

0

[code]
For I:=0 To X-1 Do With TButton.Create(Form1) Do
Begin
Caption:='';
Visible:=True;
Parent:=Form1;
OnClick:=DynButtClick;
Tag:=I;
End;

{....}

Procedure TForm1.DynButtClick;
Begin
Case TComponent(Sender).Tag of
0:ShowMessage('Button 0');
1:ShowMessage('Button 1');
{...}
End;
End;
[/code]

0

Byłoby ok tylko że tag umożliwia numerowanie max 256 komponentow bo jest wielkosci bajta.

Aby mozna było więcej stworz własny komponent np

type
TNowyButton = class (TButton)
protected //lub private zalecam
fNowyTag: Integer;
public
constructor Create (AOwner: TComponent); override;
published
property NowyTag: Integer read fNowyTag write fNowyTag default 0 stored True; //standardowo wartosc 0 i wartosc ma byc przechowywana w pliku (bodajze) dfm
end;

implementation

constructor TNowyButton.Create(AOnwer: TComponent)
begin
inherited;
fNowyTag := 0; //inicjalizowanie property defaultowego jest rownierz konieczne
end;

Tym sposobem dysponujesz tagiem ktory umozliwia liczby nznacznie większe oczywiscie typ integer mozna zastapic dowolnym np word

0

type
TForm1 = clasS(TForm)
...
...
public:
Leds: array of TLedLabel;
Pings: array of TPing;
end;

procedure TForm1.TworzKomponenty(ile: integer);
var
i: Integer;
begin
SetLength(Leds, ile);
SetLength(Pings, ile);
for i:=0 to ile - 1 do begin
Leds[i]:=TLedLabel.Create(Form).
...
...
end
end;

Odowłujesz się: Leds[i] lub Pings[i]

0

I jeszcze nie zapomnij o zwolnieniu (Free) w OnClose formy

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