Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RadioButton und OnClick (https://www.delphipraxis.net/46331-radiobutton-und-onclick.html)

Blutiger Anfänger 22. Mai 2005 22:31


RadioButton und OnClick
 
Hallo zusammen,

habe ein Problem mit dem OnClick-Ereignis ,in Verbindung mit dem RadioButton.
Ueber Onclick, RadioButton, wird z.B. ein ext. Programm aufgerufen.
Wird aber zweimal, bzw.,wird DoubleClick ausgefuehrt, wird das Proramm auch zweimal aufgerufen.

Mit:

Delphi-Quellcode:
procedure TForm1.RBRechnerClick(Sender: TObject);

begin
 ShellExecute(0,'open',PChar('calc.exe'),nil,nil,SW_SHOW);
   RBRechner.Enabled := False;
   RBRechner.Checked := False;
   [b]sleep(5000) [/b] // zum Test eingefuegt, um die Zeit,( Enabled und Checked) = False, zu erhoehen
   RBRechner.Enabled := True;
 end;
,

wird z.B. der Taschenrechner aufgerufen.

RBRechner.Enabled := False; , RBRechner.Checked := False; und RBRechner.Enabled := True;,
sollen ermoeglichen, dass das Programm, bei Bedarf ein zweites mal augerufen werden kann.
Es soll aber verhindert werden, wenn jemand (ungewollt) einen DoubleClick ausfuehrt,
dass ein Programm zweimal aufgerufen wird.

Sollte jemand einen Tipp haben, sage ich schon einmal Danke!

Gruss OPA!

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Christian Seehase 22. Mai 2005 23:58

Re: RadioButton und OnClick
 
Moin OPA,

wenn Du der Eigenschaft Checked eines RadioButton einen Wert zuweist, wird die OnClick Methode aufgerufen.

Durch Sleep wird der gesamte Thread in dem es aufgerufen wird für die genannte Zeitspanne angehalten, schau Dir besser mal ein Hier im Forum suchenDelay an.

RedDust 23. Mai 2005 10:40

Re: RadioButton und OnClick
 
Hier hast du den Quelltext für das oben beschriebene Delay:

Delphi-Quellcode:
procedure Delay(time:word);
var Start: Integer;
begin
  Start:=GetTickCount;
  while (GetTickCount)-(Start) <= time do Application.ProcessMessages;
end;

Die Muhkuh 23. Mai 2005 10:43

Re: RadioButton und OnClick
 
Zitat:

Zitat von RedDust
Hier hast du den Quelltext für das oben beschriebene Delay:

Delphi-Quellcode:
procedure Delay(time:word);
var Start: Integer;
begin
  Start:=GetTickCount;
  while (GetTickCount)-(Start) <= time do Application.ProcessMessages;
end;

Hi,

ich verwaise an dieser Stelle mal auf Hagens Delay.

marabu 23. Mai 2005 10:47

Re: RadioButton und OnClick
 
Zitat:

Zitat von Blutiger Anfänger
Ueber Onclick, RadioButton, wird z.B. ein ext. Programm aufgerufen.

Hallo Opa,

du machst Sachen...

Zitat:

Zitat von IBM Common-User-Access Guidelines
(mandatory) Use radio buttons for settings choices. Do not use radio buttons to represent action choices or routing choices.

Besser du nimmst einen Button um das selektierte Programm zu starten.

Grüße vom marabu

Blutiger Anfänger 23. Mai 2005 19:33

Re: RadioButton und OnClick
 
Hallo zusammen,

erst einmal Danke fuer Eure Antworten !

@Chris:
Danke fuer's Edit,(werde versuchen in Zukunft dran zu denken) und Danke fuer den Tipp
(Delay),-- funktioniert !
Allerdings verstehe ich nicht, dass sleep, erst recht wenn es sich auf den gesamten Thread
auswirkt, praktisch den zweiten Mausklick registriert und auswertet!
Mir ist nur noch von füher bekannt,(vor ca. 20 - 25 Jahren),dass aehnliche Funktionen
(Assembler und C) eingesetzt wurden, um in Steuerungen, dass Prellen von Tasten zu unterdruecken !

@RedDust und @Spider, Danke , aber Chris hatte das schon erwaehnt.

@Marabu:
Mit Button's habe ich dieses Programm schon erstellt, da es aber ca. 30 Stueck sind,
wollte ich ein etwas schlichteres Formular darstellen.
Ausserdem ist das Problem identisch, bzw. mit Button's sogar noch zeitkritischer,
denn selbst wenn ich ein enabled,oder visible = false, vor den Aufruf des Programm's
setze,tritt das Ereignis (false), waehrend des Programmstart's auf!
Gibt es denn so etwas wie ein technical ReferenzHandBuch,in dem Befehle,Funtionen..etc.,
detaillierter beschrieben sind ???
Mich wuerde interessieren was hinter Deinem genannten Hinweis steckt,
Du weisst schon, warum, wesh.... !!

Danke an Alle,

Gruss OPA!

Sharky 23. Mai 2005 20:12

Re: RadioButton und OnClick
 
Hai OPA ;-)

