eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von thosch »

Hallo,

ich habe eine Unit mit vordefinierten VK_xxx Werten.


Aber wie komme ich damit an Zeichen wie "?", "ß", "Ä", "Ö", "Ü", Semikolon, Stern und andere.

Ich habe ein Array keyboard aus 256 Boolean Werten. Wenn die jeweilige Zelle true ist, wurde die verinbarte Taste gedrckt, wenn losgelassen, wird der Wert wieder false.

Daraus habe ich folgende Abfrage konstruiert:

Code: Alles auswählen

    if keyboard[vk_a] and not pressed_a then begin
        if keyboard[vk_shift] or keyboard[vk_Rshift] then s:=s+'A' else s:=s+'a';
        pressed_a:=true;
    end;
    if not keyboard[vk_a] then pressed_a:=false;

    if keyboard[vk_b] and not pressed_b then begin
        if keyboard[vk_shift] or keyboard[vk_Rshift] then s:=s+'B' else s:=s+'b';
        pressed_b:=true;
    end;
    if not keyboard[vk_b] then pressed_b:=false;

    if keyboard[vk_c] and not pressed_c then begin
        if keyboard[vk_shift] or keyboard[vk_Rshift] then s:=s+'C' else s:=s+'c';
        pressed_c:=true
    end;
    if not keyboard[vk_c] then pressed_c := false;
    
    ...
    
So funktioniert das nun mit den Buchstaben "A" bis "Z" und den Zifferntasten. Dort erreiche ich auch die Zeichen über den Zifferntasten, die mit VK_SHIFT erreichbar sind. Ob auch die Zeichen mit VK_MENU (Alt) erreichbar sind, die Exponenten und die Klammern und das Mü, habe ich noch nicht getestet.

Ich erreiche aber definitiv NICGT das "^", "<", ">", ";", ":", "-", "+", ...

Warum ist das so uns was muss ich tun, um auch diese Zeichen zu erreichen?

Gibt es vielleicht auch für diese Zechen standardisierte vordefinierte Konstanten für Windows und Linux?

Wenn nicht, wie kann ich da eigene definieren.

Code: Alles auswählen

VK_LESSTHAN = system.ord("<");
tut es leider nicht. Warum tut es diese Definition nicht?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von Winni »

Hallo!


Für UTF8-Zeichen gibt es das Event UTF8KeyPress:

Code: Alles auswählen

procedure TForm1.Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
begin
  if UTF8Key= 'Ä' then showMessage ('Das war A-Umlaut');
end;    
Beachte dass der TUTF8Char ein String[7] ist.

Die mathematischen Zeichen und die Klammern sind weiter unten bei den VK_ Konstanten definiert:

VK_MULTIPLY = 106;
VK_ADD = 107;
VK_SEPARATOR = 108;
VK_SUBTRACT = 109;
VK_DECIMAL = 110;
VK_DIVIDE = 111;



Winni

.

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von thosch »

In welcher Unit finde de ich denn diese Werte und die Funktion UTF8keypress?

VK_DIVIDE ist der Slash "/" ? Richtig?

VK_Separator ist der "|" ?

VK_DECIMAL der Dezimalpunkt bzw. auf Deutscher Tastatur das Komma?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von wp_xyz »

Wie erreiche ich die Sonderzeichen?
Leaning by doing: Setze ein Memo und ein Edit aufs Formular. Dem Edit gibtst du einen Handler für OnKeyUp, der das letzte Zeichen des Edit-Strings sowie den Key-Wert und Shift-Werte in das Memo schreibt:

Code: Alles auswählen

uses
  LazUTF8, TypInfo;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  s: String;
begin
  s := UTF8Copy(Edit1.Text, UTF8Length(Edit1.Text), 1);
  s := s + ' --> ' + IntToStr(Key);
  if Shift <> [] then
    s := s + ' ' + SetToString(PTypeInfo(TypeInfo(TShiftState)), integer(Shift), true);
  Memo1.Lines.Add(s);
end;
Du siehst dann, dass die mehrfach belegten Tasten denselben VK Code haben und sich im Shift-Wert unterscheiden.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von siro »

Die VK_xxxx Konstanten findet man (unter anderem) in der Unit Windows,
aber man sollte besser die Unit LCLType verwenden, damit wird es wieder Systemunabhängig.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von MmVisual »

