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/)
-   -   KeyDown, KeyUp, KeyPress (https://www.delphipraxis.net/196849-keydown-keyup-keypress.html)

sko1 25. Jun 2018 13:44

KeyDown, KeyUp, KeyPress
 
Hallo,

im OnKeyPress einer Komponente setze ich Key:= #0 für alle Tasten, die im bestimmten Fall nicht erlaubt sind.
Dennoch kommt ein #13 (Enter) durch!
Abgefangene Buchstaben werden nicht weitergegeben.

Irgendwie ist mir das Handling der Events unklar, wenn ich z.B. im OnKeyDown Key := 0 setze erwarte ich dass dann im KeyPress oder KeyUp nichts mehr ankommt!

Kann mich bitte jemand aufklären?

Ciao
Stefan

himitsu 25. Jun 2018 13:50

AW: KeyDown, KeyUp, KeyPress
 
Wenn eine Taste vor dem KeyPress ausgewertet wird, dann kam deine Behandlung noch nicht.

Auf einige Tasten wird schon im KeyDown reagiert, also vor KeyUp und KeyPress.
Und auf einige Tasten wird erst im KeyUp reagiert und manche halt im KeyPress (z.B. für Key-Repeat)




Schlimm sind solche Dinge, wo im KeyDown reagiert wird und dann der Fokus wo anders hin geht, weil z.B. ein Fenster auf/zu geht,
und dann das KeyUp-Ereignis wo anders verarbeitet wird.

Ein schöner Fall: In einem Fenster mit F5 (KeyUp) ein Options-Fenster anzeigen und dort wieder F5 (KeyDown) um Standardauswahl zu nehmen und das Fenster zu schließen.
> Optionsfenster mit Default schließen (KeyFown) öffnet aber sofort wieder dieses Optionsfenster, weil KeyUp.

jziersch 25. Jun 2018 14:44

AW: KeyDown, KeyUp, KeyPress
 
Hallo,

Falls sich Ihre Anfrage auf WPTools bezieht (Sie verwenden diese ja) können Sie in der unit WPCtrMemo.pas nachsehen, wo welcher charcode (#13) oder VK code (VK_RETURN) bearbeitet wird.

Ob dies in OnKeyPress oder OnKeyDown passiert hängt damit zusammen, ob zusätzlich der "Shift" parameter zu Bearbeitung erforderlich ist. Bei Return wird Shift und Control abgefragt, +Shift erzeugt einen Zeilenumbruch, +Ctrl einen Seitenumbruch. Manche Tasten kann man auch nur im KeyDown abfragen da sie keinen Zeichencode auslösen, wie die Cursor Tasten.

Viele Grüsse,
Julian

sko1 25. Jun 2018 15:04

AW: KeyDown, KeyUp, KeyPress
 
Volltreffer!

Ich versuche gerade zu verhindern, dass der Benutzer in einer Tabellenzelle Enter drückt und mir damit 2 einzelne Paragraphen entstehen :-)

Im OnKeyDown setze ich key=0 wenn Enter ankommt, nur im OnKeyPress dies nun mit einem "weichen Zeilenumbruch" zu ersetzen fehlt mir noch der Ansatz, denn mit Shift-Enter kommt dort auch nur #13 an, und aus #13 dann #10 zu machen funktioniert auch nicht...

Ciao
Stefan

jziersch 25. Jun 2018 15:31

AW: KeyDown, KeyUp, KeyPress
 
Die aktuelle Version von WPTools (8.05) enthält eine Demo "P) Premium\TextBox" welche bei #13 eine Tabellenzeile erzeugt. Diesen code kann man bestimmt gut abwandeln.

Code:
procedure TForm5.WPRichText1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var aRow : TParagraph;
    colnr : Integer;
begin
  aRow := WPRichText1.TableRow;
  if (Key=13) and (aRow<>nil)then
  begin
    if ssCtrl in Shift then
        WPRichText1.InputString(#10)
    else
    begin
        colnr := WPRichText1.TableColNumber;
        aRow := aRow.Duplicate(false, true, false, [wpParCopyStyles,wpDontCopyCellSubParagaraphs]);
        WPRichText1.ActiveParagraph := aRow.ColFirst;
        WPRichText1.TableColNumber := colnr;
        WPRichText1.ReformatAll(false, true);
    end;
    Key := 0;
  end;
end;
Wenn also Ctrl gedrückt wird, wird ein Zeilenumbruch eingefügt (kein neuer Absatz) - ansonsten wird die Tabellen Zeile dupliziert und der cursor in der neuen Zeile platziert.

Die Funktion par.Duplicate hat einen erweiterten Parameter Mode spezielle für das duplizieren von Zeilen. (vgl. manual unter "Create new tablerow on CR".

Hoffentlich hilft das weiter.

sko1 25. Jun 2018 15:46

AW: KeyDown, KeyUp, KeyPress
 
Gibt es eine neue 8.05?

Ich habe die 8.05 am 8.6.18 heruntergeladen, wo sie noch Beta hieß, unter Demos habe ich nur L) PremiumDemo und darunter nicht das angegebene Verzeichnis TextBox!
Ein "P) Premium" gibt es gar nicht!
Nochmal neu laden?

Aber
Delphi-Quellcode:
 WPRichText1.InputString(#10);
 Key :=0;
war der entscheidende Tip!
Vielen Dank!

Ciao
Stefan

jziersch 26. Jun 2018 06:56

AW: KeyDown, KeyUp, KeyPress
 
Ja, die offizielle 8.05 ist inzwischen online.

Verbessert wurden die Textboxen, Berechnung der Tabellen-Zeilenhöhe im "Normal" Layout mode und diverse APIs.

Die genannte demo entspricht aber der Demo welche ich Ihnen per e-mail als ZIP am 6.6 sozusagen als Antwort auf diverse Posts im WPCubed Forum zugeschickt habe. Ich hatte die eigens erstellt um zu zeigen wie Textboxen im Header verankert werden, wie diese auf Folgeseiten dynamisch erzeugt werden.

Desweiteren zeigt die Demo wie Tabellenzeilen welche gerade bearbeitet werden hervorgehoben werden können. Dies passiert dort ohne dass der Text verändert wird, also ohne dass für jede Bewegung des Cursors die Formattierroutine aufgerufen werden muss.

Eine typische Anwendung für WPTools sind dynamische Kalkulationstabellen, Rechnungen und Angebote. Die API ist daher dafür angepasst und mehr als zwanzig Jahre Erfahrung stecken da drin.

sko1 26. Jun 2018 07:43

AW: KeyDown, KeyUp, KeyPress
 
Danke!

Jetzt habe ich die aktuelle 8.05 geladen und installiert, es gibt nun auch die genannte Demo :-)

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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