Zitat von
Helmi:
ich hab in diesen Zellen die CheckBoxen drin (die bei der Listview dabei sind, und dann gehts nimmer
das hättest du auch gleich sagen können
.
Ansonsten: keine Ahnung, ich würd dann die "Zeile und Spalte" ermitteln und den Hint selber anzeigen
Delphi-Quellcode:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var ColumnRect:Trect;
col,i,row,i2:integer;
oldhint,newhint:string;
begin
{man kann auch mit getitemat arbeiten, leider funktioniert das bei rowselect=false nur, wenn die maus über der caption-spalte ist}
//läßt sich mit Sicherheit noch verbessern: ein paar Sicherheitsüberprüfungen und ein paar breaks, bzw ein anderer Schleifenaufbau wäre z.b. was
with Sender as TListView do
begin
row := -1;
col := -1;
//alles items durchlaufen und y-pos vergleichen
for i2:=0 to Items.Count-1 do
begin
//erstmal Rect der ganzen zeile ermittlen, um top, bottom und left zu haben
ColumnRect := items[i2].DisplayRect(drBounds);
//y-pos überprüfen
if (y>=ColumnRect.top) and (y<=ColumnRect.Bottom) then
begin
row:=i2;
//x-pos überprüfen
for i:=0 to Columns.Count-1 do
begin
//listview_getcolumwidth statt colum.width verwenden, wurde ccolumnsheaderwith etc. verwendet, liefert comumn.width die falschen werte (zumind. bei mir (d6pro),).
ColumnRect.Right := ColumnRect.left+ListView_GetColumnWidth(Columns.Owner.Handle, i);
if (x>=ColumnRect.Left) and (x<=ColumnRect.Right) then col:=i;
//nächste Spalte ermittlen
ColumnRect.left:=ColumnRect.Right;
end;
end;
end;
label1.Caption:='Zeile: '+inttostr(row)+'-'+'Spalte: '+inttostr(col);
//showhint muß auf true sein
//hint pro Zelle anpassen, hier könnte man noch mit listview.stringwidth arbeiten, um nur einen hint anzuzeigen, wenn die Spaltenbreite zu klein ist
oldhint := hint;
newhint := '';
if (row<>-1) and (col<>-1) then
begin
//caption oder subitems-spalte?
if col=0 then
newhint := items[row].Caption
else
//sichergehe4n,m das es auch so viele subitems gibt
if items[row].SubItems.Count-1>=col-1 then
newhint:=items[row].SubItems[col-1];
//wenn neuer Hint, application.cancelhint aufrufen, um den neuen hint auch anzuzeigen
if newhint<>oldhint then
begin
hint:=newhint;
Application.CancelHint;
end;
end;
end;
end;
kannst dir das ja selber verbessern und anpssen.
Mfg Frank