Autor |
Beitrag |
aim65
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Di 31.01.06 16:26
Hallo,
habe vergeblich probiert, über die Suche in allen mir bekannten Foren/Google's eine Lösung für das o.g. Problem zu finden.
Ich habe mehrere Edit-Felder und eine RadioGroup auf dem Formblatt und möchte nur die Edit-Felder per Tabstop erreichbar machen. Der Fokus landet aber immer auch auf der Radiogroup, obwohl im OI TabStop auf "false" gesetzt ist. Abschalten über den Sourcetext geht auch nicht.
Das eigentliche Problem ist aber, daß ich den Abschluß einer Eingabe + Weiterschalten auch über die <RETURN> Taste ermögliche (wie üblich, mit "Keypress ... WM_NEXTDLGCTL,0,0", usw.). Beim Erreichen der Radiogroup hängt sich das Programm für den User scheinbar auf, weil dann mit <Return> nicht weitergeschaltet werden kann.
Die Geschichte passiert übrigens auch bei einzelnen, z.B. auf einem Panel zusammengefassten RadioButtons - alles schon probiert.
Gibt's da einen Trick, das zu umgehen? Es wäre akzeptabel, wenn die Radio Buttons in der Group dann nur noch über die Maus erreichbar wären.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 31.01.06 17:51
Hallo,
angenommen:
Edit1 = Taborder 0
Edit2 = Taborder 1
RadioGroup1 = TabOrder 2
Edit3 = Taborder 3
dann kannst Du so die RadioGroup überlisten:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if key = #13 then begin RadioGroup1.Tag := 1; SendMessage(handle,WM_NEXTDLGCTL,0,0); key := #0; end; end;
procedure TForm1.RadioGroup1Enter(Sender: TObject); begin if RadioGroup1.Tag = 1 then begin RadioGroup1.Tag := 0; Edit3.SetFocus; end; end;
procedure TForm1.Edit2Exit(Sender: TObject); begin RadioGroup1.Tag := 1;end; |
bzgl. Umschalt-Tab darfst Du jetzt selbst einbauen 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Di 31.01.06 18:13
Hallo Lannes,
Danke für die schnelle Antwort. Werde das morgen gleich mal einbauen und probieren. Heute haut's nicht mehr hin. Mist, daß man solche Klimmzüge machen muß.
Gruß, Horst
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Mi 01.02.06 12:31
Habe heute morgen mein Programm entsprechend geändert. Kurz gesagt - es funktioniert nicht. Zwei Dreckeffekte:
beim Anklicken eines RadioButtons passiert dort nichts, sondern der Fokus wird auf das nächste Edit-Feld gesetzt. Wenn man dann ein weiteres Mal auf einen Button klickt, reagiert dieser, aber dafür verschwindet der Focus im Editfeld wieder, d.h., die Returntaste ist wieder wirkungslos. Dachte erst, daß dieser Effekt auf meine KeyPress-Routine, die für alle Editfelder gilt, zurückzuführen ist.
Daher habe ich mal Deinen Vorschlag exakt nachvollzogen - hier passiert das gleiche (also, wenn der Fokus auf Edit2 steht und mit Return weitergeschaltet werden könnte).
Hab's auch zusätzlich mit RadioButtonClick probiert, geht auch nicht.
Habe mich bisher gescheut, eine neue Radio-Komponente mit TabStop=false zu schreiben, da mir die Sache zu undurchsichtig erscheint.
Na ja, war ja mal einen Versuch wert - vielen Dank. Vielleicht gibt es ja noch einen weiteren Workaround.
MfG Horst
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 01.02.06 13:35
Hallo,
ich hab wohl etwas in meiner Beschreibung vergessen
RadioGroup1.TabStop muss True sein.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 01.02.06 16:27
Lannes: Was ist wenn du mit der Maus zum Beispiel von dem Edit direkt auf die Radioboxen klicken möchtest? Dann würde der Fokus auch wegkatapultiert werden. Das ist dann nicht so praktisch.
aim65: Wozu brauchst du das überhaupt? Do solltest auch bedenken, dass es durchaus Leute gibt die größtenteils ohne Maus arbeiten. Für die ist so etwas eine Katastrophe. Außerdem gibt es noch andere Möglichkeiten so etwas zu gestlten.
1. Springe direkt das entsprechenden Element an. Also Edit2.SetFocus. So kommst du auf das Feld deiner Begierde und du musst dazu nicht mal etwas an der vorhandenen Bedienbarkeit ändern.
2. Ebenso würde es sich verhalten, wenn du selber durch die Elemente gehen würdest und dir das Nächste raussuchen würde was keine RadioBox ist, TabStop hat und den nächsten TabOrderWert hat. Das ist zwar ein wenig komplizierter wäre aber universeller als direkt an zu springen. Allerdings dürfte das auch ein wenig komplizierter sein.
Aber bei beiden Methoden wäre es nur ein erweiterung zu der bestehenden Bedienung und keine Verfremdung. Wie das was dir vorschwebt.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 01.02.06 18:17
Hallo,
Lossy eX hat folgendes geschrieben: | Lannes: Was ist wenn du mit der Maus zum Beispiel von dem Edit direkt auf die Radioboxen klicken möchtest? Dann würde der Fokus auch wegkatapultiert werden. Das ist dann nicht so praktisch. |
das stimmt
Mal Abgesehen von der Zweckmäßigkeit oder ob die Vorgehensweise sinnvoll ist,
hier eine Ergänzung zu meinem Vorschlag.
Damit die RadioGroup auch per Tastatur ansprechbar ist, kann man ihr z.B. mit Caption := '&Auswahl' die Tasten-Kombination Alt+a zuweisen.
In einer OnExit-Prozedur eines Edits kann man mit ActiveControl das Element ermitteln, das als nächstes den Focus(lt. TabOrder) bekommen wird.
Nun hat aber ActiveControl andere Werte in Abhängigkeit zum Auslöser des OnExit-Ereignisses:
Quelltext 1: 2:
| Taste Tab oder Enter(SendMessage(...) = RadioGroup Mausklick im Bereich der RadioGroup = GroupButton |
Also ist das mit einer zusätzlichen Zeile lösbar:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Edit2Exit(Sender: TObject); begin if ActiveControl = RadioGroup1 then RadioGroup1.Tag := 1; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Do 02.02.06 12:44
Hallo,
an Lannes:
Dein Tip mit TabStop=true hat den ersten Teil erschlagen - leider bleibt das Hauptproblem ungelöst, <Return> schaltet nicht weiter, wenn der Fokus auf der RadioGroup liegt.
an Lossy eX:
Ich habe meine Ursprungsfrage wohl etwas mißverständlich formuliert. Das Problem ist nicht, wie man am besten die RadioGroup "anfährt", sondern daß die Return-Taste nicht mehr reagiert, wenn der Fokus...siehe oben.
Zur Erläuterung: ich schreibe kleine Freeware-Programme zur Berechnung von Hochfrequenz-Schaltungen (z.B. Quarzfilter-, Superhet-Berechnungen, usw.) für meine Funkfreunde. Diese Programme beinhalten auch grafische Darstellungen mit beweglichen Meßlinien/Fadenkreuzen, die nur mit der Maus sinnvoll zu bewegen sind (quasi-analoges "Feeling"). Daher ist die Maus kein Thema für die Anwender. Der zweite Punkt ist, daß die 5 Edit-Felder sehr oft zur Eingabe von Parametern benutzt werden, die Rado-Group aber eher selten (siehe Screenshot). Der Abschluß einer Eingabe mit <Return> wird von meinen Freunden intuitiv angewendet (geht mir auch so), die TAB-Taste wird nicht so gerne benutzt.
Damit's kein Roman wird, kann ich ja die Hauptfrage noch mal umformulieren:
Wenn schon die TabStop True/False Funktion für die RadioGroup/Buttons im OI wirkungslos ist - Wie kann man <Return> die gleiche Wirkung verpassen wie <TAB>, nämlich weiterschalten aus der RadioGroup ??
Herzlichen Dank für die Hilfe- vielleicht gibt's ja noch was, das man versuchen kann...
Edit: hab noch meinen Zwack mit dem Editor hier. Hoffe, jetzt kommt alles rüber.
Einloggen, um Attachments anzusehen!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 02.02.06 13:43
Ja. Da scheinst du dich wirklich ein wenig missverständlich ausgedrückt zu haben. Erst mal etwas zur Grundproblematik. Einer Radiobox den TabStop zu klauen funktioniert nur so lange wie sie nicht aktiviert wurde. Dann bekommt sie ihn vollautomatisch wieder. Man könnte natürlich her gehen und bei jeder Aktion ihr den Tabstop klauen aber das ist meinen Augen absolut dreckig. Und ob ich solche Tricky Methoden von Lannes gut finde ist etwas anderes, da durch so etwas IMMER irgendwo eine andere Einschränkung hervor kommt. Es wäre einfacher du würdest dich damit abfinden, dass es keine sinnvolle Möglichkeit (mit vertretbarem Zeitaufwand) gibt ihr dauerhaft den TabStop zu verbieten.
Wie dem auch sei. Wie wäre es, wenn du die RadioGroup (RadioBoxen) einfach Deaktivierst wärend des SendMessage Befehls. Da bei diesem Befehl nur aktive Fenster angesprungen werden würden sie also außen vor gelassen werden. Anschließend kannst du sie wieder aktivieren. Du würdest sie dann zwar noch mit Tab aktivieren können aber so schlimm finde ich das nicht. Man könnte dann eh auch gleich weiter und übrigens ist das in jedem anderen Programm auch so. Und wenn man sich ein wenig an Standards hält ist das bestimmt auch nicht schlecht. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 03.02.06 00:29
Hallo,
aim65 hat folgendes geschrieben: | Damit's kein Roman wird, kann ich ja die Hauptfrage noch mal umformulieren:
Wenn schon die TabStop True/False Funktion für die RadioGroup/Buttons im OI wirkungslos ist - Wie kann man <Return> die gleiche Wirkung verpassen wie <TAB>, nämlich weiterschalten aus der RadioGroup ?? |
Im OnKeyPress der Form auf Enter reagieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if (ActiveControl.Parent = RadioGroup1) and (key = #13) then begin SendMessage(handle,WM_NEXTDLGCTL,0,0); key := #0; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Fr 03.02.06 16:06
Ist ein bißchen spät geworden, aber ein Arzttermin hat nun mal leider Vorrang.
Lannes, Dein letzter Vorschlag geht leider nicht. Die and Verknüpfung bewirkt, daß sich in den Edit-Feldern nix mehr rührt.
Lossy, Dein letzter Vorschlag mit der zeitweisen Deaktivierung der Radio Box hat immerhin zu einer Lösung geführt, die brauchbar ist. Sieht jetzt so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if Key =#13 then begin tmp := RadioGroup1.Itemindex; RadioGroup1.ItemIndex :=-1; Perform(WM_NEXTDLGCTL, 0, 0); Key := #0; RadioGroup1.ItemIndex :=tmp; end . . |
Dadurch verpaßt die <Return> Taste tatsächlich nur den fünf Editfeldern zyklisch den Fokus. Damit wird genau das erreicht, was ja gewollt wurde - das scheinbare "Einfrieren" des Programms aus der Sicht des Users wird verhindert. Ist im Grunde genommen exakt "TabStop = false" für die RadioGroup, wie es im OI zwar vorgesehen, aber wirkungslos ist. Daß man nach Anwahl der Radiobox (Maus oder TAB) nur wieder mit der Maus oder <TAB> weiterschalten kann, ist ein kleiner Schönheitsfehler, mit dem man leben kann.
Die Frage der Standards kann man IMHO philosophisch sehen. Für mich ist erst mal am wichtigsten, ob der User mit dem Programm problemlos arbeiten kann. Dem ist ziemlich wurscht, wie und mit was das Programm erstellt wurde. Ich gebe Dir aber absolut recht, daß man beim Programmieren möglichst die Standards befolgt, sonst hätte man ja gleich bei BASIC bleiben können.
Nur ist für mich nicht nachzuvollziehen, warum ich bei Editfeldern den TabStop abschalten kann, bei einer RadioGroup aber nicht. Das müssen sich wohl ja auch die Delphi-Entwickler gedacht haben - sonst hätten sie ja nicht diese Möglichkeit im OI vorgesehen (aber leider nicht implementiert).
Auf jeden Fall betrachte ich dieses Topic als erfolgreich beantwortet und möchte mich bei Euch noch einmal für die Hilfe bedanken. Mal wieder einiges dazugelernt.
Ich werde mal trotzdem auf die Suche begeben, ob jemand die <Return/Enter> Funktion mit den Eigenschaften von <TAB> erstellt hat.
Sonst wird's vielleicht wieder mal ein neues Topic  .
MfG Horst
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 03.02.06 16:21
Hallo,
aim65 hat folgendes geschrieben: | ...
Lannes, Dein letzter Vorschlag geht leider nicht. Die and Verknüpfung bewirkt, daß sich in den Edit-Feldern nix mehr rührt. |
der Code muss im OnKeyPress der Form ausgeführt
und die Eigenschaft KeyPreview der Form auf True gesetzt werden.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Fr 03.02.06 16:31
Hallo Lannes,
hui, das ging aber fix...
Muß mal checken, wie das Programm eingestellt ist. Geht aber erst, wenn ich wieder Admnistrator bin - sonst meckert die Delphi IDE. Online bin ich nur als "beschränkter" User. Geb' Dir dann bescheid.
MfG Horst
|
|
aim65 
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Fr 03.02.06 16:51
Da bin ich wieder.
Hättste ja so einem Deppen wie mir doch gleich sagen müssen...
Kurz und gut: läuft SUPER!
Hab jetzt sogar so eine Art <TAB> Funktionalität. Da lassen sich die 6 Zeilen mehr verkraften.
Nochmals, Dank an Euch beide, jetzt habe ich zwei unterschiedliche Lösungen - nicht schlecht.
Schönes Wochenende
Horst
|
|
|