AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim OnKeyDown

Ein Thema von sko1 · begonnen am 1. Nov 2017 · letzter Beitrag vom 3. Nov 2017
Antwort Antwort
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Problem beim OnKeyDown

  Alt 1. Nov 2017, 10:31
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
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Problem beim OnKeyDown

  Alt 2. Nov 2017, 12:27
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).
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 06:59
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
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 13:03
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 13:31
schau Dir doch mal das Project EditFields.dpr
in den Demos von WPTools an....
Fritz Westermann
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 16:19
wollte ich eben machen, aber folgende Fehlermeldung (Anhang)

Ciao
Stefan
Miniaturansicht angehängter Grafiken
neue-bitmap-2-.jpg  
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 16:22
Na dann schau Dir die Fehlermeldung mal genau an.......
Fritz Westermann
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Problem beim OnKeyDown

  Alt 3. Nov 2017, 16:23
Da scheinen mehrere Fehler in den Dateinamen zu sein, prüf' das doch mal mit NotePad (oder sonst 'nem Editor).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 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