![]() |
Checkbox / KeyDown, KeyPress, KeyUp
Frage wieso funktioniert bei den Checkboxen die Ereignisse KeyDown, KeyPress und KeyUp nicht, wenn ich die Pfeiltasten hoch oder runter drücke?
Folgendes Problem: Ich verwende ein EditFeld (Edit1), eine Checkbox (Checkbox1) und ein EditFeld (Edit2). Tabulatorenreihenfolge: Edit1, Checkbox1, Edit2 Das Editfeld2 setze ich auf Tabstop := false; Ich starte das Programm und Edit1 wird fokusiert. Dann drücke ich auf die TAB-Taste und Checkbox1 wird fokusiert. Dann drücke ich auf die Pfeil nach unten Taste und Edit2 wird fokusiert. Warum das denn??? Edit2 wurde auf Tabstop = false gesetzt. Wenn die Checkbox1 fokusiert ist und ich drücke die TAB-Taste, dann wird richtigerweise Edit1 fokusiert. Das Abfragen in KeyDown funktioniert in den Checkboxen nicht, wenn ich die Pfeiltasten drücke. Warum eigentlich nicht? Wie schalte ich die Pfeiltasten in den Checkboxen aus, wenn die Ereignisssteuerung nicht greift? Ich möchte auf jedenfall verhindern, dass ein Wincontrol den Fokus bekommt, wenn ich die Tabstop-Eigenschaft auf false gesetzt habe. |
Re: Checkbox / KeyDown, KeyPress, KeyUp
TabStop := false bedeutet m.E. nur, dass die Komponente nicht mit der Tabulatortaste angesprungen werden kann. Sie kann sehr wohl den Focus bekommen, z.B. wenn Du mit der Maus reinklickst. Du kannst damit also nicht verhindern, dass ein Control den Focus bekommt. Dafür fällt mir im Moment nichts anderes als "Enabled := false" ein. Für das Umgehen der Pfeiltasten fällt mir im Moment auch nichts ein.
Gruß Jürgen |
Re: Checkbox / KeyDown, KeyPress, KeyUp
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo LuckySpacy,
entweder habe ich dich nicht richtig verstanden, oder du hast ein anderes Problemchen. Bei mir tut's das nämlich, mit der selben Delphi-Version... Wenn die Combobox den Focus hat und ich dann die Pfeiltaste nach unten betätige, wird die Combox "durchgescrollt". Ist es das was du willst? Im Anhang mal der Source. //Edit -> 150... :wink: |
Re: Checkbox / KeyDown, KeyPress, KeyUp
Moin LuckySpacy,
such' hier mal nach ![]() Da wirst Du einige Beispiele finden (für Dich kommt dann auch noch ![]() Ob das bei einer CheckBox das gewünschte Ergebnis bringt, weiss ich auch nicht. Standardmässig dienen die Pfeiltasten zur Navigation, und werden nicht durchgereicht. @juergen: CheckBox, nicht ComboBox ;-) |
Re: Checkbox / KeyDown, KeyPress, KeyUp
Guten Morgen, LuckySpacy.
Nachdem Du nicht willst, dass Deine TextBox/Edit2 den Focus erhält, vermute ich, dass das Control nur zur Ausgabe dienen soll. Dann wäre es doch einfacher, dafür ein Label zu verwenden, das ohnehin nie den Focus erhalten kann. Ich habe mich einmal in der .NET Framework SDK-Dokumentation umgesehen und bin auf folgendes gestoßen: Es gibt eine Eigenschaft CanSelect, die einen Wert abruft, der angibt, ob das Steuerelement den Focus erhalten kann. Dazu gibt es eine geschützte Methode SetStyle, mit der man mittels der ControlStyles-Enumeration das Member selectable setzen kann. Allerdings bin ich überhaupt nicht fit in OOP. Deshalb ist es mir nicht gelungen, die Methode SetStyle zu überschreiben. Ich habe es dann so versucht:
Delphi-Quellcode:
und folgende Fehlermeldung erhalten:
MyTextBox.SetStyle(ControlStyles.Selectable, false);
Delphi-Quellcode:
Ich weiß nicht, was ich falsch gemacht habe und hoffe, ich liege nicht total daneben. Aber vielleicht hilft Dir ja der Hinweis auf SetStyle und ControlStyles weiter. Wenn ja, wäre es nett, wenn Du mir das Ergebnis zukommen lassen würdest.
[Pascal Fehler] WinForm.pas(133): E2363 Nur Methoden von abgeleiteten Typen dürfen auf protected Member [System.Windows.Forms]Control.SetStyle über Assemblierungsgrenzen hinweg zugreifen
Viel Erfolg und noch einen schönen Tag. Gruß Jürgen |
Re: Checkbox / KeyDown, KeyPress, KeyUp
Hallo,
Pfeiltasten in Checkbox abfangen? :arrow: CM_DIALOGKEY abfangen. so ähnlich:
Delphi-Quellcode:
Mit WM_NEXTDLGCTL wird das nächste Element entsprechend TabOrder/TapStop fokussiert.
//...
private procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; //... procedure TForm1.CMDialogKey(var Message: TCMDialogKey); begin with message do begin case charcode of VK_LEFT,VK_UP : if ActiveControl is TCheckBox then SendMessage(Self.Handle,WM_NEXTDLGCTL,1,0); VK_RIGHT,VK_DOWN : if ActiveControl is TCheckBox then SendMessage(Self.Handle,WM_NEXTDLGCTL,0,0); else inherited;//Standardverhalten sicherstellen end; end; end; |
Re: Checkbox / KeyDown, KeyPress, KeyUp
Vielen Dank an alle die sich hier meinem Problem angenommen haben.
An Lannes: Ich habe deinen Quellcode ausprobiert. Funktioniert einwandfrei und wäre eine denkbare Lösung für mich. Da ich aber damit ein grundsätzliches Problem habe und ich nicht in allen Projekten vorher diesen Quellcode übernehmen möchte, habe ich mich für eine andere Lösung entschieden. Ich habe aus der TCheckbox meine eigene Komponente gemacht. Die Lösung ist ganz einfach:
Delphi-Quellcode:
Damit kann ich ganz normal die KeyDown und KeyUp Ereignisse abfragen und es wird kein anderes Control fokusiert.
unit syCheckBox;
interface uses SysUtils, Classes, Controls, StdCtrls, Windows, Messages; type TsyCheckBox = class(TCheckBox) private procedure WMGETDLGCODE(var msg : TWMGetDlgCode); message WM_GETDLGCODE; protected public published end; procedure Register; implementation procedure Register; begin RegisterComponents('MeineKomponenten', [TsyCheckBox]); end; { TsyCheckBox } procedure TsyCheckBox.WMGETDLGCODE(var msg: TWMGetDlgCode); begin msg.Result := msg.Result or DLGC_WANTARROWS; end; end. Vorsicht: KeyPress funktioniert damit nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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 by Thomas Breitkreuz