![]() |
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: |
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. |
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:
Gruß, teebee
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; [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] |
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... |
Re: eigenes Popup-Menü durch gedrückte Maustaste
Zitat:
Der Vorschlag von teebee kommt meinen Vorstellungen sehr nahe! Probiere gerade ein wenig... |
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; |
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? |
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:
|
Re: eigenes Popup-Menü durch gedrückte Maustaste
Mach mal als lezte Anweisung in MouseDown ein
Delphi-Quellcode:
Gruß, teebee
ReleaseCapture;
|
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