![]() |
Delphi-Version: XE2
Shortcut per Komponente erkennen und zuordnen
Hallo zusammen,
ich schraube gerade an einer kleinen Erweiterung eines TPopupmenu. Sie soll dazu dienen, Textbausteine zur Verfügung zu stellen. Eigentlich ist soweit alles fertig. Das Popupmenu kann so ziemlich allen editierbaren Komponenten zugewiesen werden, und legt nach Auswahl seinen Textbaustein an Cursorposition ab. Wenn man es denn per Maus bedient. Nun also die Frage: Wie bekomme ich es hin, daß die Komponente auf einen (beliebigen, konfigurierbaren) Shortcut zum öffnen dieses Popups reagiert? Ich weiss, daß es dazu eine Taste auf 99% aller Win-Keyboards gibt. Ich hätte halt gerne die Möglichkeit (weil unsere Anwender es so gewohnt sind) Ctrl+T zum Öffnen des Menüs zu drücken. Bisher müsste das über das KeyDown-Ereignis der "Mutterkomponente" geregelt werden. Also so:
Delphi-Quellcode:
Wäre schön, wenn man das künftig in die Komponente packen könnte.
if (ssctrl in Shift) and (Key = ord('T')) then
begin MeinPunkt.X := 0; MeinPunkt.Y := 0; GetCaretPos(MeinPunkt); // Popup-Menü anzeigen SendMessage(TWinControl(Sender).Handle, WM_RBUTTONDOWN, 0, 0); SendMessage(TWinControl(Sender).Handle, WM_RBUTTONUP, wparam(MK_RBUTTON), MakeLong(MeinPunkt.x, MeinPunkt.y)); end; Grüßle. Sherlock |
AW: Shortcut per Komponente erkennen und zuordnen
Entweder hängt sich dein Popup in die Messagebehandlung der Komponente(n) rein, wo es angehängt wurde,
oder es gängt sich ins KeyPreview der Form, oder in TApplicationtEvents.OnMessage und schaut dort nach der Tastenkombi, oder es registriert sich einen globalen Shortcut. Gibt TMemo.CaretPos (GetCaretPos) nicht die Position in Zeile:Spalte zurück? Ich dachte das Popup benötigt allerding X:Y in Pixeln und das auch noch in Screen-Koordinaten, anstatt in Komponenten-Koordinaten. :gruebel: (ClientToScreen) Und besser wäre
Delphi-Quellcode:
, denn sonst reagiert der Vergleich auch auf Strg+Alt+T oder auf AltGr+T.
if (Shift = [ssCtrl]) and (Key = Ord('T')) then
PS:
Delphi-Quellcode:
PopupMenu.PopupComponent := Self; {z.B. das Memo, also falls man im OnPopup auf das PopupComponent zugreifen will, um zu wissen in welchem Control das Popup aufgemacht wurde}
PopupMenu.Popup(X, Y); |
AW: Shortcut per Komponente erkennen und zuordnen
Also das mit der CaretPos benötige ich, weil ich an der Cursorposition den Textbaustein einfügen möchte. Es funktioniert ja soweit auch, nur daß ich derzeit die obige Methode im KeydownEvent jeder betroffenen Komponente bekannt machen muss. In Messagebehandlung reinhängen...das hört sich interessant an. Ich mach mich auf die Suche, wie man das tut. Danke!
Sherlock |
AW: Shortcut per Komponente erkennen und zuordnen
Und wenn das Popup mal "richtig" aufgerufen wird, also mit den "richtigen" Koordinaten des Mauszeigers Popuppunktes, an welchem das Popup aufgemacht wird?
Im Beispielcode des manuellen Aufrufs hatte ich nicht umsonst das PopupComponent gesetzt, welches Delphi ebenfalls setzt, wenn ein Popup automatisch aufgerufen wird.
Delphi-Quellcode:
(PopupMenu.PopupComponent as TMemo).CaretPos
Wobei ich mir gewünscht hätte, man täte das als Parameter, in der Popup-Methode, mit anbieten. :stupid: |
AW: Shortcut per Komponente erkennen und zuordnen
Hmmm, also wenn es richtig aufgerufen wird, dann wird das doch über die PopupMenu Property des jeweiligen Controls erledigt. Da greift der "manuelle" Aufruf doch gar nicht. :gruebel:
Bin mittlerweile soweit, daß ich einen ApplicationHook versthe, muss das jetzt "nur noch" runter brechen auf einen "ComponentHook". Sherlock |
AW: Shortcut per Komponente erkennen und zuordnen
Laut dem
![]() Bzw. besser nur eine globale Instanz (Singleton für alle deine Popups), welche in Screen.ActiveControl nach einem Popup sucht (also ob da Eines dran hängt) und dann Dieses aufruft. (direkt an Application.OnShortCut hängen geht auch, aber sowas sollte man besser lassen, da es dieses Event nur einmal gibt) |
AW: Shortcut per Komponente erkennen und zuordnen
Ist mir am Ende für ein kleines Bisschen Komfort zu kompliziert gewesen. Habs gelassen, und machs wie bisher auch. Danke für die Hilfe, Himitsu.
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz