Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Objekt ohne genauen namen aufrufen?


pyto - Mo 05.04.10 18:59
Titel: Objekt ohne genauen namen aufrufen?
Hallo,

Ich bin am verzweifeln. Niemand hatte scheinbar jemals dieses Problem. Internet ist leer.

Angenommen ich habe 13567289 Buttons in meiner Form und Jeder Button hat einen Namen der sich aus 'Button' und seiner Nummer zusammensetzt, und ich will nun mit einer For-Schleife einen Button ansprechen der die Nummer von i hat (I ist die schleifenvariable) , und ich ja nicht für jedes i schreiben kann:


Delphi-Quelltext
1:
if i= [1,2,3,usw] then button[1,2,3,usw].irgendwas:=irgendwas;                    


(bei 13567289 Buttons wäre das sehr viel arbeit), suche ich eine syntax im format


Quelltext
1:
Nmensteil1 + Namesnteil 2 + Variable + Variable                    


oder so ähnlich ...

Würde mich sehr freuen wenn jemand so einen code hat.

falls jemand meint das das nicht geht, so poste er das bitte auch hier... ich warte sonst ja ewig :? :) :roll:

Vielen Dank


Gausi - Mo 05.04.10 19:02

Hallo und :welcome: in der Entwickler-Ecke,

Schau dir mal FindComponent an. Damit sollte das in einer Schleife gehen. :D


pyto - Di 06.04.10 08:14

Danke für den tipp,
ich probiers mal... 8) :idea:


pyto - Mi 07.04.10 09:22

user profile iconpyto hat folgendes geschrieben Zum zitierten Posting springen:
Danke für den tipp,
ich probiers mal... 8) :idea:


Hat geklappt... :!: :idea: :lol: :wink:


Xion - Mi 07.04.10 09:54

Du könntest die Buttons auch als Array machen, was wohl auch beim Form erstellen einfacher wäre:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
Buttons: array of TButton;
...
SetLength(Buttons,1234567); //=1234567 Buttons
for A:= 0 to High(Buttons) do
  begin
    Buttons[A]:=TButton.Create(Form1);
    Buttons[A].Parent:=Form1;
    Buttons[A].Left:=A*10;
    Buttons[A].Top:=0;
    Buttons[A].Width:=10;
    Buttons[A].Height:=10;
    Buttons[A].Tag:=A; //damit kannst du dann auch vom Button rausfinden, welches Element des Arrays er ist
    Buttons[A].Caption:=inttostr(A);
    Buttons[A].OnClick:=AllButtonsOnClick;
  end;


Das ansprechen wäre dann sehr einfach

Delphi-Quelltext
1:
Buttons[4].Caption:='x';                    

oder

Delphi-Quelltext
1:
2:
for A:= 0 to 25 do
  Buttons[4].Caption:='y';


und wenn du z.B. den Sender aus ner OnClick kriegst:

Delphi-Quelltext
1:
2:
if (Sender is TButton) then
  id:=TButton(Sender).Tag


Tilo - Mi 07.04.10 13:07

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
oder

Delphi-Quelltext
1:
2:
for A:= 0 to 25 do
  Buttons[4].Caption:='y';



Da war sicherlich folgendes gemeint:

Delphi-Quelltext
1:
2:
for A:= 0 to 25 do
  Buttons[A].Caption:='y';


Entschuldigung für die Besserwisserei,
Ich freue mich wenn ich auch mal was konstruktives so kurz nach dem Mittag posten kann.


Tropby - Mi 07.04.10 13:38


Delphi-Quelltext
1:
Nmensteil1 + Namesnteil 2 + Variable + Variable                    


Wenn du das so in der Art machen möchtest hätte ich noch folgende lösung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function TForm1.GetComponentByName(Name : String) : TComponent;
var
  I : Integer;
begin
  Result := nil;
  for I := 0 to Form1.ComponentCount - 1 do
    if Form1.Components[I].Name = Name then
      Result := Form1.Components[I];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TPanel(GetComponentByName(Edit1.Text)).Caption := '####';
end;


Narses - Mi 07.04.10 13:49

Moin!

Dann aber bitte Resourcen-schonender und etwas allgemeiner: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function GetComponentByName(AForm: TForm; const AName: String): TComponent;
  var
    i: Integer;
begin
  for i := 0 to AForm.ComponentCount -1 do begin
    Result := AForm.Components[i];
    if (Result.Name = AName) then
      Exit;
  end;
  Result := NIL;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TPanel(GetComponentByName(Self,Edit1.Text)).Caption := '####';
end;
cu
Narses