AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Einfach das Popup Menü schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Einfach das Popup Menü schließen

Ein Thema von Ginko · begonnen am 27. Apr 2013 · letzter Beitrag vom 2. Mai 2013
Antwort Antwort
Seite 1 von 3  1 23      
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#1

Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 09:48
Also beim Versuch das Popup Menü mit der mittleren Maustaste zu schließen komme ich nicht weiter.

Es soll ein Popup Menü, welches in einem Memo geöffnet wurde durch den Klick der mittleren Maustaste geschlossen werden. Eben genauso wie wenn ich mit der linken Maustaste neben das Menü klicke.

Mit dieser Lösung klappt es nicht http://www.swissdelphicenter.ch/de/showcode.php?id=2262.

Delphi-Quellcode:
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbMiddle then
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
Durch das Popup geht ja der Fokus verloren. Deshalb wird das Ereignis gar nicht mehr aufgerufen.
Aber wenn ich das ganze im Form1 Ereignis mache klappt es auch nicht.
Das Popup Menü hat ja kein MouseDown Ereignis.

Diese Lösung http://www.entwickler-ecke.de/topic_...d9d2ad?view=df habe ich noch gefunden. Aber bei mir meckert der Compiler (Lazarus), das er keine Popuplist kennt und außerdem
will er bei MakeObjectInstance(PopupListWndProc); immer noch eine Message als Argument bei PopupListWndProc.

Geändert von Ginko (27. Apr 2013 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 14:01
Ich habe eine Lösung gebastelt, welche mir aber sehr umständlich erscheint.
Dabei wird die Tastatur Global abgefragt, unabhängig vom Memo oder dem Formular.
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
  StdCtrls, ExtCtrls, Windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    Memo1: TMemo;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    PopupMenu1: TPopupMenu;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure keytimer(WND: Hwnd; uMsg: DWord; IdEvent: DWord; dwTimer: DWord); stdcall; Far;
begin
  if Form1.Active then
  begin
    if getasynckeystate (VK_MBUTTON) <> 0 then
    begin
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    end;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
  Var TimerHandle: THandle;
Begin
  TimerHandle := SetTimer(0, 0, 100, @keytimer);
end;

procedure TForm1.FormDestroy(Sender: TObject);
Var TimerHandle: THandle;
begin
  KillTimer(0, TimerHandle);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#3

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 14:55
Warum so kompliziert?

Delphi-Quellcode:
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbMiddle then
    EndMenu;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 15:14
Ich habe eine Lösung gebastelt, welche mir aber sehr umständlich erscheint.
Dabei wird die Tastatur Global abgefragt, unabhängig vom Memo oder dem Formular.
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
  StdCtrls, ExtCtrls, Windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    Memo1: TMemo;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    PopupMenu1: TPopupMenu;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure keytimer(WND: Hwnd; uMsg: DWord; IdEvent: DWord; dwTimer: DWord); stdcall; Far;
begin
  if Form1.Active then
  begin
    if getasynckeystate (VK_MBUTTON) <> 0 then
    begin
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    end;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
  Var TimerHandle: THandle;
Begin
  TimerHandle := SetTimer(0, 0, 100, @keytimer);
end;

procedure TForm1.FormDestroy(Sender: TObject);
Var TimerHandle: THandle;
begin
  KillTimer(0, TimerHandle);
end;

end.
Auch wenn es nicht dazugehört, aber deine Variable(n) "TimerHandle" muss unter private einmal deklariert werden und nicht in jeder Procedure lokal.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 15:33
Danke für die Antworten.
Ja dachte mir schon das da was faul ist, danke für den Hinweis Helmi.

Zitat:
Delphi-Quellcode:
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbMiddle then
    EndMenu;
end;
Funktioniert bei mir leider nicht (unter Lazarus) ob es unter Delphi geht kann ich grad nicht testen. Vielleicht später unter Delphi 7 mal.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 16:34
Der Befehl EndMenu; funktioniert zwar einwandfrei über einen Timer. Aber sobald das Popup Menü offen ist spricht die mittlere Maustaste nur noch auf globale Tastaturabfragen an.

Hier mal ein Beispiel:
Delphi-Quellcode:
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
  ExtCtrls, StdCtrls, Windows;
.
.
.

var
  Form1: TForm1;
  z1: Integer = 0;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  EndMenu;
  Inc(z1);
  Label1.Caption:= IntToStr(z1);
end;

procedure TForm1.MenuItem3Click(Sender: TObject);
begin
 ShowMessage('Test 3');
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbMiddle then ShowMessage('Reagiert nicht wenn Popup offen ist');
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  Timer1.Enabled:= True; //Timer wird nach öffnen von Menü gestartet und beendet es nach entsprechender Zeit
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#7

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 21:34
Ich hatte das unter Delphi XE2 und Windows 7 getestet: Neue VCL-Forms-Anwendung, Memo drauf, MouseDown-Event wie gezeigt. Starten, rechte Maustaste auf Memo, Popup-Menü kommt, mittlere Maustaste auf Popupmenü - funktioniert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 21:40
Hi hab es auch nochmal gerade so getestet unter Lazarus, es funktioniert wirklich. ABER nur mit dem Orginal Popup Menü von Windwos. Sobald ich ein eigenes verwende, tritt der oben beschriebene Fehler auf. Hast du es mit dem Orginal getestet ? Danke für die Mühe!

Geändert von Ginko (27. Apr 2013 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#9

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 00:00
Ja, ich hatte das Standardmenü genommen. Mit einem eigenen Popupmenü geht es in Delphi auch nicht. Liegt wohl daran, daß das Standardmenü mit dem Handle des Controls arbeitet, während die VCL-Popupmenüs ein anderes Window-Handle verwenden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#10

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 00:04
Der folgende Code in einer passenden Unit sollte das aber beheben. Das funktioniert dann allerdings mit allen Popupmenüs und man braucht den Event i Memo nicht mehr.

Delphi-Quellcode:
type
  TMyPopupList = class(TPopupList)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

procedure TMyPopupList.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MBUTTONDOWN then begin
    EndMenu;
    Exit;
  end;
  inherited;
end;

initialization
  PopupList.Free;
  PopupList := TMyPopupList.Create;
end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 23:31 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