Autor Beitrag
BuddyPhilipp
Hält's aus hier
Beiträge: 10

WinXP
Delphi 6
BeitragVerfasst: Mo 25.02.08 15:33 
Hallo Community!

Vorweg - sorry für den schlecht beschreibenden Titel, mir ist kein unpassenderer Name eingefallen...
und: ich bin noch ein Delphi-Neuling und habe noch nicht viel Ahnung!


Mein Problem grob umreißend:
Ich habe ein Programm mit knapp 140 Buttons (ja, alle von Hand erstellt, nicht lachen ;)) geschrieben.
Nun möchte ich, dass wenn man einen dieser Knöpfe anklickt, sich eine globale Variable X die Nummer des Buttons merkt.

Dann erstelle ich einen neuen Button, der die Aktion des Xten Buttons ausführt.

Dazu mein Problem:
Wie kann ich eine Variable mit einarbeiten in die Buttonnummer?

Mein derzeitiger Code lautet, nicht funktionierend:

ausblenden Delphi-Quelltext
1:
2:
3:
If X = 0 then
Else
ButtonX.Action;



Kann mir jemand weiterhelfen?
Danke! :D
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 25.02.08 15:43 
Moin und :welcome: im Forum!

Du suchst vermutlich Suche in: Delphi-Forum, Delphi-Library FINDCOMPONENT ;)

Aber bei der Menge Buttons würde ich mir nochmal überlegen, ob das Programmkonzept so "richtig" ist... :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BuddyPhilipp Threadstarter
Hält's aus hier
Beiträge: 10

WinXP
Delphi 6
BeitragVerfasst: Mo 25.02.08 16:06 
Ahh, vielen, vielen Dank, hat funktioniert! :D


Hier die Lösung:

ausblenden Delphi-Quelltext
1:
2:
3:
If X = 0 then
Else
TButton(FindComponent('Button' + IntToStr(X))).Action;
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 25.02.08 16:32 
ausblenden Delphi-Quelltext
1:
2:
If X <> 0 then
  TButton(FindComponent('Button' + IntToStr(X))).Action;
, :wink:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
BuddyPhilipp Threadstarter
Hält's aus hier
Beiträge: 10

WinXP
Delphi 6
BeitragVerfasst: Di 26.02.08 14:15 
Ich bedanke mich nochmal, FindComponent war meine gesuchte Lösung!


Allerdings stehe ich nun vor einem weiteren Problem:

Voraussetzung:
  • X ist meine globale Variable
  • ich habe 22 Buttons erstellt, jeden nach folgendem Muster:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlaySound('Sound1.wav', 0, SND_ASYNC);
X:=1;
end;

  • das Abspielen der Sounds funktioniert
  • in jedem neuem Button wird X=[Buttonnummer] gesetzt, minimal also 1 und maximal dementsprechend 22



Jetzt habe ich einen 23. Button erstellt mit dem Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button23Click(Sender: TObject);
begin
If X <> 0 then
TButton(FindComponent('Button' + IntToStr(X))).Action;
end;




Das Ganze soll bewirken, dass ich einen meiner 22 Buttons anklicke, der Rechner den Sound abspielt und die Variable X der Buttonnummer anpasst.

Anschließend klicke ich auf Button 23 und der Rechner spielt den Sound des Buttons X ab!

Edit:
Problem gelöst!

Es hätte lauten müssen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button23Click(Sender: TObject);
begin
If X <> 0 then
TButton(FindComponent('Button' + IntToStr(X))).Click
end;


Also statt .Action .Click!

Aber danke für eure großartige Hilfe bis hierhin :D


Zuletzt bearbeitet von BuddyPhilipp am Di 26.02.08 14:27, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.02.08 14:26 
Erstens, wie wäre es damit für alle 22 Buttons als OnClick (also immer die selbe Methode statt 22 Stück):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ButtonClick(Sender: TObject);
var
  BtnName: String;
begin
  BtnName := TButton(Sender).Name;
  Delete(BtnName, 1, 6);
  PlaySound('Sound' + BtnName + '.wav', 0, SND_ASYNC);
  X := StrToInt(BtnName);
end;
Zweitens:
Hast du denn eine Action definiert für die Buttons?
Ansonsten solltest du vielleicht eher den ButtonClick auslösen ;-):
ausblenden Delphi-Quelltext
1:
2:
  if X <> 0 then
    TButton(FindComponent('Button' + IntToStr(X))).Click;


// EDIT:
Gut, das Problem ist ja schon gelöst, aber das was ich unter erstens geschrieben habe, gilt trotzdem ;-).
BuddyPhilipp Threadstarter
Hält's aus hier
Beiträge: 10

WinXP
Delphi 6
BeitragVerfasst: Di 26.02.08 14:33 
user profile iconjaenicke hat folgendes geschrieben:
Erstens, wie wäre es damit für alle 22 Buttons als OnClick (also immer die selbe Methode statt 22 Stück):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ButtonClick(Sender: TObject);
var
  BtnName: String;
begin
  BtnName := TButton(Sender).Name;
  Delete(BtnName, 1, 6);
  PlaySound('Sound' + BtnName + '.wav', 0, SND_ASYNC);
  X := StrToInt(BtnName);
end;



Darüber kann ich ja mal nachdenken, wobei sich der Teil mit PlaySound('Sound' + BtnName + '.wav'...) als eher schwierig erweisen dürfte, weil meine Sounds alle unterschiedliche Namen haben, die vom Prinzip her so bleiben müssen.
Einzigst der Einfachkeit halber nannte ich sie hier Sound1, Sound2, usw. ;)

user profile iconjaenicke hat folgendes geschrieben:

Zweitens:
Hast du denn eine Action definiert für die Buttons?
Ansonsten solltest du vielleicht eher den ButtonClick auslösen ;-):
ausblenden Delphi-Quelltext
1:
2:
  if X <> 0 then
    TButton(FindComponent('Button' + IntToStr(X))).Click;

Genau, das war mein Problem :)

user profile iconjaenicke hat folgendes geschrieben:

// EDIT:
Gut, das Problem ist ja schon gelöst, aber das was ich unter erstens geschrieben habe, gilt trotzdem ;-).

Danke nochmal :D
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.02.08 14:44 
Wenn du verschiedene Sounds hast, dann kannst du z.B. ein konstantes Array mit den Dateinamen benutzen:
ausblenden Delphi-Quelltext
1:
2:
const
  SoundFiles: array[0..2] of String = ('XY.wav', '007.wav', 'JingleBells.wav');
Dann kannst du den entsprechenden Eintrag aus dem Array nehmen ;-). Am einfachsten ist das, wenn du die Eigenschaft Tag der Buttons setzt, dann kannst du die Buttons auch nennen wie du willst:
ausblenden Delphi-Quelltext
1:
2:
  PlaySound(ExtractFilePath(ParamStr(0)) + SoundFiles[TButton(Sender).Tag], 0, SND_ASYNC);
  X := TButton(Sender).Tag;
Wobei ExtractFilePath(ParamStr(0)) das Verzeichnis deiner Anwendung ist, weil wenn du keinen absoluten Pfad angibst, kannst du auch hereinfallen, wenn das aktuelle Arbeitsverzeichnis ein anderes ist.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 26.02.08 15:29 
gilt hier nicht mehr: neue Frage neues Thema :?:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
BuddyPhilipp Threadstarter
Hält's aus hier
Beiträge: 10

WinXP
Delphi 6
BeitragVerfasst: Di 26.02.08 18:58 
user profile iconKroko hat folgendes geschrieben:
gilt hier nicht mehr: neue Frage neues Thema :?:

Ja, wahrscheinlich, deswegen bedanke ich mich jetzt noch mal für all eure Mühen und mache bei meiner nächsten Frage einen anderen Thread auf :)