![]() |
ListView ColumnRightClick fehlerhaft ?
Hallo,
wenn ich in einem ListView über den vertikalen Scrollbalken die Spalten verschiebe, so dass links die ersten Spalten nicht mehr dargestellt werden, liefert ColumnRightClick ein fehlerhaftes Column. Column.Index ist um die Anzahl der nicht sichtbaren Spalten zu klein. ColumnClick liefert jedoch den richtigen Wert. Was muss ich machen um auch bei ColumnRightClick den richtigen Wert zu bekommen? |
Re: ListView ColumnRightClick fehlerhaft ?
Hallo fotohase
Ich plage mich auch gerade damit herum. Zitat:
Delphi-Quellcode:
procedure TForm1.lvColumnRightClick(Sender: TObject; Column: TListColumn; Point: TPoint);
var xPoint : TPoint; begin xPoint := ClientToScreen ( Point ); // Screen-Koordinaten zu Koordinaten der Applikation inc ( xPoint.X, lv.Left ); // Applikations-Koord. zu Komponenten-Koord. inc ( xPoint.Y, lv.Top ); // fColInd -> index von lv.Columns (lv ist meine ListView) fColInd := CalcColumnInd ( -lv.Items [ 0 ].Left + Point.X ); // fColInd -> irgend int integer if fColInd >= 0 then PopupMenu2.popup ( xpoint.x, xpoint.y ); end;
Delphi-Quellcode:
Den Tip mit "lv.items [0].left" habe ich von
// +10, -10: gewisser ungültiger Range spezifiziert um die Kolonnengrenzen herum
// result >= 0 für gültigen Kolonne, -1 wenn ungültig function TForm1.CalcColumnInd(aX: integer): integer; var xI, xSum : integer; begin xSum := 0; result := -1; for xI := 0 to lv.Columns.Count - 1 do begin if xSum + 10 < aX then begin xSum := xSum + lv.Columns [ xI ].Width; if xSum - 10 > aX then begin result := xI; break; end; end; end; end; ![]() Aber trotzdem, das ganze ist ein riesen Murks, ein Paradebeispiel einer schlecht gestalteten und schlecht implementierten Komponente. Sorry. Gruss Walter |
Re: ListView ColumnRightClick fehlerhaft ?
Hallo WaSa,
ich habe mir folgendes "zusammengestrickt". Damit klappt es jetzt. Gruß fotohase procedure TFmServer.ListView1ColumnRightClick(Sender: TObject; Column: TListColumn; Point: TPoint); Var i,b,IndexC:Integer; begin IndexC:=Column.Index; if ListView1.TopItem.Left < -2 then begin // Liste wurde verschoben IndexC:=-1; b:=Abs(ListView1.TopItem.Left+2)+Point.X; for i:=0 to Pred(ListView1.Columns.Count) do begin Inc(IndexC); Dec(b,ListView1.Columns[i].Width); if b<=0 then Break; end; end; // IndexC enthält jetzt den richtigen Spaltenindex end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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 by Thomas Breitkreuz