Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gemeinsame OnClick - Behandlung (https://www.delphipraxis.net/12834-gemeinsame-onclick-behandlung.html)

Doc F 4. Dez 2003 19:58


Gemeinsame OnClick - Behandlung
 
Hi there,

Also, ich habe da min. zwei Gruppen von sagen wir mal, TButtons . BtnFirst1, BtnPrior1,BtnNext1... und BtnFirst2... Schön, natürlich könnte ich jetzt für jeden Button eine eigene OnClick-Routine schreiben, aber das artet ja aus, zumal BtnFirst1, BtnFirst2 etc. ja eigenlich das selbe tun.
OK, ich kann über:

Delphi-Quellcode:
procedur NavBtnClick(Sender : TObject);
var
  name : String;
  id  : Integer;

begin
  name := (Sender AS TButton).name;
  id := name(length(name));
  ...
aber zB.

Delphi-Quellcode:
  BtnFirst[id].enabled := True;
erzeugt bei meinem Compiler höchstens ein hönisches Grinsen. :angle:

Ist das so überhaupt irgendwie machbar ?


Thanks a lot

Doc F

Zitat:

Nicht jeder ist so egoistisch, das er sich selbst Gedanken macht.

himitsu 4. Dez 2003 20:15

Re: Gemeinsame OnClick - Behandlung
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif und herzlich willkommen in unserer DP-Gemeinde,

also, es gibt verschiedene Möglichkeiten.

Abfragen ob Sender ein bestimmtes Objekt ist:
Delphi-Quellcode:
If Sender is Button1 Then ...
Den Namen des Senders abfragen:
Delphi-Quellcode:
If TButton(Sender).Name = 'Button1' Then ...
Der Eigenschaft TAG der verschiedenen Objekte verschiedene Werte zuweisen und diese abfragen:
Delphi-Quellcode:
Case TButton(Sender).Tag of
  1: ...
  2: ...
  ...
End;
Direkt Sender was zuweisen:
Delphi-Quellcode:
TButton(Sender).Enabled := True;
...

( "TButton(Sender)" und "(Sender as TButton)" kommt auf's Selbe raus )

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

mr2 4. Dez 2003 20:20

Re: Gemeinsame OnClick - Behandlung
 
Hallo,

wie Du schon an der Syntaxhervorhebung erkennen kannst, solltest Du lokale Variablen nie "name" nennen, das führt nur zu Verwechslungen mit TComponent.Name und dessen Nachfahren.

Wenn Du allen Buttons den selben Eventhandler zuweist, kannst Du sie über die Eigenschaft "Tag" auseinanderhalten.
Einfach für jeden Button einen anderen Tag einstellen.
Delphi-Quellcode:
procedure ButtonClick(Sender : TObject);
begin
  if (Sender is TButton) then begin
    case TButton(Sender).Tag of
      1: ShowMessage('Erster Button!');
      2: ShowMessage('Zweiter Button!');
      3: ShowMessage('Dritter Button!');
      4: ShowMessage('Vierter Button!');
      else ShowMessage('Anderer Button!');
    end;
  end else ShowMessage('Kein Button!');
end;
mr2
[edit]Da war mal wieder jemand schneller :lol: [/edit]

Doc F 4. Dez 2003 20:32

Re: Gemeinsame OnClick - Behandlung
 
Wow, seid ihr aber schnell.

War nur gerade kurz was anderes am suchen, und schon...

Ok, name war kein gutes Beispiel, zugegeben, aber 's ging ja eher ums Prinzip.

Super, was die Buttons angeht, war ich ja doch ein wenig begriffsstutzig.

Delphi-Quellcode:
TButton(Sender).Enabled := True;
trifft's genau, autsch.

So weit, so gut. Wie aber nun, wenn nicht nur Buttons angesprochen werden müssen.
Bin ich fies, wenn ich da auch noch zB. TTable reinmenge ?

Ansonsten schon mal dankeschön, habt mir schon geholfen.

Doc F

Zitat:

Nicht jeder ist so egoistisch, das er sich selbst Gedanken macht.

himitsu 4. Dez 2003 21:08

Re: Gemeinsame OnClick - Behandlung
 
:oops: Ausverseh'n 'Edit' an statt 'Zitat'
(weiß aber nicht mehr genau was hier stand, dashalb nicht wundern)

Vorher halt den Typ abfragen:
Delphi-Quellcode:
If Sender.ClassType = TButton Then Begin
  TButton(Sender).Enabled := True;
End Else If Sender.ClassType = TBitBtn Then Begin
  TBitBtn(Sender).Enabled := True;
End Else If Sender.ClassType = TEdit Then Begin
  TEdit(Sender).Enabled := True;
End Else If Sender.ClassType = TMemo Then Begin
  TMemo(Sender).Enabled := True;
End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Doc F 5. Dez 2003 04:04

Re: Gemeinsame OnClick - Behandlung
 
Danke für die Hilfe,

Himitsu hat mich zum Schluss war falsch verstanden : Sender ist immer TButton, der diverse andere Sachen steuern soll.

Trotzdem war die Lösung in euren Antworten enthalten. :love:

Doc F

Bernd Ua 5. Dez 2003 07:34

Re: Gemeinsame OnClick - Behandlung
 
Moin,Moin

Zitat:

( "TButton(Sender)" und "(Sender as TButton)" kommt auf's Selbe raus )
Das mag ich so nicht stehen lassen. TButton(Sender) ist ein unsicherer Typecast ( zumindest bis Delphi 7)
und führt im günstigesten Fall zu Schutzverletzungen, wenn die Annahme nicht stimmt. Hier ist alles erlaubt
was dieselbe Grösse hat. d.h.
Delphi-Quellcode:
TButton(4).Caption := 'Bumm';
wird anstandlos kompiliert !
(Sender as TButton) ist dagegen ein sicherer Typecast und erzeugt eine Exception
EInvalidCast, wenn die Annahme mal falsch war, weil man das Ereignis mal woanders angeklemmt hat.

Ergo TButton(Sender) nur verwenden, wenn zumindest vorher mit is geprüft wurde
(BTW is ist besser als xxx.ClassType= yyy, auch wenn es minimal anders arbeitet).

Die Spagetti-if-else Geschichte :

Delphi-Quellcode:
If Sender.ClassType = TButton Then Begin
  TButton(Sender).Enabled := True;
End Else If Sender.ClassType = TBitBtn Then Begin
  TBitBtn(Sender).Enabled := True;
End Else If Sender.ClassType = TEdit Then Begin
  TEdit(Sender).Enabled := True;
End Else If Sender.ClassType = TMemo Then Begin
  TMemo(Sender).Enabled := True;
End;
kann man deutlich kürzen, wenn man sich auf den kleinsten gemeinsamen
Nenner der Klassen/Eigenschaften besinnt ( in diesem Fall TControl) und
mit is statt ClassType arbeitet.

Delphi-Quellcode:
if Sender is TControl then
    TControl(Sender).Enabled := false;
  else
    ...

SCNR , Bernd

himitsu 5. Dez 2003 08:45

Re: Gemeinsame OnClick - Behandlung
 
Das mit dem BOOM: Dafür ist natürlich der Programierer verantwortlich. (Wenn es knallt, ist er/sie halt selber Schuld)

OK, für Enabled ist das schon etwas übertrieben, aber bei Komponententypischen Eigenschaften (z.B.
Delphi-Quellcode:
If Sender.ClassType = TButton Then Begin
  TButton(Sender).Caption := 'Text';
...
) ist mit TControl(Sender).Caption nichts mehr los.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

choose 5. Dez 2003 09:00

Re: Gemeinsame OnClick - Behandlung
 
Zitat:

Zitat von himitsu
[...] für Enabled ist das schon etwas übertrieben, aber bei Komponententypischen Eigenschaften [...] ist mit TControl(Sender).Caption nichts mehr los.

Hi himitsu,

bei selbstgeschriebenen Klassen mit Interfaces, für die "dreckige Lösung" mit RTTI und für den OO-Entwickler mit einem Visitor, lässt sich das Problem ohne n Fallunterscheidungen (die mit der Wahrscheinlichkeit p immer 0<m<=n Fehlerhaben, bei denen die Übersicht gegen 1/n^2 strebt und die Wartbeikeit bei n! liegt ;)) lösen.

Bernd Ua 5. Dez 2003 09:03

Re: Gemeinsame OnClick - Behandlung
 
2 mal Einspruch

Zitat:

(Wenn es knallt, ist er/sie halt selber Schuld)
Eben - das merkt man leider vielen Programmen an. Mal eben nach nem halben Jahr ne Änderung eingebaut und ...
Da ist für mich der Unterschied zwischen "rumcoden" und programmieren

Zitat:

[...]ist mit TControl(Sender).Caption nichts mehr los.
Deswegen habe ich kleinsten gemeinsamen Nenner geschrieben <g>
Mit dem man (TControl/TwinControl) im übrigen schon ne ganze Menge reissen kann.

Mit Caption get es übrigens auch - zumindest wenn man zugegebenermassen etwas unsauber
in den protected Bereich einbricht

Delphi-Quellcode:
type
  TControlCracker = class(TControl);

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sender is TControl then
    TControlCracker(Sender).Caption := 'Geht nich - gibbs nich'
  else
    ShowMessage(sender.Classname);
end;

Bernd


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr.
Seite 1 von 3  1 23      

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