Du siehst dann, dass die mehrfach belegten Tasten denselben VK Code haben und sich im Shift-Wert unterscheiden.
Ich habe ein ähnliches Problem:
Ein 2D Codescanner an der Tastatur angeschlossen liefert alle möglichen Zeichen, die im 2D Code drin stehen. Nun kann man in dem besagten 2D Code auch alle möglichen Zeichen wie Sonderzeichen in UTF8 Format speichern (ganz böse), nur eben nicht ohne nachträgliche Wandlung wieder zurück holen.
Da nächste Problem der VK Codes und der Tastatur Eingabe ist die Abhängigkeit der Ländereinstellung vom Tastaturlayout. Ein Beispiel:
Die total einfache "µ" Taste (AltGr + m)
Da kommen dann dieser Code an (KD=KeyDown / KP=KeyPress):

Code: Alles auswählen

KD: 11 17   VK_CONTROL   ssCtrl
KD: 12 18   VK_MENU      ssAlt ssCtrl
KD: 4D 77   VK_M         ssAlt ssCtrl
KP: µ  C2 
Wenn man nun das ganze auf Englisch einstellt und das µ Zeichen nicht mehr beim m sondern wo anders steht, dann kommt entsprechend auch ein anderer Code von der Tastatur.

Daher rate ich dringend davon ab irgend welche Zeichen direkt aus den VK Codes ableiten zu wollen!

Weil das so dermaßen komplex ist und ich nachweisen möchte ob ein 2D Code Scanner "ordentlich" mit den 2D Codes umgehen kann habe ich dazu ein Dialog in meine Software "EleLa" einprogrammiert, so sieht es bei "ßµ" aus:
Bild1.png
Bild1.png (4.36 KiB) 2290 mal betrachtet
Lustig wird es auch wenn man ASCII Zeichen <32 überträgt, z.B. #13. Ja das geht mit ALT + 0013 vom Num-Block.

Ich empfehle nur die Funktion "OnFormUTF8KeyPress()" zu verwendet, alles andere funktioniert nicht, bzw. man darf dann sämtliche Tastaturlayouts von der ganzen Welt selbst nachbilden - und das ist fast schon eine Lebensaufgabe! (Außer dir ist extrem langweilig.)

VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von Winni »

Hi!

Ich hab Dir mal ne kleine Demo gemacht, die auf Keypress, KeyUp und UTF8Keypress reagiert.

Angezeigt wird der char, der Key-Wert, der UTF8char (if ...) und der ShiftState.

Hoffe es hilft Dir weiter.
Auf nicht-druckbare Zeichen wird keine Rücksicht genommen (Backspace, Cursor etc)

Winni
Dateianhänge
VK_keyDemo.zip
(126.39 KiB) 67-mal heruntergeladen

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von MmVisual »

Ein paar Funktionen die helfen:

Code: Alles auswählen

function ShiftStateToString(Shift: TShiftState): String;
Var s: String;
Begin
  s := '';
  If ssShift In Shift Then s := 'ssShift';
  If ssAlt In Shift Then s := s + ' ssAlt';
  If ssCtrl In Shift Then s := s + ' ssCtrl';
  If ssLeft In Shift Then s := s + ' ssLeft';
  If ssRight In Shift Then s := s + ' ssRight';
  If ssMiddle In Shift Then s := s + ' ssMiddle';
  If ssDouble In Shift Then s := s + ' ssDouble';
  If ssMeta In Shift Then s := s + ' ssMeta';
  If ssSuper In Shift Then s := s + ' ssSuper';
  If ssHyper In Shift Then s := s + ' ssHyper';
  If ssAltGr In Shift Then s := s + ' ssAltGr';
  If ssCaps In Shift Then s := s + ' ssCaps';
  If ssNum In Shift Then s := s + ' ssNum';
  If ssScroll In Shift Then s := s + ' ssScroll';
  If ssTriple In Shift Then s := s + ' ssTriple';
  If ssQuad In Shift Then s := s + ' ssQuad';
  If ssExtra1 In Shift Then s := s + ' ssExtra1';
  If ssExtra2 In Shift Then s := s + ' ssExtra2';
  Result := Trim(s);
end;

function WordToVKString(const iVKCode: Word): String;
Begin
  Case iVKCode Of
    0:      Result:= 'VK_UNKNOWN';
    1:      Result:= 'VK_LBUTTON';
    2:      Result:= 'VK_RBUTTON';
    3:      Result:= 'VK_CANCEL';
    4:      Result:= 'VK_MBUTTON';
    5:      Result:= 'VK_XBUTTON1';
    6:      Result:= 'VK_XBUTTON2';
    8:      Result:= 'VK_BACK';
    9:      Result:= 'VK_TAB';
    12:     Result:= 'VK_CLEAR';
    13:     Result:= 'VK_RETURN';
    16:     Result:= 'VK_SHIFT';
    17:     Result:= 'VK_CONTROL';
    18:     Result:= 'VK_MENU'; // 'VK_LCL_ALT'
    19:     Result:= 'VK_PAUSE';
    20:     Result:= 'VK_CAPITAL'; // 'VK_LCL_CAPSLOCK'
    21:     Result:= 'VK_KANA'; // 'VK_HANGUL'
    23:     Result:= 'VK_JUNJA';
    24:     Result:= 'VK_FINAL';
    25:     Result:= 'VK_KANJI'; // 'VK_HANJA'
    27:     Result:= 'VK_ESCAPE';
    28:     Result:= 'VK_CONVERT';
    29:     Result:= 'VK_NONCONVERT';
    30:     Result:= 'VK_ACCEPT';
    31:     Result:= 'VK_MODECHANGE';
    32:     Result:= 'VK_SPACE';
    33:     Result:= 'VK_PRIOR';
    34:     Result:= 'VK_NEXT';
    35:     Result:= 'VK_END';
    36:     Result:= 'VK_HOME';
    37:     Result:= 'VK_LEFT';
    38:     Result:= 'VK_UP';
    39:     Result:= 'VK_RIGHT';
    40:     Result:= 'VK_DOWN';
    41:     Result:= 'VK_SELECT';
    42:     Result:= 'VK_PRINT';
    43:     Result:= 'VK_EXECUTE';
    44:     Result:= 'VK_SNAPSHOT';
    45:     Result:= 'VK_INSERT';
    46:     Result:= 'VK_DELETE';
    47:     Result:= 'VK_HELP';
    $31:    Result:= 'VK_1';
    $30:    Result:= 'VK_0';
    $32:    Result:= 'VK_2';
    $33:    Result:= 'VK_3';
    $34:    Result:= 'VK_4';
    $35:    Result:= 'VK_5';
    $36:    Result:= 'VK_6';
    $37:    Result:= 'VK_7';
    $38:    Result:= 'VK_8';
    $39:    Result:= 'VK_9';
    $41:    Result:= 'VK_A';
    $42:    Result:= 'VK_B';
    $43:    Result:= 'VK_C';
    $44:    Result:= 'VK_D';
    $45:    Result:= 'VK_E';
    $46:    Result:= 'VK_F';
    $47:    Result:= 'VK_G';
    $48:    Result:= 'VK_H';
    $49:    Result:= 'VK_I';
    $4A:    Result:= 'VK_J';
    $4B:    Result:= 'VK_K';
    $4C:    Result:= 'VK_L';
    $4D:    Result:= 'VK_M';
    $4E:    Result:= 'VK_N';
    $4F:    Result:= 'VK_O';
    $50:    Result:= 'VK_P';
    $51:    Result:= 'VK_Q';
    $52:    Result:= 'VK_R';
    $53:    Result:= 'VK_S';
    $54:    Result:= 'VK_T';
    $55:    Result:= 'VK_U';
    $56:    Result:= 'VK_V';
    $57:    Result:= 'VK_W';
    $58:    Result:= 'VK_X';
    $59:    Result:= 'VK_Y';
    $5A:    Result:= 'VK_Z';
    $5B:    Result:= 'VK_LWIN';
    $5C:    Result:= 'VK_RWIN';
    $5D:    Result:= 'VK_APPS';
    $5F:    Result:= 'VK_SLEEP';
    96:     Result:= 'VK_NUMPAD0';
    97:     Result:= 'VK_NUMPAD1';
    98:     Result:= 'VK_NUMPAD2';
    99:     Result:= 'VK_NUMPAD3';
    100:    Result:= 'VK_NUMPAD4';
    101:    Result:= 'VK_NUMPAD5';
    102:    Result:= 'VK_NUMPAD6';
    103:    Result:= 'VK_NUMPAD7';
    104:    Result:= 'VK_NUMPAD8';
    105:    Result:= 'VK_NUMPAD9';
    106:    Result:= 'VK_MULTIPLY';
    107:    Result:= 'VK_ADD';
    108:    Result:= 'VK_SEPARATOR';
    109:    Result:= 'VK_SUBTRACT';
    110:    Result:= 'VK_DECIMAL';
    111:    Result:= 'VK_DIVIDE';
    112:    Result:= 'VK_F1';
    113:    Result:= 'VK_F2';
    114:    Result:= 'VK_F3';
    115:    Result:= 'VK_F4';
    116:    Result:= 'VK_F5';
    117:    Result:= 'VK_F6';
    118:    Result:= 'VK_F7';
    119:    Result:= 'VK_F8';
    120:    Result:= 'VK_F9';
    121:    Result:= 'VK_F10';
    122:    Result:= 'VK_F11';
    123:    Result:= 'VK_F12';
    124:    Result:= 'VK_F13';
    125:    Result:= 'VK_F14';
    126:    Result:= 'VK_F15';
    127:    Result:= 'VK_F16';
    128:    Result:= 'VK_F17';
    129:    Result:= 'VK_F18';
    130:    Result:= 'VK_F19';
    131:    Result:= 'VK_F20';
    132:    Result:= 'VK_F21';
    133:    Result:= 'VK_F22';
    134:    Result:= 'VK_F23';
    135:    Result:= 'VK_F24';
    $90:    Result:= 'VK_NUMLOCK';
    $91:    Result:= 'VK_SCROLL';
    $A0:    Result:= 'VK_LSHIFT';
    $A1:    Result:= 'VK_RSHIFT';
    $A2:    Result:= 'VK_LCONTROL';
    $A3:    Result:= 'VK_RCONTROL';
    $A4:    Result:= 'VK_LMENU'; // 'VK_LCL_LALT'
    $A5:    Result:= 'VK_RMENU'; // 'VK_LCL_RALT'
    $A6:    Result:= 'VK_BROWSER_BACK';
    $A7:    Result:= 'VK_BROWSER_FORWARD';
    $A8:    Result:= 'VK_BROWSER_REFRESH';
    $A9:    Result:= 'VK_BROWSER_STOP';
    $AA:    Result:= 'VK_BROWSER_SEARCH';
    $AB:    Result:= 'VK_BROWSER_FAVORITES';
    $AC:    Result:= 'VK_BROWSER_HOME';
    $AD:    Result:= 'VK_VOLUME_MUTE';
    $AE:    Result:= 'VK_VOLUME_DOWN';
    $AF:    Result:= 'VK_VOLUME_UP';
    $B0:    Result:= 'VK_MEDIA_NEXT_TRACK';
    $B1:    Result:= 'VK_MEDIA_PREV_TRACK';
    $B2:    Result:= 'VK_MEDIA_STOP';
    $B3:    Result:= 'VK_MEDIA_PLAY_PAUSE';
    $B4:    Result:= 'VK_LAUNCH_MAIL';
    $B5:    Result:= 'VK_LAUNCH_MEDIA_SELECT';
    $B6:    Result:= 'VK_LAUNCH_APP1';
    $B7:    Result:= 'VK_LAUNCH_APP2';
    $BA:    Result:= 'VK_OEM_1'; // 'VK_LCL_SEMI_COMMA'
    $BB:    Result:= 'VK_OEM_PLUS'; // 'VK_LCL_EQUAL'
    $BC:    Result:= 'VK_OEM_COMMA'; // 'VK_LCL_COMMA'
    $BD:    Result:= 'VK_OEM_MINUS'; // 'VK_LCL_MINUS'
    $BE:    Result:= 'VK_OEM_PERIOD'; // 'VK_LCL_POINT'
    $BF:    Result:= 'VK_OEM_2'; // 'VK_LCL_SLASH'
    $C0:    Result:= 'VK_OEM_3'; // 'VK_LCL_TILDE'
    $DB:    Result:= 'VK_OEM_4'; // 'VK_LCL_OPEN_BRAKET'
    $DC:    Result:= 'VK_OEM_5'; // 'VK_LCL_BACKSLASH'
    $DD:    Result:= 'VK_OEM_6'; // 'VK_LCL_CLOSE_BRAKET'
    $DE:    Result:= 'VK_OEM_7'; // 'VK_LCL_QUOTE'
    $DF:    Result:= 'VK_OEM_8';
    $E2:    Result:= 'VK_OEM_102';
    $E7:    Result:= 'VK_PROCESSKEY';
    $F6:    Result:= 'VK_ATTN';
    $F7:    Result:= 'VK_CRSEL';
    $F8:    Result:= 'VK_EXSEL';
    $F9:    Result:= 'VK_EREOF';
    $FA:    Result:= 'VK_PLAY';
    $FB:    Result:= 'VK_ZOOM';
    $FC:    Result:= 'VK_NONAME';
    $FD:    Result:= 'VK_PA1';
    $FE:    Result:= 'VK_OEM_CLEAR';
    $FF:    Result:= 'VK_UNDEFINED';
    $100:   Result:= 'VK_LCL_POWER';
    $101:   Result:= 'VK_LCL_CALL';
    $102:   Result:= 'VK_LCL_ENDCALL';
    $103:   Result:= 'VK_LCL_AT';
    $FFFF:  Result:= 'VK_HIGHESTVALUE';
  End;
End;
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von Winni »

Hi

Shiftstate nach String geht mit weniger Gezappel:

Code: Alles auswählen

function Shift2String(Shift: TShiftState): string;
var sh: TShiftStateEnum;
    tmp: string;
begin
result := '';
for sh in shift do
    begin
    writestr(tmp,sh);
    result := result+tmp+#32;
    end;
  result := '['+result+']';
end;



Mit den Vk_ Konstnten geht das leider nicht, da die kein Enumeration Typ sind, sondern einzelne Konstanten.

Winni

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von MmVisual »

Guter Tipp, Woher kommt das "writestr"?
Ist das im FPC als Builtin irgendwie drin? Es gibt ja keine Unit dazu.
... ist ja viel einfach er aus einem Enum ein String zu bekommen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von wp_xyz »

Winni hat geschrieben:
So 31. Okt 2021, 18:50
Shiftstate nach String geht mit weniger Gezappel:
Oder als 1-Zeiler mit RTTI - siehe SetToString in meinem Code-Schnipsel etwas weiter oben.

Code: Alles auswählen

uses
  TypInfo;
  
function ShiftStateToString(AShift: TShiftState): String;
begin
  Result := SetToString(PTypeInfo(TypeInfo(TShiftState)), integer(AShift), true);
end; 

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von Winni »

