22 Stimmen

Lazarus: CMD-Taste im OnKeyDown unter Mac OS X

Frage von Gast | 24.03.2017 um 20:25

Für vieles, wofür man unter Windows die STRG-Taste benutzen würde, wird unter Mac OS X die CMD-Taste herangezogen.

In einem Lazarus Programm habe ich bisher im OnKeyDown-Ereignis etwas in der Form "if ((ssCtrl in Shift) and (Key = 65)) then ..." benutzt (siehe: mit STRG+A alles markieren).

Wie aber würde man das für Apple Mac OS X anpassen, damit es statt mit der STRG-Taste mit CMD läuft? Gibt es so etwas ähnliches wie ssCtrl für CMD? Die Konstante ssCMD scheint es leider nicht zu geben...

AntwortenPositivNegativ
2Beste Antwort2 Stimmen

Statt ssCtrl kannst du den ShiftState ssMeta unter Mac OS X benutzen. ssMeta steht für die CMD-Taste.

Dein Code würde dann zum Beispiel so aussehen:

procedure TForm1.Memo1KeyDown(Sender: TObject; 
  var Key: Word; Shift: TShiftState);
begin          
  if ((ssMeta in Shift) and (Key = 65)) then
    Memo1.SelectAll;  //alles markieren
end;

Wenn du deinen Code sowohl unter Windows als auch unter Mac OS X (oder Linux) kompilieren und verwenden möchtest ohne ihn zu ändern, kannst du Compiler-Switches verwenden:

procedure TForm1.Memo1KeyDown(Sender: TObject; 
  var Key: Word; Shift: TShiftState);
begin       
  {$IFDEF DARWIN} 
    if ((ssMeta in Shift) and (Key = 65)) then
  {$ELSE}
    if ((ssCtrl in Shift) and (Key = 65)) then 
  {$ENDIF}
    Memo1.SelectAll;  //alles markieren
end;

Unter Mac OS X wird der hinter "DARWIN" geschriebene Code kompiliert und damit die CMD-Taste, in allen anderen Fällen wird auf STRG geprüft.

Alternativ kannst du natürlich auch die gerade aktuelle Taste zwischenspeichern, dann kommst du mit nur einem Compiler-Switch aus.

var
  AModKey: TShiftState;

procedure TForm1.FormCreate(Sender: TObject);
begin       
  {$IFDEF DARWIN} 
    AModKey := ssMeta;
  {$ELSE}
    AModKey := ssCtrl;
  {$ENDIF}
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; 
  var Key: Word; Shift: TShiftState);
begin        
  if ((AModKey in Shift) and (Key = 65)) then
  Memo1.SelectAll;  //alles markieren
end;

Hier haben wir eine globale Variable AModKey definiert, die beim Erstellen unserer Form je nach Betriebssystem gesetzt wird. Später können wir in unseren Prozeduren nur noch auf AModKey prüfen und ersparen uns immer wieder eine Fallunterscheidung vorzunehmen.
25.03.2017 um 13:18

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Delphi: Systemweiter HotKey

Tutorial | 3 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.