Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi eigenes Popup-Menü durch gedrückte Maustaste (https://www.delphipraxis.net/27588-eigenes-popup-menue-durch-gedrueckte-maustaste.html)

zappel 12. Aug 2004 17:03


eigenes Popup-Menü durch gedrückte Maustaste
 
Hallo! :hi:

Ich möchte eine Art eigenes Popup-Menü erstellen. In meinem Programm steht an einer bestimmten Stelle ein Wort. Wenn man auf dieses Wort klickt (und dabei die Maustaste gedrückt hält), soll sich eine Art Popup-Menü öffnen. Dort stehen in einer Liste andere Wörter, die man auswählen kann, indem man die Maus über das gewünschte Wort bewegt und die Maustaste loslässt. Danach soll das vorherige Wort durch das neu gewählte ersetzt werden. Im Prinzip soll es also so funktionieren wie eine ComboBox. Eine ComboBox kann ich aber nicht grafisch verändern, der Pfeil z.B. stört.
Hoffe, das ist so verständlich ausgedrückt.

Hat jemand eine Idee, wie ich das umsetzen kann? :gruebel:

nailor 12. Aug 2004 17:28

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
nochmal zur funktionalität: du willst sowas ähnliches machen, wie die synonym-funktion in ms word?

du könntest ein popup-menü nehmen. dann fängst du den mausklick ab, und öffnest das menü. du musst nur irgendwie bestimmen, über welchem wort dich der cursor befindet.

teebee 12. Aug 2004 17:37

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Ich habe sowas mal mit einer ListBox gemacht, die auf Mausklick an der Cursorposition sichtbar gemacht wird. Als ersten Ansatz:
Delphi-Quellcode:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 If ListBox1.Visible Then ListBox1.Visible := False;
 If Button=mbRight Then Begin
  // Hier die Listbox mit sinnvollen Werten füttern
  // ...
  ListBox1.Top := y;
  ListBox1.Left := x;
  ListBox1.Visible := True;
  ListBox1.Itemindex := 0;
  ListBox1.SetFocus;
 End;
end;
Gruß, teebee
[EDIT]Sorry, jetzt erst gesehen, dass Du in 'Windows-API' gepostet hattest, das Prinzip ist das gleiche, nur ein kleines bisschen aufwendiger...[/EDIT]
[EDIT]Kleinen Fehler berichtigt[/EDIT]

fred.reichbier 12. Aug 2004 17:44

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Also, du kannst bei einem Memo die Cursorpos mit SelPos (oder so ähnlich)
rausfinden.
Da könntest du dann rückwärts gucken, bis das Wort anfängt, und dann vorwärts, bis das Wort aufhört,
markieren, auslesen per SelText und dann gehts einfach...

zappel 12. Aug 2004 17:50

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Zitat:

Zitat von fred.reichbier
Also, du kannst bei einem Memo die Cursorpos mit SelPos (oder so ähnlich)
rausfinden.

Es geht mir nicht um ein Wort in einem Memo. Das war nur so als Beispiel gewählt. Ein Image wäre als Beispiel wohl besser gewesen. Mit dem Popup-Menü käme dann eine Liste mit den Namen der anderen wählbaren Bildern...

Der Vorschlag von teebee kommt meinen Vorstellungen sehr nahe! Probiere gerade ein wenig...

shmia 12. Aug 2004 18:01

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Hier mal ein Beispiel, wie man zur Laufzeit Popup-Menues aufbauen und anzeigen kann:
Delphi-Quellcode:
var
   i : Integer;
   s : string;
   mi : TMenuItem;
begin
   PopupMenu1.Items.Clear;

   for i := 1 to 7 do
   begin
      s := DateTimeToStr(Date + i);
      mi := TMenuItem.Create(Self);
      mi.Caption := s;
      mi.OnClick := MenuClick;
      PopupMenu1.Items.Add(mi);
   end;

   PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
end;

zappel 12. Aug 2004 18:27

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
:!: Ich hätte besser in "sonstiges" oder so schreiben sollen, hups! :stupid:

Ich bin jetzt mit der ListBox soweit gekommen, dass mir das Ergebnis gefällt. Eine kleine, aber entscheidende Sache funktioniert jedoch noch nicht.

Beim MouseDown wird die ListBox visible gemacht. Beim MouseUp wieder invisible. Damit ist das Popup-Menü schon fast "simuliert". Bei der ListBox habe ich nun mit dem Ereignis MouseMove und ListBox1.ItemAtPos(x,y) den Foucs immer auf das Item unter der Maus gesetzt. Das klappt allerdings nicht so ganz. Ich habe herausgefunden, dass das daran liegt, dass der Mauszeiger noch gedrückt ist. Die ListBox1MouseMove-Procedur kann scheinbar nicht aufgerufen werden, solange die FormMouseDown-Procedur noch geöffnet ist.

Was kann ich nun machen?

Dani 12. Aug 2004 20:10

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Liste der Anhänge anzeigen (Anzahl: 1)
Seltsam, bei mir funktioniert es... aber nur mit der rechten Maustaste :gruebel:

teebee 12. Aug 2004 20:35

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Mach mal als lezte Anweisung in MouseDown ein
Delphi-Quellcode:
ReleaseCapture;
Gruß, teebee

zappel 13. Aug 2004 13:41

Re: eigenes Popup-Menü durch gedrückte Maustaste
 
Danke teebee! Das war genau das, was ich gebraucht habe! :hello:

Hier ist mein Ergebnis, vielleicht kann es ja irgendwann irgendwer irgendwo gebrauchen!

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then begin
    ListBox1.Top:=y-(ListBox1.Height div 2);
    ListBox1.Left:=x-(ListBox1.Width div 2);
    ListBox1.Visible:=true;
    ReleaseCapture;
  end;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  ListBox1.ItemIndex:=ListBox1.ItemAtPos(Point(x,y),true);
  //Label1.Caption:=IntToStr(ListBox1.ItemAtPos(Point(x,y),true));
end;

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: integer;
begin
  ListBox1.Visible:=false;
  for i:=0 to ListBox1.Items.Count-1 do
    if ListBox1.Selected[i] then
      Label1.Caption:=ListBox1.Items[i];
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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