AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Shortcut per Komponente erkennen und zuordnen
Thema durchsuchen
Ansicht
Themen-Optionen

Shortcut per Komponente erkennen und zuordnen

Ein Thema von Sherlock · begonnen am 11. Aug 2014 · letzter Beitrag vom 11. Aug 2014
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#1

Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 09:12
Delphi-Version: XE2
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:
  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;
Wäre schön, wenn man das künftig in die Komponente packen könnte.

Grüßle.
Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 10:06
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. (ClientToScreen)


Und besser wäre if (Shift = [ssCtrl]) and (Key = Ord('T')) then , denn sonst reagiert der Vergleich auch auf Strg+Alt+T oder auf AltGr+T.

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);
$2B or not $2B

Geändert von himitsu (11. Aug 2014 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#3

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 10:29
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 10:43
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.
(PopupMenu.PopupComponent as TMemo).CaretPos

Wobei ich mir gewünscht hätte, man täte das als Parameter, in der Popup-Methode, mit anbieten.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#5

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 11:08
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.
Bin mittlerweile soweit, daß ich einen ApplicationHook versthe, muss das jetzt "nur noch" runter brechen auf einen "ComponentHook".

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 11:15
Laut dem http://stackoverflow.com/questions/3...ding-menu-item brauchst du nur eine TApplicationEvents-Instanz in deine Komponente reinmachem und dort das OnShortCut implementieren.
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)
$2B or not $2B

Geändert von himitsu (11. Aug 2014 um 11:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#7

AW: Shortcut per Komponente erkennen und zuordnen

  Alt 11. Aug 2014, 13:55
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 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