PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechte Maustaste "durchdrücken"


aths
2003-12-02, 17:03:15
Folgendes Problem:

procedure TMainForm.ListBox1Click(Sender: TObject);

Das ist der Kopf der OnClick-Methode. Via ListBox1.ItemIndex kriegt man raus, welches Item nun angeklickt wurde. Diese Methode wird nur beim Linksklick aufgerufen. Um einen Rechtsklick abzufangen, nutze ich das Ereignis OnMouseDown:

procedure TMainForm.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Hier kann man über Variablen der Parameter-Liste die Maustaste und die Mausposition bekommen. Nun möchte ich aber, dass die rechte Maustaste zunächst einen Linksklick auf gleicher Stelle ausführt. Mit dem Rechtsklick soll also erst das passende Item markiert werden, ehe die Behandlung für den Rechtsklick kommt. Leider habe ich keine Ahnung, wie man da vorgehen könnte.

Hätte jemand 'ne Idee?

Darkstar
2003-12-02, 17:44:19
Versuch mal folgendes:
procedure TMainForm.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
ListBox1.ItemIndex:= Y div ListBox1.ItemHeight;
// weitere Behandlung
// …
end;

aths
2003-12-02, 17:47:31
An den Ansatz dachte ich auch schon. Ist aber impraktikabel, da die Listbox u. U. mit Scrollbalken arbeitet.

Darkstar
2003-12-02, 18:05:17
Hast Recht, daran habe ich nicht gedacht. Leider fällt mir im Moment keine Lösung ein.

TK
2003-12-02, 21:15:51
Schau dir mal die Windows-API-Funktion mouse_event() an. Damit kannst du einen Linksklick an der Position des Rechtsklicks simulieren.

DocEW
2003-12-02, 21:17:42
(EDIT: hier stand Quatsch =) )

Ich habe sowas mal für einen TreeView benötigt und das funktionierte so:

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,TMouseButton Mausknopf, TShiftState Shift, int X, int Y)
{
if(Mausknopf==mbRight)
{
THitTests HT;
TTreeNode *newNode;

HT = TreeView1->GetHitTestInfoAt(X,Y);
if (HT.Contains(htOnItem))
{
newNode=TreeView1->GetNodeAt(X,Y);
TreeView1Change(this,newNode);
newNode->Selected=true; // nötig, damit bei Rechts-Klick Knoten ausgewählt wird
};
};
}


Müßte ja ähnlich auch bei der Listbox funktionieren...

aths
2003-12-03, 21:32:06
Original geschrieben von DocEW
(EDIT: hier stand Quatsch =) )

Ich habe sowas mal für einen TreeView benötigt und das funktionierte so:

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,TMouseButton Mausknopf, TShiftState Shift, int X, int Y)
{
if(Mausknopf==mbRight)
{
THitTests HT;
TTreeNode *newNode;

HT = TreeView1->GetHitTestInfoAt(X,Y);
if (HT.Contains(htOnItem))
{
newNode=TreeView1->GetNodeAt(X,Y);
TreeView1Change(this,newNode);
newNode->Selected=true; // nötig, damit bei Rechts-Klick Knoten ausgewählt wird
};
};
}


Müßte ja ähnlich auch bei der Listbox funktionieren... Hier raffe ich nicht ganz, was genau gemacht wird. GetHitTestInfoAt gibt's bei einer Listbox übrigens nicht :(

DocEW
2003-12-04, 18:37:11
Ich habe hier
http://gethelp.devx.com/techtips/delphi_pro/10min/10min0799.asp
ein Beispiel gefunden, in dem folgendes gemacht wird:

ListBox1.ItemIndex := ListBox1.ItemAtPos(P, True);

Hilft dir das vielleicht? =)

Matti
2003-12-07, 15:39:57
ja, du mußt die Codezeile von DocEW bei onMouseDown einfügen. Obwohl ich ...ItemAtPos(P, false) bevorzugen würde. Denn wenn da true steht, gibt die Funktion -1 zurück, falls man an eine leere Stelle in der Listbox clickt.

aths
2003-12-11, 10:50:43
Funzt. Ich nehm true und teste dann selbst auf <0 :)