beim "klick" auf eine Auswahl-Objekt (RadioButton oder CheckBox) sollen keine Aktionen ausgeführt werden (vom aktivieren/deaktievien abhängiger visueller Objekte mal abgesehen).

Wenn ich dich richtig verstehe möchtest Du verschiedene Programme aus deinem heraus starten?

Wenn ja ist der Ansatz über den RatioButton ja richtig. Mit diesen wird entschieden welches Programm gestartet wird.
Beim klick auf einen Button wird dann das gewählte Programm ausgeführt.

Die einzige Alternative die mir noch einfallen würde, wenn Du auf einen Button verzichten möchtest, wäre anstelle eines TRadioButton ein einfaches Label zu verwenden.

marabu 23. Mai 2005 20:16

Re: RadioButton und OnClick
 
Hallo Opa,

was hinter dem Hinweis steckt, ist einfach erklärt: die Macher der zitierten Guidelines wussten 5 Jahre nach dem Mac, was das Geheimnis seines Erfolges war: ein standardisiertes GUI. Geplant war dieses neue GUI für OS/2, aber mit Windows 3.0 wurde es erst kommerziell erfolgreich. Auch wenn viele Komponenten vom Entwickler kaum falsch verwendet werden können, sind die Guidelines von 1989 für mich auch heute noch ein wertvoller Qualitätsmaßstab.

Dein Design-Problem würde ich so lösen: Für jedes Programm einen RadioButton, alle in einer RadioGroup. Ein einziger ActionButton, der im OnClick sicherstellt, dass er nicht nochmal betätigt werden kann, solange du es nicht willst.

marabu

@sharky: Danke für die Unterstützung

Christian Seehase 23. Mai 2005 20:31

Re: RadioButton und OnClick
 
Moin OPA,

erst einmal muss ich einen Irrtum meinerseits aufklären:
Bei einem RadioButton wird nur dann das OnClick bei Zuweisung an die Eigenschaft Checked ausgelöst, wenn der Wert auf True gesetzt wird, und der Wert gleich false war. :wall: :oops:

Vergleichbar ist dies auch beim Anklicken.
Ist der Button markiert, so wird kein OnClick ausgelöst, demzufolge hat ein Doppelclick auch kein doppeltes Ausführen der Ereignisroutine zur Folge.

Es genügt also einfach das Starten des Programmes per ShellExecute dort einzutragen, ggf. noch das Zurücksetzen der Eigenschaft Checked.
Die Zuweisungen an Enabled, und die Verzögerung sind überflüssig.

Zu Marabus Anmerkung bezüglich der Verwendung von RadioButtons als Button hätte ich auch noch etwas (nicht böse gemeint):
Interface Hall of Shame

Es spricht natürlich prinzipiell nichts dagegen bei der Gestaltung der Bedienung kreativ zu sein, solange dies eine Verbesserung bedeutet. Bei der Verwendung von RadioButton als Button halte ich dies allerdings für fraglich, da sie sich hier völlig anders verhalten, erwartet.

Wie wäre es denn mit SpeedButton?
Initial werden AllowUp auf true und Down auf false gesetzt.
Im OnClick werden nun
Delphi-Quellcode:
  SpeedButton1.OnClick   := nil;
  SpeedButton1.AllowAllUp := false;
gesetzt.
Dies hat zur Folge, dass der Button gedrückt erscheint, und kein Klick mehr Wirkung hat.
Um dieses zu lösen nimmst Du einen weiteren, "normalen", Button als Reset-Button.

Delphi-Quellcode:
  SpeedButton1.AllowAllUp := true;
  SpeedButton1.Down      := false;
  SpeedButton1.OnClick   := SpeedButton1Click;
Hiermit wird der Button wieder gelöst, und das Anklicken mit Funktion belegt.
Damit sich die Button nicht gegenseitig auslösen muss bei jeden ein anderer GroupIndex > 0 angegeben werden.

Vorteil: Jeder sieht sofort, was er angeklickt hat, und kann gezielt die erneute Nutzung aktivieren (Reset-Button, ggf. einer für alle SpeedButton).
Das ist jetzt auch nicht ideal, aber, IMHO, irgendwie gewohnter, als ein RadioButton.

Eigentlich sollten Button genügen, denn i.d.R. weiss der geübte Windows-Anwender, dass ein Doppelclick auf einen Button diesen auch zweimal aktiviert.

Blutiger Anfänger 23. Mai 2005 21:04

Re: RadioButton und OnClick
 
Hallo,

@Sharky, @Marabu, @Chris, Danke fuer Eure Verbesserungsvorschlaege,
werde sie mir mal zu Gemuete fuehren und umsetzen.

@Chris:
Das Checked eines RadioButton auf false zu setzen, reicht leider nicht!
Dies ist auch so ein Phaenomaen fuer mich, wird das aufgerufene Programm sofort wieder geschlossen,
startet es auch schon wieder, diese Geschichte erweist sich dann als Endlosschleife,
von Hand schliessen, wird wieder automatisch gestartet, von Hand...... !!!
Dachte auch erst, dass dies ein Bug ist, leider nicht , passiert mit D6, D7, D_PE 2005 !!

p.s.: Der Hinweis mit Hall of shame, ist schon ok ! :)



Danke und Gruss, OPA!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Seite 1 von 2  1 2      

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