Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Buttons ansprechen in einer Schleife (https://www.delphipraxis.net/9910-buttons-ansprechen-einer-schleife.html)

markon 7. Okt 2003 16:49


Buttons ansprechen in einer Schleife
 
hallo.
habe 10 normale buttons, mit den namen bt1,bt2,.. bis bt10.
Delphi-Quellcode:
for i:=1 to 10 do
  bt1.caption:= inttostr(i);
der code soll nur das problem darstellen.
ich möchte in jdem durchlauf die button.caption ändern lassen.

dachte mir so kann man es realisieren:
Delphi-Quellcode:
for i:=1 to 10 do
  bt[i].caption:= inttostr(i);
aber so funzt das nicht. da "bt" ein array oder ähnliches sein müßte.

gibt es eine möglichkeit um mein problem zu lösen?

für hilfe bin ich sehr dankbar
gruß
marcus

Christian Seehase 7. Okt 2003 17:06

Re: Buttons ansprechen in einer Schleife
 
Moin Marcus,

such' hier mal nach Hier im Forum suchenFindComponent.
Da müsstest Du einige Beispiele bekommen.

Alexander 7. Okt 2003 17:08

Re: Buttons ansprechen in einer Schleife
 
Jupp, gibt es. :mrgreen:
Entweder alle Buttons zur Laufzeit in einem Array erstellen oder aber mit einer For-SChleife mit Componetcount alle Komponenten durchgehen
also so im Prinzip:
Delphi-Quellcode:
var
  i: Integer;
begin
  for i := Application.ComponentCount - 1 downto 0 do
  begin
    if Application.Components[i].Name = 'bt' + IntToStr(i)) then
      Application.Components[i].Caption := 'was auch immer';
  end;
end;
Sonst auch noch mal FindComponent ankucken, dmait geht das wahrscheinlich sogar schneller..

markon 8. Okt 2003 09:55

Re: Buttons ansprechen in einer Schleife
 
danke erstmal eurer hilfe.
Delphi-Quellcode:
  for i := Application.ComponentCount - 1 downto 0 do
    if Application.Components[i].Name = 'bt' + IntToStr(i) then ...
funktioniert.
es werden alle objekte aufgelistet.

aber:
Delphi-Quellcode:
Application.Components[i].Caption := 'was auch immer';
funzt leider nicht.
man kann so keinen objekt etwas zuweisen. das caption oder egal was da steht funzt nicht.

jetzt mache ich den ganzen laden dynamisch. d.h. es werden nur soviele z.bsp. buttons zur laufzeit angelegt wie benötigt.

da ist schon meine nächste frage:
auch wenn man objekte zur laufzeit anlegen möchte, müssen diese ja deklariert werden.
aber wenn ich jetzt nicht wieß wieviel es werden, was soll ich da dann machen? etwa auf verdacht mal so 100 buttons deklarieren!?!?

hat jemand ne idee?

gruß
marcus

Honie 8. Okt 2003 11:54

Re: Buttons ansprechen in einer Schleife
 
Delphi-Quellcode:

Application.Components[i].Caption := 'was auch immer';
kann ja auch gar nicht funktionieren, da Caption keine Eigenschaft von TCompnent ist.
Dafür musst Du vorher den Typ casten.

Geht in etwa so:

Delphi-Quellcode:
if Application.Components[i] is TButton then
  (Application.Components[i] as TButton).Caption := 'was auch immer';
Zitat:

auch wenn man objekte zur laufzeit anlegen möchte, müssen diese ja deklariert werden.
aber wenn ich jetzt nicht wieß wieviel es werden, was soll ich da dann machen? etwa auf verdacht mal so 100 buttons deklarieren!?!?
Du brauchst doch nur eine Instanz eines TButtons. Nachdem die created wurde, kannst Du die gleiche Instanz für
den nächsten Button nehmen.

Bsp:

Delphi-Quellcode:
var
  aButton: TButton

begin
  aButton := TButton.create(self);
  with aButton do begin
    caption := '1. Button';
    top := 20;
  end;
  aButton := TButton.create(self);
  with aButton do begin
    caption := '2. Button';
    top := 50;
  end;
end;
oder sogar ganz auf die Instanz verzichten:

Delphi-Quellcode:
begin
  with TButton.create(self) do begin
    caption := '1. Button';
    top := 20;
  end;
  with TButton.create(self) do begin
    caption := '2. Button';
    top := 50;
  end;
end;
wobei diese Proceduren Methoden des Formulars sein sollten, damit self (als Owner) einen Sinn macht

Jens Schumann 8. Okt 2003 12:14

Re: Buttons ansprechen in einer Schleife
 
Hallo,
eigentlich darf es mit Application.Components gar nicht funktionieren. Da hier nur die Formulare
einer Anwendung enthalten sind.
Wenn man auf Komponenten auf einem Formular zugreifen möchten muss es eigentlich so gehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iCnt : Integer;
begin
  ListBox1.Clear;
  For iCnt:=ComponentCount - 1 downto 0 do
    ListBox1.Items.Add(Components[iCnt].Name);
end;

Alexander 8. Okt 2003 13:44

Re: Buttons ansprechen in einer Schleife
 
In Application.Components sind alle alle Komponenten gelistet, meine ich zumindest.
Aber das mit dem Caption fällt mir jetzt auch auf :oops:
Aber wie gesagt war nciht getestet... :mrgreen:
Man muss natürlich noch -wie jetzt uach schon gesagt - den Typ festlegen bzw. casten

markon 8. Okt 2003 14:02

Re: Buttons ansprechen in einer Schleife
 
dankeuch. habs rausbekommen. button's werden dynamisch angelegt. egal wieviele ich benötige. :-D

wie kann ich jetzt erkennen welcher der angelgten button gedrückt wurden??

Delphi-Quellcode:
TButton.Create(self).Name := 'bt' + IntToStr(position);
            with TButton(FindComponent('bt' + IntToStr(position))) do
            begin
              caption := DM_Tabelle.adoquery1.FieldByName('Name').AsString;
              Left := 16;
              Top := position * 27 + 30;
              Parent := panel2;

              onclick(position);
            end;
es soll praktisch die zahl wiedergegeben werden mit der der button erstellt wurde. das ist in dem fall die variable position. wenn der button gedrückt wurde so ist das ja das onclick ereignis. aber finde keine lösung.
onclick soll lediglich die position wiedergeben.

sorry das ich soviel frage,aber ich bin nah an der lösung. kann mir jemand weiterhelfen.
thx
marcus

Christian Seehase 8. Okt 2003 14:08

Re: Buttons ansprechen in einer Schleife
 
Moin markon,

das könntest Du so machen:

Delphi-Quellcode:
// Methode im Formular hinzufügen
procedure TForm1.ButtonClick(Sender: TObject);
begin
  ShowMessage(IntToStr((Sender as TButton).Tag));
end;

  with TButton.Create(self) do
  begin
    Name := 'bt' + IntToStr(position);
    caption := DM_Tabelle.adoquery1.FieldByName('Name').AsString;
    Left := 16;
    Top := position * 27 + 30;
    Parent := panel2;
    Tag    := position;
    OnClick := ButtonClick;
  end;
ungetestet sollte aber so gehen.

markon 8. Okt 2003 14:21

Re: Buttons ansprechen in einer Schleife
 
@christian seehase

DANK dir vielmals.

die lösung, mit den wert in die eigenschaft tag zu schreiben und von da aus wieder zurückzulesen ist einfach spitze. :-D

danke

und bye
:dancer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz