Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Namen der virtuellen Tastencodes (https://www.delphipraxis.net/74525-namen-der-virtuellen-tastencodes.html)

Flocke 5. Aug 2006 09:53

Re: Namen der virtuellen Tastencodes
 
Zitat:

Zitat von xaromz
Blöderweise mag mich allerdings die Alt-Taste nicht.

Dafür musst du die Meldung WM_SYSKEYDOWN nehmen (hat dieselben Parameter).

Mazel 5. Aug 2006 09:59

Re: Namen der virtuellen Tastencodes
 
Hi,

das funktioniert leider nur, wenn ich keine weiteren Objekte auf meiner Form habe, sonst bekomme ich keinen Key zurück. Leider wird dann auch nicht die Kombination wie STRG+ALT+F angezeigt, sondern nur STRG.
Immer wenn ich eine Kombination drücke soll diese auch angezeigt werden, sonst würden Hotkeys keinen sinn machen, denn man sollte schon sehen welchen Hotkey man benutzt.
Zitat:

Zitat von Mazel
Nur bei folgender Version bekomme ich die Namen in das Editfeld mit dem Problem das es doppelt hinein geschrieben wird:
Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  TempShortCut: TShortCut;

begin
  TempShortCut:=ShortCut(Key, Shift);
  EditHotkey.Text:=ShortCutToText(TempShortCut);
end;
Weis jemand wo die Fehler liegen?

Wenn das nicht mehr doppelt hineingeschrieben werden würde, wär das die optimale Lösung für mein Problem.

Gruß
Mazel

Hawkeye219 5. Aug 2006 10:51

Re: Namen der virtuellen Tastencodes
 
Hallo Mazel,

vielleicht läßt sich dein Problem mit einem kleinen Kniff lösen:

Delphi-Quellcode:
function ShiftKeyToStr (aShift: TShiftState; aKey: Word): string;
var
  SC : TShortCut;
begin
  if (aKey in [VK_SHIFT, VK_CONTROL, VK_MENU]) then
    begin
      SC := ShortCut(Ord('A'), aShift);
      Result := ShortCutToText(SC);
      SetLength (Result, Length(Result) - 2);
    end
  else
    begin
      SC := ShortCut(aKey, aShift);
      Result := ShortCutToText(SC);
    end;
end;
Gruß Hawkeye

Mazel 5. Aug 2006 12:22

Re: Namen der virtuellen Tastencodes
 
Hi,

danke, das funktioniert super :thumb: . Genau das was ich gebraucht habe. Nun habe ich aber eine Frage: Warum muss ich den Buchstaben A hier in dieser funktion verwenden? Ich hatte eine einfachere aber ähnliche Ansatzweise, nur hatte ich als Key den Integer-Wert NULL (0) genommen, da ist nichts passiert, soll das der Grund gewesen sein?

Gruß
Mazel

Hawkeye219 5. Aug 2006 13:27

Re: Namen der virtuellen Tastencodes
 
Man hätte auch jede andere Taste verwenden können. Wichtig ist nur, daß eine gültige Tastenkombination entsteht, damit die Umschalttasten in der richtigen Schreibweise zurückgeliefert werden. Mit einem Buchstaben ist es besonders einfach und zudem unabhängig von der Sprache.

Gruß Hawkeye

Mazel 5. Aug 2006 17:56

Re: Namen der virtuellen Tastencodes
 
Danke für die Infos.

Es müsste doch nun auch möglich sein, das ganze rückwärts aufzuschlüsseln. Ich habe folgendes vor, hier ein Beispiel:

Wenn ich in einem Editfeld die Tasten STRG, ALT und UMSCHALT drücke und keine weitere Taste, dann soll das Editfeld wieder frei werden. Momentan ist es so das bei dem gleichzeitigen drücken dieser Tasten sie dank Hawkeye219 in dem Editfeld eingetragen werden, beim loslassen allerdings sollen alle Tastenkombinanten die nur aus STRG, ALT oder UMSCHALT bestehen wieder gelsöcht werden. Folgendes habe ich probiert aber das geht nicht richtig (in OnKeyUp):
Delphi-Quellcode:
If (ssAlt in Shift) and (ssShift in Shift) and (ssCtrl in Shift) then EditHotkey.Text:=''
Ich hatte auch dies ausprobiert aber da kommt eine Fehlermeldung "[Fehler] Form_7.pas(297): Inkompatible Typen: 'TShiftState' und 'Enumeration'":
Delphi-Quellcode:
If (Shift in [ssShift, ssCtrl, ssAlt]) then EditHotkey.Text:=''
Wie kann ich das nun lösen?

Gruß
Mazel

Mazel 5. Aug 2006 18:38

Re: Namen der virtuellen Tastencodes
 
:wall: :wall: :wall: :wall:

Ich habe so eben mitbekommen, dass es eine Komponente names Hotkey auf dem Reiter Win32 (Delphi 6) gibt, die all das macht was ich brauche. Warum habe ich das nicht früher bemerkt, dann hätten wir uns die ganze Arbeit sparen können :wink: .

Dadurch hat sich nun fast alles erledigt. Nun habe ich noch ein kleines Problem: Ich habe in einer ListView die Hotkeys stehen, die sollen nun durch diese Komponente geändert werden, was ich über TextToShortCut und ShortCutToText mache. Wenn ich auf einen Eintrag in der ListView klicke, soll der Hotkey in die Hotkey Komponente eingetragen werden, das Problem ist aber, dass er mit den falschen Hotky zurück liefert:
Delphi-Quellcode:
// beim Klick auf den Eintrag
procedure TForm7.ListViewClick(Sender: TObject);
begin
 EditAction.Text:=ListView.Selected.Caption;
 EditHotkey.HotKey:=TextToShortCut(ListView.Selected.SubItems[0]);
end;
Wenn STRG + ALT + EINFG im Eintrag steht, wird mir STRG + ALT + 0 (ZEHNERTASTATUR) zurück geliefert, wo ist mein Fehler?

Gruß
Mazel

Hawkeye219 5. Aug 2006 19:42

Re: Namen der virtuellen Tastencodes
 
Zitat:

Zitat von Mazel
Ich habe so eben mitbekommen, dass es eine Komponente names Hotkey auf dem Reiter Win32 (Delphi 6) gibt, die all das macht was ich brauche.

Nach deinem vorletzten Beitrag wollte ich dir genau diese Komponente vorschlagen, aber mit deinem letzten Beitrag bist du mir zuvorgekommen.

Zu deinem Problem: die Tastenkombinationen 'Strg+Alt+Einfg' und 'Strg+Alt+0(Zehnertastatur)' unterscheiden sich (mit NUMLOCK off) nur durch die Modifier. Du wirst diese Eigenschaft von THotkey also mit abspeichern und beim Auswählen eines Listeneintrags wieder setzen müssen. Leider werden die Modifier dadurch für nachfolgende Eingaben in THotkey erzwungen. Mit einem Löschbutton gibst du dem Anwender die Möglichkeit, das Eingabefeld komplett (inklusive Modifier) zu löschen.

Im folgenden Beispielcode wird die Eingabe in einer globalen Variablen gespeichert. Sehr wichtig ist die Reihenfolge der Anweisungen in den Routinen btnLoadHotkey und btnClearHotkey.

Delphi-Quellcode:
var
  ShortCut : TShortCut;
  Modifier : THKModifiers;

procedure TForm1.btnSaveHotkey (Sender: TObject);
begin
  ShortCut := HotKey1.HotKey;
  Modifier := HotKey1.Modifiers;
end;

procedure TForm1.btnLoadHotkey (Sender: TObject);
begin
  HotKey1.HotKey := ShortCut;
  HotKey1.Modifiers := Modifier;
end;

procedure TForm1.btnClearHotkey (Sender: TObject);
begin
  HotKey1.Modifiers := [];
  HotKey1.HotKey := 0;
end;
Gruß Hawkeye

Mazel 5. Aug 2006 19:50

Re: Namen der virtuellen Tastencodes
 
Hi,

ich weis nicht wieso ich das nicht früher bemerkt habe mit der Komponente aber nun zum Thema:

Wann muss ich nun die einzelnen Prozeduren ausführen?

Zitat:

Zitat von Hawkeye219
Mit einem Löschbutton gibst du dem Anwender die Möglichkeit, das Eingabefeld komplett (inklusive Modifier) zu löschen.

Wie meinst du das? Löschen wollte ich keinen Hotkey.

Gruß
Mazel

Hawkeye219 5. Aug 2006 20:10

Re: Namen der virtuellen Tastencodes
 
Wenn du einen vom Anwender eingegebenen Hotkey speichern möchtest, mußt du die Eigenschaften Hotkey und Modifiers von THotkey sichern. Nur durch die Kombination beider Werte wird ein Hotkey eindeutig beschrieben. Im Beispielcode passiert das in der Methode btnSaveHotkey.

Nach der Auswahl eines Eintrags in der ListView müssen die mit dem Eintrag gespeicherten Werte in das THotkey-Control zurückgeschrieben werden (Routine btnLoadHotkey). Wichtig ist hier die Reihenfolge der beiden Anweisungen.

Wenn du eine Tastenkombination wie 'Strg+Alt+Einfg' in das THotkey-Control überträgst, wirst du feststellen, daß bei allen folgenden Eingaben die Modifier 'Strg' und 'Alt' auch dann ergänzt werden, wenn der Anwender sie nicht benutzt. Damit der Anwender diese Modifier wieder löschen kann, habe ich den Löschbutton vorgeschlagen (Routine btnClearKey). Mir ist kein anderer Weg bekannt, die Eigenschaft Modifiers zurückzusetzen, um "normale" Eingabe wie "F1" wieder zu ermöglichen. Auch hier ist die Reihenfolge der beiden Anweisungen wichtig; sie unterscheidet sich von der beim Setzen eines Hotkeys.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Seite 2 von 3     12 3      

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