Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   OnClick ereigniss für ganz viele buttons?? (https://www.delphipraxis.net/100098-onclick-ereigniss-fuer-ganz-viele-buttons.html)

snow 22. Sep 2007 08:49


OnClick ereigniss für ganz viele buttons??
 
So Ich bins noch mal.

ICh stehe vor einem schreibproblem.

ICh hab auf einer form 16 Buttons. Wenn jemand auf einen button klickt dann wecheselt der die fabe zwischen 'cllime' und 'clred'.

Klappt auch alles prima. Außerdem ändert er einen Zustand in einem array. Das array ist 256 blöcke groß. oben in der Form ist ein SpinEdit, welches werte zwischen 1 und 16 annehmen kann.


Delphi-Quellcode:
procedure TKeyboardfenster.MGKeyboardbutton10Click(Sender: TObject);
begin
Keyboardschalternummer := (KeyboardNummer.Value - 1) * 16 + 10;
  If MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] = false then begin;
  MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] := true;
  MGKeyboardbutton10.Color:=clred;
  end
  else if MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] = true then begin
  MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] := false;
  MGKeyboardbutton10.Color:=clLime;
  end

end;
Keyboardschalternummer ist der Spinedit
MGadresse ist das Array
Keyboardbutton10 ist der Button
Keyboardschalternummer ist vom type integer.



wenn ich jetzt bei allen 16 buttons ein ONclick event schreiben müsste und jeweis ein paar werte ändern müsste dann tun mit die finger weh, und die unit wird unübersichtlich.


wie kann ich ein ONclick ereigniss für alle buttons machen, indem sich je nachdem welcher button gedrückt wurde ein paar parameter ändern??? Die parameter wären : (MGkeyboardButton zwischen 1 und 16) eine normale variable.

Edit:// Ok stell ich die frage mal anders.

wenn ich 2 buttons habe, kann ich die ja auf die selbe procedure zugreifen lassen. (onclick-procedure). ICh will aber, dass sie auf die selbe Procedure zugreifen und dabei ihren namen nennen. Die procedure soll bei button2 ein label mir 'button2' füllen und bei button1 das selbe label mir 'button1' füllen







MfG snow

pilic 22. Sep 2007 09:28

Re: OnClick ereigniss für ganz viele buttons??
 
Ruf doch aus dem onClick eine Funktion auf, die einen TButton als Parameter erwartet.

snow 22. Sep 2007 09:41

Re: OnClick ereigniss für ganz viele buttons??
 
Muss ich trozdem für jeden button eine eigene onclick procedure erstellen, die dann die funktion aufruft???

Oder kann ich auch die funktion als ONclick aufrufen und in der funktion irgendwie herausfinden welcher button geclickt hat??


MfG snow

Luckie 22. Sep 2007 09:48

Re: OnClick ereigniss für ganz viele buttons??
 
Schreib dir eine neue Methode:
Delphi-Quellcode:
procedure Tform1.DoSomething(Sender: TObject);
und ruf diese in den Ereignisprozeduren der Schaltflächen auf. Dann kannst du jeder Schaltfläche in der Eigenschaft Tag einen eindeutigen Wert zuweisen, den du dann in DoSomething auswertest:
Delphi-Quellcode:
var
  Tag: Integer;
begin
  Tag := (Sender as TButton).Tag;
  case Tag of
    0: ...;
    1: ...;
  end;

pilic 22. Sep 2007 09:48

Re: OnClick ereigniss für ganz viele buttons??
 
Nein, du kannst den Sender auswerten. Einfach im OI die selbe Prozedur eintragen und dann sieht das z.B. so aus:
Delphi-Quellcode:
procedure TForm1.allgemein(Sender: TObject);
begin
  Showmessage((Sender as TComponent).Name);
end;

Jürgen Thomas 22. Sep 2007 09:51

Re: OnClick ereigniss für ganz viele buttons??
 
Delphi-Quellcode:
procedure TKeyboardfenster.MGKeyboardbutton10Click(Sender: TObject);
var btnName: string;
    i0: integer;
begin
  if (Sender is TButton)
  then begin
    btnName := (Sender as TButton).Name;
    //  jetzt kannst Du z.B. das letzte Zeichen als Zahl herausholen
    //  oder wie auch immer Du die Buttons unterscheiden willst;
    //  bei Bedarf ist auch Tag geeignet:
    i0 := (Sender as TButton).Tag;
    case i0 of
      1: // usw.
    end;
  end;
end;
Gruß Jürgen

[OT]Drei ähnliche Beiträge fast gleichzeitig sollten Dir die Richtung zeigen.

dominikkv 22. Sep 2007 09:57

Re: OnClick ereigniss für ganz viele buttons??
 
hi
du kannst eine onKlick-Prozedur erstellen und dann im OI für alle buttons dieses onKlick-Ereignis einstellen. egal welchen button man klickt, es wird immer diese prozedur aufgerufen...

und rate mal was der parameter Sender bringt?
genau, hier steht das Objekt der dieses event ausgelöst hat, also der button auf den geklickt wurde.
blöd nur das der von typ TObject ist. aber du kannst ganz einfach casten:
Delphi-Quellcode:
procedure TKeyboardfenster.MGKeyboardbuttonClick(Sender: TObject);
var
  GecklickterButton: TButton;
begin
  if (Sender is TButton) then
  begin
    GecklickterButton := (Sender as TButton);
    GecklickterButton.caption := 'Ich wurde geklickt!';
  end;
end;
das verändert zB die caption des geklickten buttons. alternativ und ohne zusätzliche variable geht auch:
Delphi-Quellcode:
procedure TKeyboardfenster.MGKeyboardbuttonClick(Sender: TObject);
begin
  if (Sender is TButton) then
    (Sender as TButton).caption := 'Ich auch...';
end;
außerdem kannst du jedem button einen TAG geben, dh du schreibst (am besten im IO) in deinen ersten Button1.tag := 1 und in den zweiten 2 usw dann kannst ganz leicht schauen welcher button geklickt wurde:
Delphi-Quellcode:
if GecklickterButton.tag = 5 then // 5.button wurde angeklickt

snow 22. Sep 2007 10:05

Re: OnClick ereigniss für ganz viele buttons??
 
Danke an alle!


Mit pilic's code konnte ich ein label beschreiben. Entweder mit 'Button1' oder 'Button2' jetzt werd ich das ganze in meine Keyboard-unit einbauen. Sollte klappen. Werde jedem Button eine zahl zuweisen und dann sollte es klappen ich meld mich wenn ich erfolg habe.


MfG snow

snow 22. Sep 2007 10:57

Re: OnClick ereigniss für ganz viele buttons??
 
Delphi-Quellcode:
procedure TKeyboardfenster.MGKeyboardbutton1Click(Sender: TObject);
var buttonclickedname : string;
lokal : integer;
begin
  Buttonclickedname:=(Sender as TComponent).Name;
  begin
  for lokal := 1 to 16 do begin
  if Buttonclickedname = 'MGKeyboardbutton'+(inttostr(lokal)) then Keyboardschalternummer := lokal;
  end;
  end;
  Keyboardschalternummer := (KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer;
  If MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] = false then begin;
  MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] := true;
  TLabel(Sender).Color:=clred;
  end
  else if MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] = true then begin
  MGAdresse[(KeyboardNummer.Value - 1) * 16 + Keyboardschalternummer] := false;
  TLabel(Sender).Color:=cllime;
  end
 
  end;
damit hat es geklappt!


MfG snow


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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