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 TListView SubItem Position genau feststellen (https://www.delphipraxis.net/185795-tlistview-subitem-position-genau-feststellen.html)

Captnemo 7. Jul 2015 08:49


TListView SubItem Position genau feststellen
 
Hi,

wie kann ich ein TRect eines SubItems in einem TListView korrekt feststellen?
Mit folgender Funktion hole ich mir das TRect zur Zeit:
Delphi-Quellcode:
r:=lv1.Items[i].DisplayRect(drBounds);

InlineCheckbox.BoundsRect:=ShrinkToColumn(lv1, 5, r);
.
.
.
function Tfrm_mitarbeiterT.ShrinkToColumn(lv: TListView; Col: Integer;
  r: TRect): TRect;
var
  i, l: Integer;
begin
  Result:=r;
  if Col>0 then
  begin
    l:=0;
    for I := 0 to col-1 do
      if lv.Columns[i].Width>0 then
        l:=l+lv.Columns[i].Width else
        l:=l+(lv.Columns[i].Width * -1); //Zum Testen, weil unsichtbare Columns teilweise negative
                                         //Werte haben
    Result.Left:=r.Left+l;
  end;
  Result.Right:=Result.Left+lv.Columns[Col].Width;
end;
Nun ist es aber so, dass die Column 0 auf Autosize steht, und sie sich verkleinert, bis sie eine Width von 1 hat. Wenn man dann weiter verkleinert, bekommt sie eine Width von -1, was zeichnerisch an die optimale Spaltenbreite angepasst wird. Wen man jetzt weiter verkleinert, geht die Width weiter in den negativen Bereich, je nach weiterer Verkleinerung. So komme ich dann aber rechnerisch nicht mehr an die genaue Position des SubItems.

Gibt es dafür eine bessere Lösung?

Captnemo 7. Jul 2015 12:51

AW: TListView SubItem Position genau feststellen
 
Keiner eine Idee?

Captnemo 7. Jul 2015 13:26

AW: TListView SubItem Position genau feststellen
 
Ich Antworte mir mal selbst, da ich eine Lösung jetzt gefunden habe. (Für alle, die sowas mal suchen)

Quelle: http://www.delphisource.net/365.html

Delphi-Quellcode:
const
   LVM_FIRST              = $1000;
   LVM_GETSUBITEMRECT     = LVM_FIRST + 56;
   LVIR_BOUNDS            = 0;
   
function ListView_GetSubItemRect(hwndLV: HWND; iItem, iSubItem: Integer;
   code: DWORD; prc: PRect): BOOL;
begin
   if prc <> nil then
   begin
     prc^.Top := iSubItem;
     prc^.Left := code;
   end;
   Result := BOOL(SendMessage(hwndLV, LVM_GETSUBITEMRECT, iItem, Longint(prc)));
end;
Aufruf:
Delphi-Quellcode:
var
  wr: TRect;
  li: TListItem;
begin
  li:=ListView1.Items.Add;
  li.SubItems.Add('');
  ListView_GetSubItemRect(ListView1.Handle,
                          li.Index,            //Index der jeweiligen Zeile
                          1,                   //Caption mitzählen
                          LVIR_BOUNDS,
                          @wr);
  //In wr haben wir nun das TRect des SubItems
end;

markus5766h 7. Jan 2017 19:01

AW: TListView SubItem Position genau feststellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Captnemo (Beitrag 1308002)
Ich Antworte mir mal selbst, da ich eine Lösung jetzt gefunden habe. (Für alle, die sowas mal suchen)

Quelle: http://www.delphisource.net/365.html

. . . .
//In wr haben wir nun das TRect des SubItems
end;[/DELPHI]

... scheint momentan nicht sehr vertrauenswürdig . . . ?
- siehe Anhang


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