Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TEdit - ssCtrl+Taste wird nicht erkannt
galagher - Mo 06.09.21 16:13
Titel: TEdit - ssCtrl+Taste wird nicht erkannt
Hallo!
Aus irgendeinem Grund funktionieren in einigen TEdit's meines Projektes die Tastenkombinationen Strg+V, Strg+X etc. nicht. Es gibt aber ein Form mit 2 TEdit's, wo das sehr wohl klappt, ebenso klappt es immer in TMemos.
In keiner Unit gibt es irgendwo Code, der die gedrückten Tasten auf 0 oder #0 oder sonstwas setzt. Auch gibt es nirgendwo Code, der
if (Key = Ord('V')) and (ssCtrl in Shift) etc. prüft oder das dann verändert.
Im OnKeyDown wird ssCtrl erkannt, sobald ich jedoch eine andere Taste (eben V, X, etc.) drücke, erhalte ich nur noch den Wert von ssCtrl, also 17, die Taste wird einfach ignoriert. Drücke ich also zB. Ctrl+X, erhalte ich trotzdem nur 17.
Im OnKeyUp werden solche Tastenkombinationen erkannt.
In einem neuen Projekt tritt das nicht auf.
Sollten TEdit's nicht standardmässig auf solche Tastenkombinationen ansprechen?
Ich komme einfach nicht drauf, was das verursacht.
//Edit: Grossbuchstaben werden erkannt, nur Kleinbuchstaben nicht!
Moderiert von Th69: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 06.09.2021 um 16:56
jaenicke - Mo 06.09.21 22:58
galagher hat folgendes geschrieben : |
//Edit: Grossbuchstaben werden erkannt, nur Kleinbuchstaben nicht! |
Dir ist aber schon klar, dass du immer Großbuchstaben bekommst, oder? Der Unterschied zwischen Groß- und Kleinschreibung ist, ob ssShift in Shift drin ist, oder nicht.
Hast du dir einmal ein Memo hingelegt und ausgegeben was du bekommst?
Wenn du z.B. den Großbuchstaben A schreibst, bekommst du:
Quelltext
1: 2: 3: 4:
| Shift down Taste A down Taste A up Shift up |
Oder bei einem Kleinbuchstaben a:
Quelltext
1: 2:
| Taste A down Taste A up |
Ja, ein TEdit sollte standardmäßig mit diesen Tastenkombinationen ausschneiden, einfügen usw.
galagher - Di 07.09.21 09:22
jaenicke hat folgendes geschrieben : |
galagher hat folgendes geschrieben : | //Edit: Grossbuchstaben werden erkannt, nur Kleinbuchstaben nicht! | Dir ist aber schon klar, dass du immer Großbuchstaben bekommst, oder? Der Unterschied zwischen Groß- und Kleinschreibung ist, ob ssShift in Shift drin ist, oder nicht. |
Ja, das weiss ich.
jaenicke hat folgendes geschrieben : |
Ja, ein TEdit sollte standardmäßig mit diesen Tastenkombinationen ausschneiden, einfügen usw. |
Tut es aber nicht, und ich habe keine Ahnung, wieso!
galagher hat folgendes geschrieben : |
//Edit: Grossbuchstaben werden erkannt, nur Kleinbuchstaben nicht! |
Damit meinte ich, dass es nur funktioniert, wenn ich Strg+Shift+Buchstabe drücke.
jaenicke - Di 07.09.21 11:27
Funktioniert es denn, wenn du das Formular in ein neues Projekt einbindest?
Ohne Quelltext mit der Möglichkeit das nachzuvollziehen und zu debuggen, lässt sich dazu kaum etwas sagen.
galagher - Di 07.09.21 12:35
jaenicke hat folgendes geschrieben : |
Funktioniert es denn, wenn du das Formular in ein neues Projekt einbindest? |
Muss ich erst mal testen, wenn das nicht allzu viele Änderungen erfordert.
jaenicke hat folgendes geschrieben : |
Ohne Quelltext mit der Möglichkeit das nachzuvollziehen und zu debuggen, lässt sich dazu kaum etwas sagen. |
Das ist es ja: Da ist nichts Auffälliges oder Besonderes im Quelltext. Und in einem der Formulare des Projekts funktioniert es, aber auch da ist nichts Ungewöhnliches. Aber ich "forsche" witer!
jaenicke - Di 07.09.21 14:29
Wenn du direktere Hilfe brauchst, bräuchte ich mehr Handfestes, z.B. auch per PN, wenn du etwas nicht hier im Forum veröffentlichen möchtest.
Dann würde ich lediglich das Ergebnis hier reinschreiben.
galagher - Di 07.09.21 14:34
jaenicke hat folgendes geschrieben : |
Wenn du direktere Hilfe brauchst, bräuchte ich mehr Handfestes, z.B. auch per PN, wenn du etwas nicht hier im Forum veröffentlichen möchtest.
Dann würde ich lediglich das Ergebnis hier reinschreiben. |
Es gibt da nichts, was es in anderen Projekten nicht auch gibt! Ich wüsste nicht mal, was da der relevante Code sein könnte, weil ich nicht weiss, aus welcher Ecke der Bug kommt. Weder im OnKeyDown noch im OnKeyPress ist was Besonderes drin. Nichts, was irgendwas mit den Tastenwerten macht. Und an den eingebundenen Units liegt's auch nicht. Allerdings frage ich an einer Stelle ab, welche Taste gedrückt wurde, aber auch, wenn ich das auskommentiere, bleibt der Effekt bestehen.
jaenicke - Di 07.09.21 14:41
Hast du vielleicht KeyPreview am Formular aktiviert und dort Ereignisse zugewiesen?
galagher - Di 07.09.21 18:44
Th69 hat folgendes geschrieben : |
Ich tippe auch darauf, daß einige Eigenschaften der Form bzw. der TextBox unterschiedlich sind.
Oder hast du auf dem bestimmten Formular eine externe (besondere) Komponente, welche Tastendrücke abfängt? |
Weder das eine, noch das andere trifft zu!
Ich habe das Problem mittlerweile entdeckt: Es ist das MainMenu und dort die Shortcuts der MenuItems Ausschneiden1, Einfgen1 und Kopieren1, also Ctrl+X, Ctrl+V, Ctrl+C.
Sie verhindern, dass ich Text in TEdits einfügen und daraus kopieren oder ausschneiden kann, auch zwar auch dann, wenn diese MenuItems deaktiviert sind. In TMemos klappt es aber. :eyecrazy:
Ich muss also die ShortCuts immer dann deaktivieren, wenn gerade ein TEdit den Fokus hat, und wiederherstellen, wenn es den Fokus verliert. Seltsam, aber so kann ich das Problem zumindest beheben, wenn auch auf eher unelegante Art. Aber ja, es klappt.
galagher - Di 07.09.21 19:13
jaenicke hat folgendes geschrieben : |
Hast du vielleicht KeyPreview am Formular aktiviert und dort Ereignisse zugewiesen? |
Habe auf diese Frage noch nicht geantwortet: Ja, KeyPreview ist aktiviert, im KeyDown des Formulars sollen Alt+Pfeil links und Alt+Pfeil rechts zum linken bzw. rechten Textfenster (sie sind als Tabs angelegt) springen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if (ssAlt in Shift) and (Key = VK_RIGHT) then if not (JvTabBar1.SelectedTab.GetNextVisible = nil) then JvTabBar1.SelectedTab := JvTabBar1.SelectedTab.GetNextVisible; if (ssAlt in Shift) and (Key = VK_LEFT) then if not (JvTabBar1.SelectedTab.GetPreviousVisible = nil) then JvTabBar1.SelectedTab := JvTabBar1.SelectedTab.GetPreviousVisible; |
Im KeyUp frage ich die Taste ab, die aktuell gedrückt wurde und setze des Status (Enabled, Visible) verschiedener Komponenten, anhängig davon, welches Textfenster gerade dargestellt wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if not (VirtualKeyCodeToStr(Key, True) = '') then if (Key > 32) and (Key < 127) then GetVirtualKeyCode(Key);
if JvTabBar1.Tabs.Count > 0 then begin SetComponentStatus( THLEditorX(FindComponent( 'aHLEditorX'+IntToStr(JvTabBar1.SelectedTab.Tag)))); |
end;
Sonst gibt's da nichts, was irgendwie den Wert einer gedrückten Taste verändert.
Meine Lösung mit dem Deaktivieren und Aktivieren der ShortCuts erklärt aber nicht, wieso es in einem der Units des Projekts trotzdem funktioniert. Dort stelle ich nichts mit den ShortCuts an, das Fenster wird auch nicht modal angezeigt, es ist ein selbsterstellter Ersetzen-Dialog. Alles sehr merkwürdig.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!