Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView ColumnRightClick fehlerhaft ? (https://www.delphipraxis.net/59631-listview-columnrightclick-fehlerhaft.html)

fotohase 26. Dez 2005 11:33


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?

WaSa 14. Feb 2006 15:24

Re: ListView ColumnRightClick fehlerhaft ?
 
Hallo fotohase

Ich plage mich auch gerade damit herum.
Zitat:

Was muss ich machen um auch bei ColumnRightClick den richtigen Wert zu bekommen?
Eine Lösung habe ich nicht, nur einen sog. "Workaround". Zusätzlich habe ich noch ein Popup-Menu, das du getrost ignorieren kannst.

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:
// +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;
Den Tip mit "lv.items [0].left" habe ich von dsdt info. Ist also nicht alles auf meinem Mist gewachsen.
Aber trotzdem, das ganze ist ein riesen Murks, ein Paradebeispiel einer schlecht gestalteten und schlecht implementierten Komponente. Sorry.

Gruss
Walter

fotohase 15. Feb 2006 12:17

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 15:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz