Einzelnen Beitrag anzeigen

Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: ListView mit zu langen Texten

  Alt 24. Jul 2004, 13:00
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat