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 mit zu langen Texten (https://www.delphipraxis.net/26307-listview-mit-zu-langen-texten.html)

Helmi 21. Jul 2004 19:46


ListView mit zu langen Texten
 
Hallo

ich habe eine textview in der in einer Zelle (falls mann das bei einer Listview auch so nennen kann)
ein zu langer Text drin steht.

Nun macht Listview beim Anzeigen aus dem langen text einen kurzen mit drei Punkten als Endung

das ist ja alles in Ordnung

nur: ich will, dass man eine art Hint-Message erhalte, wenn man mit der maus auf diese Zelle
geht, in der der komplette (ungekürzte) Text der Zelle drinsteht.

mfg
Helmi

Keldorn 21. Jul 2004 20:08

Re: ListView mit zu langen Texten
 
Hallo

ich versteh dich nicht, bei mir ist das bereits das standardverhalten einer Listview. Beil Zellen, wo der Text nicht reinpaßt, wird automatisch der Text als Hint angezeigt.

Mfg Frank

Helmi 21. Jul 2004 20:24

Re: ListView mit zu langen Texten
 
na ja

ich hab in diesen Zellen die CheckBoxen drin (die bei der Listview dabei sind, und dann gehts nimmer

Keldorn 24. Jul 2004 13:00

Re: ListView mit zu langen Texten
 
Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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