| Autor |
Beitrag |
BuddyPhilipp
Hält's aus hier
Beiträge: 10
WinXP
Delphi 6
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3:
| If X = 0 then Else ButtonX.Action; |
Kann mir jemand weiterhelfen?
Danke! 
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 25.02.08 15:43
Moin und  im Forum!
Du suchst vermutlich 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 
Hält's aus hier
Beiträge: 10
WinXP
Delphi 6
|
Verfasst: Mo 25.02.08 16:06
Ahh, vielen, vielen Dank, hat funktioniert!
Hier die Lösung:
Delphi-Quelltext 1: 2: 3:
| If X = 0 then Else TButton(FindComponent('Button' + IntToStr(X))).Action; |
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Mo 25.02.08 16:32
_________________ 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 
Hält's aus hier
Beiträge: 10
WinXP
Delphi 6
|
Verfasst: 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:
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:
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:
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 
Zuletzt bearbeitet von BuddyPhilipp am Di 26.02.08 14:27, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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): 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  : 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 
Hält's aus hier
Beiträge: 10
WinXP
Delphi 6
|
Verfasst: Di 26.02.08 14:33
jaenicke 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): 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.
jaenicke hat folgendes geschrieben: |
Zweitens:
Hast du denn eine Action definiert für die Buttons?
Ansonsten solltest du vielleicht eher den ButtonClick auslösen : Delphi-Quelltext 1: 2:
| if X <> 0 then TButton(FindComponent('Button' + IntToStr(X))).Click; | |
Genau, das war mein Problem
jaenicke hat folgendes geschrieben: |
// EDIT:
Gut, das Problem ist ja schon gelöst, aber das was ich unter erstens geschrieben habe, gilt trotzdem . |
Danke nochmal 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 26.02.08 14:44
Wenn du verschiedene Sounds hast, dann kannst du z.B. ein konstantes Array mit den Dateinamen benutzen: 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: 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
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
WinXP
Delphi 6
|
Verfasst: Di 26.02.08 18:58
|
|
|