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 user profile iconTh69: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 06.09.2021 um 16:56


jaenicke - Mo 06.09.21 22:58

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
//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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
//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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ja, ein TEdit sollte standardmäßig mit diesen Tastenkombinationen ausschneiden, einfügen usw.
Tut es aber nicht, und ich habe keine Ahnung, wieso!

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
//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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert es denn, wenn du das Formular in ein neues Projekt einbindest?
Muss ich erst mal testen, wenn das nicht allzu viele Änderungen erfordert.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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?


Th69 - Di 07.09.21 15:13

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?

Generell finde ich [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden [https://mycsharp.de/forum/threads/96193/tutorial-vertrackte-fehler-durch-vergleich-von-echtem-projekt-mit-minimalem-testprojekt-finden] dafür sehr hilfreich.


galagher - Di 07.09.21 18:44

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:
  {Alt+Pfeil rechts: nächstes (= rechtes) Tab}
  if (ssAlt in Shift) and (Key = VK_RIGHT) then
    if not (JvTabBar1.SelectedTab.GetNextVisible = nilthen
      JvTabBar1.SelectedTab := JvTabBar1.SelectedTab.GetNextVisible;
  {Alt+Pfeil rechts: vorheriges (= linkes) Tab}
  if (ssAlt in Shift) and (Key = VK_LEFT) then
    if not (JvTabBar1.SelectedTab.GetPreviousVisible = nilthen
      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 > 31) and (Key < 127) then  -> s. Prozedur aHLEditorXKeyPress}
    if (Key > 32and (Key < 127then
      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.