AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gemeinsame OnClick - Behandlung

Ein Thema von Doc F · begonnen am 4. Dez 2003 · letzter Beitrag vom 15. Dez 2003
Antwort Antwort
Seite 1 von 3  1 23      
Doc F

Registriert seit: 29. Nov 2003
Ort: nähe Giessen
7 Beiträge
 
#1

Gemeinsame OnClick - Behandlung

  Alt 4. Dez 2003, 20:58
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.

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

Ist das so überhaupt irgendwie machbar ?


Thanks a lot

Doc F

Zitat:
Nicht jeder ist so egoistisch, das er sich selbst Gedanken macht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Gemeinsame OnClick - Behandlung

  Alt 4. Dez 2003, 21:15
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:
If Sender is Button1 Then ... Den Namen des Senders abfragen:
If TButton(Sender).Name = 'Button1Then ... 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:
TButton(Sender).Enabled := True; ...

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


http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
mr2

Registriert seit: 3. Mai 2003
140 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Gemeinsame OnClick - Behandlung

  Alt 4. Dez 2003, 21:20
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 [/edit]
"... we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we don't know. But there are also unknown unknowns - the ones we don't know we don't know."
  Mit Zitat antworten Zitat
Doc F

Registriert seit: 29. Nov 2003
Ort: nähe Giessen
7 Beiträge
 
#4

Re: Gemeinsame OnClick - Behandlung

  Alt 4. Dez 2003, 21:32
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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Gemeinsame OnClick - Behandlung

  Alt 4. Dez 2003, 22:08
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Doc F

Registriert seit: 29. Nov 2003
Ort: nähe Giessen
7 Beiträge
 
#6

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 05:04
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.

Doc F
Nicht jeder ist so egoistisch, das er sich selbst Gedanken macht.
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 08:34
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.
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
Bernd Ua
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 09:45
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:00
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.
gruß, choose
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Gemeinsame OnClick - Behandlung

  Alt 5. Dez 2003, 10:03
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
Bernd Ua
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr.
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