Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Onclick und rechte Maustaste! (https://www.delphipraxis.net/59867-onclick-und-rechte-maustaste.html)

TriphunEM 29. Dez 2005 19:44


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

Der_Unwissende 29. Dez 2005 22:16

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:
type
  TExtendedMainMenue = class(TMainMenue)
    private
      procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN;
      procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN;
  end;
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.

Gruß Der Unwissende

TriphunEM 31. Dez 2005 08:51

Re: Onclick und rechte Maustaste!
 
danke, aber da ich mit komponenten-programmierung net so gut auskenne bin ihc nur soweit gekommen

Delphi-Quellcode:
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;
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!
kannst mir da noch weiter helfen???

faux 31. Dez 2005 10:05

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

xaromz 31. Dez 2005 10:07

Re: Onclick und rechte Maustaste!
 
Hallo,
Zitat:

Zitat von faux
Also ich bin mir nicht sicher, aber gehören die zwei Prozeduren LeftMouseButtonDown und RightMouseButtonDown nicht nach published?

Nein, die fangen ja nur Windows-Botschaften ab und sind keine Ereignisse. In diesen Prozeduren sollten aber dann Ereignisprozeduren aufgerufen werden.

Gruß
xaromz

faux 31. Dez 2005 10:09

Re: Onclick und rechte Maustaste!
 
Zitat:

Zitat von xaromz
Nein, die fangen ja nur Windows-Botschaften ab und sind keine Ereignisse. In diesen Prozeduren sollten aber dann Ereignisprozeduren aufgerufen werden.

Ah! Gut zu wissen. ;)

Wie würde dann diese Prozedur aussehen?

Die Muhkuh 31. Dez 2005 10:58

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;

Jens Schumann 31. Dez 2005 11:13

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.

marabu 31. Dez 2005 11:31

Re: Onclick und rechte Maustaste!
 
Hallo, nochmal zurück zum eigentlichen Problem.

Zitat:

Zitat von TriphunEM
ich will einem MainMenu-Eintrag der zur Laufzeit erstellt wurde ein bestimmtes Popup hinzufügen!

Du möchtest die Items aus einem PopupMenu als dynamisches DropDown-Menü im MainMenu wiederverwenden? Das ist selten sinnvoll, weil das PopupMenu ein Kontextmenü ist und seine Aktionen nicht über das Hauptmenü ausgeführt werden sollen. Es ist ein Verstoß gegen die guten Sitten, aber technisch sehr einfach zu realisieren, wenn du deinen Aktionscode in einer ActionList verwaltest und den Items in deinem PopupMenu zugewiesen hast:

Delphi-Quellcode:
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;
Silvestergrüße vom marabu

TriphunEM 31. Dez 2005 13:24

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ü!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.
Seite 1 von 3  1 23      

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