Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Problem beim OnKeyDown (https://www.delphipraxis.net/194235-problem-beim-onkeydown.html)

sko1 1. Nov 2017 09:31

Problem beim OnKeyDown
 
Hallo,

ich möchte Eingaben in einem TWPRichText (von WPTools) verhindern, wenn der Cursor an einer bestimmten Stelle steht.

Hierfür habe ich

Delphi-Quellcode:
var
  f1, f2: integer; //Feldgrenzen
  s1, s2: integer; //Selektionsgrenzen
begin
  // wenn ein Feld vorhanden ist und die Markierung im Feld steht darf nicht getippt werden
  if FeldInhalt = '' then
    exit;
  f1 := Pos(FeldInhalt, RTFRichtext.text);
  f2 := f1 + length(FeldInhalt);
  s1 := RTFRichtext.SelStart+1;
  s2 := s1 + RTFRichtext.SelLength;
  // Selektionsanfang im Feld?
  if (s1 > f1) then
    if (s1 < f2) then
      Key := #0;
  // SelektionsEnde im Feld?
  if (s2 > f1) then
    if (s2 < f2) then
      Key := #0;
Bei "normalen" Zeichen funktioniert es, beim Enter drücken sehe ich beim Debuggen ebenfalls dass Key zu #0 wird, das Enter aber wird trotzdem ausgeführt und ich habe einen unerwünschten Zeilenumbruch im Text!

Was kann man tun?

Ciao
Stefan

Amateurprofi 2. Nov 2017 11:27

AW: Problem beim OnKeyDown
 
Ich kenne TWPRichText nicht, nehme aber an, dass das im Wesentlichen wie ein TRichEdit funktioniert.

Bei mir ist es so:
Wenn im OnKeyDown Key=0 gesetzt wird, werden Enter, Cursortasten etc. unterdrückt, "normale" Tasten nicht.
Wenn im OnKeyPress Key=#0 gesetzt wird, ist es genau umgekehrt, d.h. "normale" Tasten werden unterdrückt, Enter etc. nicht.

Da Du Key=#0 setzt, nehme ich an, dass Dein Code im OnKeyPress steht und nicht im OnKeyDown wie der Titel des Threads suggeriert.

Was mir sonst noch auffiel:

Du prüfst nicht, ob Feldinhalt überhaupt im Text enthalten ist.
Wenn das Pos(Feldinhalt,RichEdit.Text) 0 ergibt, sollte eine Exit erfolgen.

Ich habe Zweifel ob die mit Pos(,,,) und SelStart ermittelten Positionen korrespondieren.
Bei RichEdit.Text werden Zeilenumbrüche als #13 #10 dargestellt also 2 Zeichen.
Bei SelStart scheint es so zu sein, dass Zeilenumbrüche als ein Zeichen behandelt werden.
Das führt dazu, dass die mit Pos(Feldinhalt,RichEdit.Text) ermittelte Position von der mit RichEdit.SelStart ermittelten Position abweicht, und zwar um die Anzahl der Zeilenumbrüche vor der Fundstelle. (Das ganze natürlich nur wenn der Cursor an der Fundstelle steht).

sko1 3. Nov 2017 05:59

AW: Problem beim OnKeyDown
 
Danke, danke, danke!

Das mit dem key := #0 stimmt, ich hatte OnKeyDown und OnKeyPress beide probiert, jeweils aber nur das eine oder andere!

Wenn ich beide Events entsprechend behandle funktioniert das Sperren der Tasten einwandfrei!

Was die SelStart und SelLength betrifft, da bin ich auch schon drauf gestoßen, wenn der Feldinhalt Zeilenumbrüche enthält.

Bei Feldinhalt = 'Hallo' + sLinebreak + 'Du' hat der Feldinhalt #13#10 als Umbruch aber Sellength ist 1 Zeichen zu kurz!

Ciao
Stefan

Amateurprofi 3. Nov 2017 12:03

AW: Problem beim OnKeyDown
 
Zitat:

Zitat von sko1 (Beitrag 1384879)
Wenn ich beide Events entsprechend behandle funktioniert das Sperren der Tasten einwandfrei!

Ich benutze für solche Zwecke gern OnFormShortCut.
Wenn du da Handled=True setzt, dann wirkt das auf alle Tasten.


Delphi-Quellcode:
procedure TMain.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
const
   NoCareKeys=[VK_Up,VK_Down,VK_Left,VK_Right,VK_Prior,VK_Next,VK_Insert,
               VK_Home,VK_End,VK_Shift,VK_Control,VK_Menu];
var
   Key:TShortCut; Shift:TShiftState;
begin
   if ActiveControl<>reTest then Exit;
   Key:=Msg.CharCode;
   if Key in NoCareKeys then Exit; // Tasten, die den Text nicht verändern, ignorieren
   Shift:=[ssShift,ssCtrl,ssAlt]*KeyDataToShiftState(Msg.KeyData);
   // Und hier die Prüfung, ob Tastendruck unterdrückt werden soll.
   // Wenn die Taste unterdrückt werden soll, Handled:=True setzen.
end;

Fritzew 3. Nov 2017 12:31

AW: Problem beim OnKeyDown
 
schau Dir doch mal das Project EditFields.dpr
in den Demos von WPTools an....

sko1 3. Nov 2017 15:19

AW: Problem beim OnKeyDown
 
Liste der Anhänge anzeigen (Anzahl: 1)
wollte ich eben machen, aber folgende Fehlermeldung (Anhang)

Ciao
Stefan

Fritzew 3. Nov 2017 15:22

AW: Problem beim OnKeyDown
 
Na dann schau Dir die Fehlermeldung mal genau an.......

nahpets 3. Nov 2017 15:23

AW: Problem beim OnKeyDown
 
Da scheinen mehrere Fehler in den Dateinamen zu sein, prüf' das doch mal mit NotePad (oder sonst 'nem Editor).


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.

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