![]() |
Onclick und rechte Maustaste!
Hallo,
wie kann ich bei einem OnClick-Event prüfen ob die rechte oder linke maustaste geklickt wurde. denn ein onmousedown oder so steht mir bei der komponente nicht zur verfügung! Es geht darum, ich will einem MainMenu-Eintrag der zur Laufzeit erstellt wurde ein bestimmtes Popup hinzufügen! Wenn jemand eine andere Lösung kennt, wäre ich auch zu frieden!!! ???? Danke |
Re: Onclick und rechte Maustaste!
Hi,
mir würde jetzt am ehesten einfallen, dass du einfach die Komponente ableitest. In der abgeleiteten Komponente erstellst du dann eine Methode, die auf Windows-Botschaften reagiert. Hier kannst du dann einfach auf das klicken der Linken oder Rechten Maustaste reagieren.
Delphi-Quellcode:
Gut, was soll ich da noch erklären? Sollte funktionieren, bin mir aber bei Typ der auftretenden Nachricht nicht sicher, müsstest du mal gucken ob die funktioniert.
type
TExtendedMainMenue = class(TMainMenue) private procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; end; Gruß Der Unwissende |
Re: Onclick und rechte Maustaste!
danke, aber da ich mit komponenten-programmierung net so gut auskenne bin ihc nur soweit gekommen
Delphi-Quellcode:
Wie muss denn der Code für die Prozeduren aussehen! Wichtig ist auch das ein Sender vorhanden ist, damit ich auch weiß auf welchen item geklickt wurde!
unit AdvMainMenu;
interface uses Windows, Menus, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAdvMainMenu = class(TMainMenu) private { Private-Deklarationen } procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TAdvMainMenu]); end; constructor TAdvMainMenu.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMainMenu.Destroy; begin inherited Destroy; end; kannst mir da noch weiter helfen??? |
Re: Onclick und rechte Maustaste!
Hallo!
Also ich bin mir nicht sicher, aber gehören die zwei Prozeduren LeftMouseButtonDown und RightMouseButtonDown nicht nach published? Grüße Faux |
Re: Onclick und rechte Maustaste!
Hallo,
Zitat:
Gruß xaromz |
Re: Onclick und rechte Maustaste!
Zitat:
Wie würde dann diese Prozedur aussehen? |
Re: Onclick und rechte Maustaste!
Delphi-Quellcode:
published
property OnLeftMouseButtonClicked: TNotifyEvent read FOnLeftMouseButtonClicked write FOnLeftMouseButtonClicked; // Kann auch was anderes als TNotifyEvent sein ;) end; [...] procedure LeftMouseButtonDown(var Msg : TMouseInput); begin if Assigned(FOnLeftMouseButtonClicked) then FOnLeftMouseButtonClicked(Self); end; |
Re: Onclick und rechte Maustaste!
Hallo,
ich würde im protected Abschnitt die Methoden DoLeftMouseButtonDown und DoRightMouseButtonDown einführen. Das vereinfacht das Überschreiben der Events in Nachfahren erheblich.
Delphi-Quellcode:
unit AdvMainMenu;
interface uses Windows, Menus, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAdvMainMenu = class(TMainMenu) private { Private-Deklarationen } FOnLMBClicked: TNotifyEvent; FOnRMBClicked: TNotifyEvent; procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } procedure DoLeftMouseButtonDown(var Msg : TMouseInput); dynamic; procedure DoRightMouseButtonDown(var Msg : TMouseInput); dynamic; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property OnLMBClick: TNotifyEvent read FOnLMBClicked write FOnLMBClick; property OnRMBClick: TNotifyEvent read FOnRMBClicked write FOnRMBClick; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TAdvMainMenu]); end; constructor TAdvMainMenu.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMainMenu.Destroy; begin inherited Destroy; end; procedure TAdvMainMenu.DoLeftMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnLMBClicked) then FOnLMBClicked(Self); end; procedure TAdvMainMenu.DoRightMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnRMBClicked) then FOnRMBClicked(Self); end; procedure TAdvMainMenu.LeftMouseButtonDown(var Msg: TMouseInput); begin DoLeftMouseButtonDown(Msg); end; procedure TAdvMainMenu.RightMouseButtonDown(var Msg: TMouseInput); begin DoRightMouseButtonDown(Msg); end; end. |
Re: Onclick und rechte Maustaste!
Hallo, nochmal zurück zum eigentlichen Problem.
Zitat:
Delphi-Quellcode:
Silvestergrüße vom marabu
procedure AddMenuItems(miTake, miGive: TMenuItem);
var i: integer; mi: TMenuItem; begin // get rid of existing items miTake.Clear; for i := 0 to Pred(miGive.Count) do begin // create new menuItem mi := TMenuItem.Create(miTake); // share action with popup menuItem mi.Action := miGive[i].Action; // associate new item with menu miTake.Add(mi); end; end; procedure TDemoForm.FormCreate(Sender: TObject); var mi: TMenuItem; begin // dynamic creation of menuItem mi := NewItem('&Test', TextToShortCut(''), false, true, nil, 0, ''); // make right most dropdownMenu MainMenu.Items.Add(mi); // populate dropdownMenu from popupMenu AddMenuItems(mi, PopupMenu.Items); end; |
Re: Onclick und rechte Maustaste!
@ Jens Schumann
Danke, das funzt soweit, allerdings habe ich die OnLMBClick und OnRMBClick nur auf dem Mainmenü und nicht auf den Items! Ich brauch das auch auf den Items??? Kannst mir da helfen! Achja, die Komponente funzt zwar jetzt, aber wenn ich die einträge dynamisch erstellen, bleibt das mainmenü leer! fehlt da vielleicht was bei constructor Create(AOwner: TComponent); override; @ marabu Sinnvoll ist das schon. Nehmen wir mal den Favoritenliste im Firefox oder IE, dort bekommt auf einem Order ein anderes popup als wie auf einem link. ist zwar sowas wie ne toolbar, aber will das für ein Mainmenü! |
Re: Onclick und rechte Maustaste!
also wenn ich das auf ein item legen will, muss ich doch dann noch extra ne klasse ableiten.
aber von welcher, den TMenuItem gibts ja nicht zum ableiten???? |
Re: Onclick und rechte Maustaste!
Zitat:
Jedenfalls solltest du kein Problem damit haben TMenuItem abzuleiten. Gruß Der Unwissende |
Re: Onclick und rechte Maustaste!
mmhh und wie dann, so lässt es sich zwar kompilieren, aber die eregnisse seh ich aber ne:
Delphi-Quellcode:
???
unit AdvMainMenu;
interface uses Windows, Menus, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAdvMainMenu = class(TMainMenu) private { Private-Deklarationen } FOnLMBClicked: TNotifyEvent; FOnRMBClicked: TNotifyEvent; procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } procedure DoLeftMouseButtonDown(var Msg : TMouseInput); dynamic; procedure DoRightMouseButtonDown(var Msg : TMouseInput); dynamic; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property OnLMBClick: TNotifyEvent read FOnLMBClicked write FOnLMBClicked; property OnRMBClick: TNotifyEvent read FOnRMBClicked write FOnRMBClicked; end; TAdvMenuItem = class(TMenuItem) private { Private-Deklarationen } FOnLMBClicked: TNotifyEvent; FOnRMBClicked: TNotifyEvent; procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } procedure DoLeftMouseButtonDown(var Msg : TMouseInput); dynamic; procedure DoRightMouseButtonDown(var Msg : TMouseInput); dynamic; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property OnLMBClick: TNotifyEvent read FOnLMBClicked write FOnLMBClicked; property OnRMBClick: TNotifyEvent read FOnRMBClicked write FOnRMBClicked; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TAdvMainMenu]); end; constructor TAdvMainMenu.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMainMenu.Destroy; begin inherited Destroy; end; procedure TAdvMainMenu.DoLeftMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnLMBClicked) then FOnLMBClicked(Self); end; procedure TAdvMainMenu.DoRightMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnRMBClicked) then FOnRMBClicked(Self); end; procedure TAdvMainMenu.LeftMouseButtonDown(var Msg: TMouseInput); begin DoLeftMouseButtonDown(Msg); end; procedure TAdvMainMenu.RightMouseButtonDown(var Msg: TMouseInput); begin DoRightMouseButtonDown(Msg); end; constructor TAdvMenuItem.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMenuItem.Destroy; begin inherited Destroy; end; procedure TAdvMenuItem.DoLeftMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnLMBClicked) then FOnLMBClicked(Self); end; procedure TAdvMenuItem.DoRightMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnRMBClicked) then FOnRMBClicked(Self); end; procedure TAdvMenuItem.LeftMouseButtonDown(var Msg: TMouseInput); begin DoLeftMouseButtonDown(Msg); end; procedure TAdvMenuItem.RightMouseButtonDown(var Msg: TMouseInput); begin DoRightMouseButtonDown(Msg); end; end. |
Re: Onclick und rechte Maustaste!
wie muss das nun aussehen, wenn ich die ereignisse zusätzlich den items bereitstellen will????
|
Re: Onclick und rechte Maustaste!
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Frank,
Zitat:
Grüße vom marabu |
Re: Onclick und rechte Maustaste!
@marabu
hi. danke dir für die mühe, aber das problem mit der Mainmenü habe ich selber schon gelöst. Allerdings brauch ich sowas in der Art wie eine Toolbar. Wenn ich das Mainmenü in eine Standard-Toolbar packe funktioniert dein Code sowie auch mein Code nicht mehr. Also hab ich mich von der Mainmenü-Toolbar-Variante abgetan und versuche mich an der Toolbar2000. Wenn Du dafür eine Lösung hättest, wärst Du mein Gott!? Ich ärgere mich jetzt schon über einen Monat damit rum. MfG & big thx Frank |
Re: Onclick und rechte Maustaste!
Du hast ja inzwischen schon so einige Hebel in Bewegung gesetzt (z.B.
![]() Zu deiner PN: ich hatte gestern wirklich etwas Zeit und bin so weit gekommen, dass ich die WM_RBUTTONDOWN-Meldung auf dem Popup-Fenster abfangen kann, allerdings fehlt noch die Lokalisierung des betreffenden TTBItem mit Hilfe der Koordinaten. Bis jetzt:
Delphi-Quellcode:
An der Stelle mit ... fehlen halt noch einige Überprüfungen.
var
HookHandle: THandle; function HookRightButton(nCode: Integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; var Wnd: TWinControl; Pnt: TPoint; begin if nCode = HC_ACTION then begin with PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := Controls.FindControl(hWnd); if Wnd is TTBToolbar then begin Pnt := SmallPointToPoint(TSmallPoint(lParam)); // ... end; end; end; Result := CallNextHookEx(HookHandle, nCode, wp, lp); end; procedure TForm1.FormCreate(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookRightButton, 0, GetCurrentThreadId); end; Wichtig: du solltest an der gehookten Stellen nicht selbst etwas tun, sondern dir einfach per PostMessage eine selbstdefinierte Meldung an das Hauptfenster schicken und dort dann ggf. eine Aktion vornehmen. |
Re: Onclick und rechte Maustaste!
Hallo Frank,
Zitat:
Zitat:
Freundliche Grüße vom marabu |
Re: Onclick und rechte Maustaste!
@Flocke :
danke. aber bei mir funzt das irgendwie nicht. bekomme folgenden Fehlermeldung : Zitat:
Delphi-Quellcode:
und
HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookRightButton, 0, GetCurrentThreadId);
Zitat:
Delphi-Quellcode:
thxwith PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := Controls.FindControl(hWnd); if Wnd is TTBToolbar then begin |
Re: Onclick und rechte Maustaste!
So, hier eine `richtige´ Lösung für Toolbar2000. Damit erhältst du in der Routine WMMyPopup sowohl den Toolbar-Eintrag unter der Maus als auch die Mauskoordinaten für's Popup-Menü.
Delphi-Quellcode:
// Edit: kleine Korrekturen
const
WM_MYPOPUP = WM_USER + 123; // Beliebig type TForm1 = class(TForm) // ... alle anderen Controls, u.a. PopupMenu1: TPopupMenu; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WMMyPopup(var Msg: TMessage); message WM_MYPOPUP; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var HookHandle: THandle; function HookRightButton(nCode: Integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; var Wnd: TWinControl; Frm: TWinControl; View: TTBView; Item: TTBItemViewer; Pnt: TPoint; begin if nCode = HC_ACTION then begin with PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := FindControl(hWnd); if Wnd is TTBToolbar then begin Pnt := SmallPointToPoint(TSmallPoint(lParam)); ClientToScreen(hWnd, Pnt); Frm := Wnd.Parent; while (Frm <> nil) and not (Frm is TCustomForm) do Frm := Frm.Parent; if Frm = nil then Frm := Application.MainForm; View := TTBToolbar(Wnd).View; while View <> nil do begin Item := View.ViewerFromPoint(View.Window.ScreenToClient(Pnt)); if Assigned(Item) then begin PostMessage(Frm.Handle, WM_MYPOPUP, UINT(Item.Item), UINT(PointToSmallPoint(Pnt))); break; end; if Assigned(View.OpenViewerView) and (View <> View.OpenViewerView) then View := View.OpenViewerView else if Assigned(View.Selected.View) and (View <> View.Selected.View) then View := View.Selected.View else View := nil; end; end; end; end; Result := CallNextHookEx(HookHandle, nCode, wp, lp); end; procedure TForm1.WMMyPopup(var Msg: TMessage); var Item: TTBCustomItem; Pnt: TPoint; begin Item := TTBCustomItem(Msg.WParam); Pnt := SmallPointToPoint(TSmallPoint(Msg.LParam)); Label2.Caption := Item.Caption; Label3.Caption := Format('%d,%d', [Pnt.X, Pnt.Y]); PopupMenu1.Popup(Pnt.X, Pnt.Y); end; procedure TForm1.FormCreate(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @HookRightButton, 0, GetCurrentThreadId); end; end. |
Re: Onclick und rechte Maustaste!
DANKE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Du bist absofort mein Gott. Endlich ist das Problem gelöst! 1000 Dank nochmal. Von dir sollte es 10000000000000 geben! Mfg Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 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