Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OnKeyDown: Tastendruck abbrechen (https://www.delphipraxis.net/44327-onkeydown-tastendruck-abbrechen.html)

yankee 17. Apr 2005 22:04


OnKeyDown: Tastendruck abbrechen
 
Ich habe in meinem Editor zu dem Zweck der HTML-encodierung die Möglichkeit eingebaut, dass Sonderzeichen automatisch codiert werden können. D.h. wenn man auf ö drückt, erscheint direkt ö Das ist in einem onkeydown-event. Das funktioniert auch soweit, aber das ö kommt hinter dem codierten Umlaut trotzdem. Ich habe probiert key einfach 0 (null) zuzuweisen, aber das hat nichts geändert...
Also, was muss ich machen?

gordon freeman 17. Apr 2005 22:14

Re: OnKeyDown: Tastendruck abbrechen
 
Delphi-Quellcode:
procedure TForm1.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key = 'ö' then
   begin
   //füge Sonderzeichencode ein
   key := #0;
  end;
end;
So (oder so ähnlich) sollte es gehen. Zeig doch mal etwas Code, wie es bei dir aussieht.

yankee 17. Apr 2005 22:23

Re: OnKeyDown: Tastendruck abbrechen
 
So (oder so ähnlich) sollte es gehen. Zeig doch mal etwas Code, wie es bei dir aussieht.[/quote]
Ok, wenn du willst. alleridngs ist es bei mir niocht so einfach wie in deinem Beispiel. Denn der User soll einstellen können, welche Zeichen ecodiert werden sollen und diese werden in einem array aufbewahrt. Naja, key ist außerdem vom Typ word und nicht char:
Delphi-Quellcode:
//der Variablentyp:
  THotKeyItem =record
    Taste: TShortCut;
    gridLine: TStrings; //fungiert als Objektzeiger auf Ein Stringgrid
  end;

//globale Variable:
var umlautliste: array of THotKeyItem;
//gloabel Konstanten:
const
  AUSGABE =1;
  TEXTTASTE =0;

//die onkeydown-procedure:
procedure TEditorForm.SynEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var tastenkombi :TShortcut;
    i:integer;
begin
    if confForm.CheckBox2.Checked then //das ist nur ob tastenencoding aktiviert ist.
    begin
        tastenkombi :=ShortCut(Key, Shift);
        for i:=0 to length(umlautliste)-1 do with umlautliste[i] do if taste =tastenkombi then
        begin
            Synedit1.SelText :=gridLine[AUSGABE];
            key :=0;
            exit;
        end;
    end;
end;
Mir fällt auf, das record nicht fett hervorgehoben wird. Direkt mal in der DP-Fragen sparte meckern ;-)

yankee 18. Apr 2005 22:35

Re: OnKeyDown: Tastendruck abbrechen
 
*hochschieb*
bitte einer erklären!

bigg 18. Apr 2005 23:22

Re: OnKeyDown: Tastendruck abbrechen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe dir mal eine kleine unoptimierte Demo zusammengeklickert.
Und das ist das Ergebnis.

Waldteufel 19. Apr 2005 12:32

Re: OnKeyDown: Tastendruck abbrechen
 
Hi.

@yankee: Nimm anstatt des Arrays ein set of char... Da kannst du ganz einfach mit in prüfen und mit Include/Exclude einfügen/rauslöschen ;-)

Mal ein Beispiel, wie man kein Zeichen 2x direkt hintereinander eingeben kann... ;-)

Delphi-Quellcode:
var
  s : set of char;

function IsOkay(c : char) : boolean;
begin
  if c in s then
  begin
    Exclude(s, c);
    return false;
  end
  else if not (c in s) then
  begin
    Include(s, c);
    return true;
  end;
end;

Dax 19. Apr 2005 13:03

Re: OnKeyDown: Tastendruck abbrechen
 
[OT]Ja, so ein gemisch aus Pascal und C# hat was für sich ;)[/OT]

yankee 19. Apr 2005 13:08

Re: OnKeyDown: Tastendruck abbrechen
 
Aber ihr verwendet alle onkeypress und ich onkeydown. Und mit onkeypress komme ich an Strg, Shift undso doch nicht darn, oder?
Und ich will dem User das ja nicht vorschreiben. In einem PHP- HTML -JavaScript-gemischten qt kann es ja auch interessanter sein, wenn man sich die Sonderzeichen auf Strg + ö legt oder sowas.
Naja, ich habe es jetzt jedenfalls so gelöst:
Delphi-Quellcode:
Synedit1.SelText :=gridLine[AUSGABE]+' '; //der Umlaut + ein Leerzeichen
key :=VK_BACK; //Backspace (entfernt das Leerzeichen wieder.)
exit;
Nicht wirklich elegant, aber es funktioniert.

EDIT: @Waldteufel: Ich habe jetzt den Zusammenhang zu meiner Frage nicht so richtig verstanden...


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