![]() |
Buttons ansprechen in einer Schleife
hallo.
habe 10 normale buttons, mit den namen bt1,bt2,.. bis bt10.
Delphi-Quellcode:
der code soll nur das problem darstellen.
for i:=1 to 10 do
bt1.caption:= inttostr(i); ich möchte in jdem durchlauf die button.caption ändern lassen. dachte mir so kann man es realisieren:
Delphi-Quellcode:
aber so funzt das nicht. da "bt" ein array oder ähnliches sein müßte.
for i:=1 to 10 do
bt[i].caption:= inttostr(i); gibt es eine möglichkeit um mein problem zu lösen? für hilfe bin ich sehr dankbar gruß marcus |
Re: Buttons ansprechen in einer Schleife
|
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:
Sonst auch noch mal FindComponent ankucken, dmait geht das wahrscheinlich sogar schneller..
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; |
Re: Buttons ansprechen in einer Schleife
danke erstmal eurer hilfe.
Delphi-Quellcode:
funktioniert.
for i := Application.ComponentCount - 1 downto 0 do
if Application.Components[i].Name = 'bt' + IntToStr(i) then ... es werden alle objekte aufgelistet. aber:
Delphi-Quellcode:
funzt leider nicht.
Application.Components[i].Caption := 'was auch immer';
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 |
Re: Buttons ansprechen in einer Schleife
Delphi-Quellcode:
kann ja auch gar nicht funktionieren, da Caption keine Eigenschaft von TCompnent ist.Application.Components[i].Caption := 'was auch immer'; 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:
den nächsten Button nehmen. Bsp:
Delphi-Quellcode:
oder sogar ganz auf die Instanz verzichten:
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;
Delphi-Quellcode:
wobei diese Proceduren Methoden des Formulars sein sollten, damit self (als Owner) einen Sinn macht
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; |
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; |
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 |
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:
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.
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; 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 |
Re: Buttons ansprechen in einer Schleife
Moin markon,
das könntest Du so machen:
Delphi-Quellcode:
ungetestet sollte aber so gehen.
// 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; |
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 08:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz