Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Listbox und Popup-Menu
stigge - Di 13.03.07 16:24
Titel: Listbox und Popup-Menu
Kann ich ein Popup-Menu erstellen, das angezeigt wird, wenn man mit der rechten Maustaste auf ein Listboxitem klickt? Also ein normales Popupmenu halt mit einer Listbox?
freak4fun - Di 13.03.07 16:32
Ja, PopUp auf Form ziehen und der ListBox zuweisen. ;)
MfG
freak
stigge - Di 13.03.07 16:44
Ähm ja natürlich^^ Hatte gerade nen Blackout (mal wieder) :wink:
stigge - Di 13.03.07 17:34
Und wenn ich jetzt den Itemindex des Listeneintrags haben will, auf dem man das Popupmenu aufgerufen hat?
Saubäär - Di 13.03.07 17:50
Moin,
so geht es (wenn ich dich nicht falsch verstanden habe :? ):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (Button = mbRight) then Exit; (FindComponent('PopupMenu' + ListBox1.Items[ListBox1.ItemIndex]) as TPopupMenu).Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; |
allerdings musst du die Namen der PopupMenüs anpassen (z.B.):
Quelltext
1: 2: 3: 4:
| Listbox: -------- Name => PopupMenuName Alter => PopupMenuAlter |
Gruß
Saubäär
stigge - Mi 14.03.07 19:41
Funktioniert noch nicht so richtig:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.AusListeentfernen1Click(Sender: TObject); begin ListBox3.Items.Delete(listbox3.itemindex); end;
procedure TForm1.ListBox3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (Button = mbRight) then Exit; (FindComponent('PopupMenu' + ListBox3.Items[ListBox3.ItemIndex]) as TPopupMenu).Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; |
Also ausListeentfernen ist ein Element des Popup-Menüs. Wenn ich aber auf ein Element rectsklicke, bekomme ich eine Fehlermeldung:
"Listenindex überschreitet das Maximum (-1)"
Lannes - Mi 14.03.07 20:09
Hallo,
denke mal das Dir ListBox.ItemAtPosweiterhilft.
In PopupMenuPopup mit ItemAtPos das Item ermitteln, zwischenspeichern z.B. in PopupMenu.Tag und dann in deinem "AusListeentfernen1Click" auswerten.
stigge - Mi 14.03.07 20:20
OK, aber ich verstehe die Parameter noch nicht so ganz.
Was muss ich für Parameter verwenden?
Lannes - Mi 14.03.07 20:27
Hallo,
Delphi-Quelltext
1:
| function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer; |
Pos: TPoint = Mauskoordinaten, z.B. mit GetCursorPos ermitteln
Existing: Boolean = auf True setzen, dann wird -1 zurückgeliefert, wenn z.B. unterhalb der Items geklickt wird.
//Edit: In meiner Delphi-Hilfe ist auch ein Beispiel zu ItemAtPos
Saubäär - Mi 14.03.07 20:40
stigge hat folgendes geschrieben: |
Also ausListeentfernen ist ein Element des Popup-Menüs. Wenn ich aber auf ein Element rectsklicke, bekomme ich eine Fehlermeldung:
"Listenindex überschreitet das Maximum (-1)" |
Hi,
die Fehlermeldung kommt wenn das Popupmenu, dass du ansprichst nicht existiert. Wie gesagt:
Quelltext
1: 2: 3: 4:
| Listbox: -------- Name => PopupMenuName Alter => PopupMenuAlter |
Dann müsste es ohne Probleme funktionieren.
stigge - Mi 14.03.07 20:44
Sorry aber ich blicks immer noch nicht :oops:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var stell: integer;...
procedure TForm1.AusListeentfernen1Click(Sender: TObject); begin ListBox3.Items.Delete(stelle); end;
procedure TForm1.ListBox3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (Button = mbRight) then Exit; stelle := ListBox3.ItemAtPos(getcursorpos, true); end; |
Fehler:
[Fehler] Unit1.pas(1107): E2035 Nicht genügend wirkliche Parameter
stigge - Mi 14.03.07 20:47
Die Methode von Saubär auch nicht :oops: :oops: :oops:
Saubäär - Mi 14.03.07 20:51
Hi stigge,
ich weiß leider immer noch nicht genau, was du überhaupt machen willst. Bei meiner Methode kannst du mit jedem Element der ListBox
ein! PopupMenu ansprechen, heißt: Des Item hat sein eigenes PopupMenu,
(dass vorher erstellt worden sein muss und: PopumenuItemName heißen muss).
stigge - Mi 14.03.07 20:54
Saubäär hat folgendes geschrieben: |
Hi stigge,
ich weiß leider immer noch nicht genau, was du überhaupt machen willst. Bei meiner Methode kannst du mit jedem Element der ListBox
ein! PopupMenu ansprechen, heißt: Des Item hat sein eigenes PopupMenu,
(dass vorher erstellt worden sein muss und: PopumenuItemName heißen muss). |
Achso, nein! Ich wollte nur den Itemindex des Items, das mit der rechten Maustaste angeklickt wurde, herausfinden!!!
Das reicht mir schon, den Rest schaffe ich selber :wink: Oder besser gesagt, ich WILL
Saubäär - Mi 14.03.07 20:58
Moin,
achso ok!
Delphi-Quelltext
1: 2:
| ListBox1.ItemIndex; << Index des selektierten Items ListBox1.Items[ListBox1.ItemIndex]; << Name des selektierten Items |
Gruß
Saubäär
stigge - Mi 14.03.07 21:00
Saubäär hat folgendes geschrieben: |
Moin,
achso ok!
Delphi-Quelltext 1: 2:
| ListBox1.ItemIndex; << Index des selektierten Items ListBox1.Items[ListBox1.ItemIndex]; << Name des selektierten Items |
Gruß
Saubäär |
Jo, weiß ich schon länger^^ Das Problem ist das beim Rechtsklick das Item nicht anselektiert wird^^
Keldorn - Mi 14.03.07 21:02
Hallo
itematpos war schon richtig, aber du mußt die x,y Koordinaten übergeben, die sich auf die Listbox beziehen und nicht getcursorpos
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbright then showmessage(inttostr(ListBox1.ItemAtPos(point(x,y),true))); end; |
stigge - Mi 14.03.07 21:06
Keldorn hat folgendes geschrieben: |
Hallo
itematpos war schon richtig, aber du mußt die x,y Koordinaten übergeben, die sich auf die Listbox beziehen und nicht getcursorpos
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbright then showmessage(inttostr(ListBox1.ItemAtPos(point(x,y),true))); end; | |
Gut! Jetzt muss nur noch das Popup-Fenster erscheinen!
Delphi-Quelltext
1:
| stelle := ListBox3.ItemAtPos(point(x,y),true); |
Halt das Fenster soll da erscheinen, wo man einen Rechtsklick gemacht hat.
stigge - Mi 14.03.07 21:09
Hat sich geklärt:
Delphi-Quelltext
1: 2:
| stelle := ListBox3.ItemAtPos(point(x,y),true); popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); |
Danke, aber ich hab noch eine Frage:
Kann man irgendwie ein spezielles Item in einer Listbox anselektieren?
Keldorn - Mi 14.03.07 21:10
gugg dir popup an, autopoup muß auf false stehen, wenn du das popupmenu der listbox zugewiesen hast
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var Pt:tpoint; begin if button = mbright then begin ListBox1.ItemIndex:=ListBox1.ItemAtPos(point(x,y),true); getcursorpos(PT); PopupMenu1.Popup(pt.X,pt.y); end; end; |
stigge - Mi 14.03.07 21:11
Keldorn hat folgendes geschrieben: |
gugg dir popup an, autopoup muß auf false stehen, wenn du das popupmenu der listbox zugewiesen hast
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var Pt:tpoint; begin if button = mbright then begin ListBox1.ItemIndex:=ListBox1.ItemAtPos(point(x,y),true); getcursorpos(PT); PopupMenu1.Popup(pt.X,pt.y); end; end; | |
Post über dir :wink:
Saubäär - Mi 14.03.07 21:12
stigge hat folgendes geschrieben: |
Hat sich geklärt:
Delphi-Quelltext 1: 2:
| stelle := ListBox3.ItemAtPos(point(x,y),true); popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); | Danke, aber ich hab noch eine Frage: Kann man irgendwie ein spezielles Item in einer Listbox anselektieren? |
Ja
Delphi-Quelltext
1:
| ListBox3.Selected[3] := True; |
stigge - Mi 14.03.07 21:13
Saubäär hat folgendes geschrieben: |
stigge hat folgendes geschrieben: | Hat sich geklärt:
Delphi-Quelltext 1: 2:
| stelle := ListBox3.ItemAtPos(point(x,y),true); popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); |
Danke, aber ich hab noch eine Frage:
Kann man irgendwie ein spezielles Item in einer Listbox anselektieren? |
Ja
Delphi-Quelltext 1:
| ListBox3.Selected[3] := True; | |
Nächstes Problem geklärt. Danke für die Unterstützung!
Keldorn - Mi 14.03.07 21:14
stigge hat folgendes geschrieben: |
Post über dir :wink: |
tja, da warst du schneller. Vielleicht solltest du auch 3 min länger überlegen, selber überlegen/suchen und dann nochmal fragen :D
stigge - Mi 14.03.07 21:15
Keldorn hat folgendes geschrieben: |
stigge hat folgendes geschrieben: |
Post über dir :wink: |
tja, da warst du schneller. Vielleicht solltest du auch 3 min länger überlegen, selber überlegen/suchen und dann nochmal fragen :D |
Hätte's mir komplizierter vorgestellt. Hab's aber auch nur durch einen Post weiter oben herausgefunden
Lannes - Mi 14.03.07 22:09
Hallo,
da ich
Lannes hat folgendes geschrieben: |
In PopupMenuPopup mit ItemAtPos das Item ermitteln, zwischenspeichern z.B. in PopupMenu.Tag und dann in deinem "AusListeentfernen1Click" auswerten. |
PopupMenuPopup ins Spiel gebracht hatte, will ich mal meine Variante vorschlagen. Kein OnMouseDown, AutoPopUp auf Standard lassen, Enabled-Status des Menü-Items "löschen" wird in Abhängigkeit zu ItemIndex gesetzt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.AusListeentfernen1Click(Sender: TObject); begin with ListBox1 do Items.Delete(ItemIndex); end;
procedure TForm1.PopupMenu1Popup(Sender: TObject); var aPoint : TPoint; begin with ListBox1 do begin GetCursorPos(aPoint); aPoint := ScreenToClient(aPoint); ItemIndex := ItemAtPos(aPoint, True); AusListeentfernen1.Enabled := not (ItemIndex = -1); end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!