MmVisual hat geschrieben:
So 31. Okt 2021, 19:02
Guter Tipp, Woher kommt das "writestr"?
Ist das im FPC als Builtin irgendwie drin? Es gibt ja keine Unit dazu.
... ist ja viel einfach er aus einem Enum ein String zu bekommen.
Hi!

Natürlich hat writestr eine unit - nämlich die unit system. Die wir automatisch eingebunden.

https://www.freepascal.org/docs-html/rt ... testr.html

Winni

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von MmVisual »

SetToString ...

Thx!
EleLa - Elektronik Lagerverwaltung - www.elela.de

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: eigene VK_xxx Werte definieren oder wie erreiche ich die Sonderzeichen?

Beitrag von PascalDragon »

thosch hat geschrieben:
So 31. Okt 2021, 09:44
Aber wie komme ich damit an Zeichen wie "?", "ß", "Ä", "Ö", "Ü", Semikolon, Stern und andere.
Wichtiger Punkt: Die VK_*-Konstanten bezeichnen keine Zeichen, sondern Tasten. Das heißt zum Beispiel VK_Z erzeugt auf einer deutschen Tastatur ein y. Entsprechendes gilt für die Tasten auf denen auf einer deutschen Tastatur z.B. die Umlaute liegen. Diese heißen nicht einfach VK_AE oder so, sondern tragen sprachneutrale Namen.
thosch hat geschrieben:
So 31. Okt 2021, 09:44

Code: Alles auswählen

VK_LESSTHAN = system.ord("<");
tut es leider nicht. Warum tut es diese Definition nicht?
Erstens wäre es aus oben genannten Grund falsch (der ASCII Code von '<' ist was anderes als der Code der Taste, mit der auf einer deutschen Tastatur '<' erzeugt wird) und außerdem kennt Pascal keine doppelten Anführungszeichen für Strings, es wäre also wenn überhaupt:

Code: Alles auswählen

VK_LESSTHAN = System.Ord('<');
Winni hat geschrieben:
So 31. Okt 2021, 19:53
MmVisual hat geschrieben:
So 31. Okt 2021, 19:02
Guter Tipp, Woher kommt das "writestr"?
Ist das im FPC als Builtin irgendwie drin? Es gibt ja keine Unit dazu.
... ist ja viel einfach er aus einem Enum ein String zu bekommen.
Hi!

Natürlich hat writestr eine unit - nämlich die unit system. Die wir automatisch eingebunden.

https://www.freepascal.org/docs-html/rt ... testr.html
Aber MmVisual wird es mit Suche Deklaration trotzdem nicht in der System-Unit finden, da der Bezeichner rein vom Compiler bereitgestellt ist.
FPC Compiler Entwickler

Antworten