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

user profile iconstigge 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

user profile iconSaubää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

user profile iconSaubää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

user profile iconKeldorn 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

user profile iconKeldorn 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

user profile iconstigge 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

user profile iconSaubäär hat folgendes geschrieben:
user profile iconstigge 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

user profile iconstigge 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

user profile iconKeldorn hat folgendes geschrieben:
user profile iconstigge 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
user profile iconLannes 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;