AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView ItemHeight

Ein Thema von EWeiss · begonnen am 12. Jan 2017 · letzter Beitrag vom 13. Jan 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: ListView ItemHeight

  Alt 12. Jan 2017, 10:06
Bringt dich das weiter:

https://community.embarcadero.com/bl...in-10-1-berlin

Ich weiss allerdings nicht, in wie weit das bei der VCL funktioniert.
Nope NonVcl nicht VCL..
Werde wohl nicht drum herum kommen die Höhe abhängig vom Font über GdipMeasureString (boundingBox) zu ermitteln.
Ist jetzt wider zusätzlicher aufwand aber was soll's

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: ListView ItemHeight

  Alt 12. Jan 2017, 10:13
Willst du das vorher wissen und selber die Höhe errechnen und die Itemhöhe setzen oder interessiert dich die Höhe des Items nach dem Ändern der Schrift?
Bei letzteren erhälst du die Höhe des Items über das TRect prc:

Delphi-Quellcode:
function ListView_GetItemRect(hWnd: HWND; i: Integer; var prc: TRect;
  Code: Integer): Bool;
begin
  if @prc <> nil then
  begin
    prc.left := Code;
    Result := Bool(SendMessage(hWnd, LVM_GETITEMRECT, i, LPARAM(@prc)));
  end
  else
    Result := Bool(SendMessage(hWnd, LVM_GETITEMRECT, i, 0));
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: ListView ItemHeight

  Alt 12. Jan 2017, 10:54
Willst du das vorher wissen und selber die Höhe errechnen und die Itemhöhe setzen oder interessiert dich die Höhe des Items nach dem Ändern der Schrift?
Bei letzteren erhälst du die Höhe des Items über das TRect prc:

Delphi-Quellcode:
function ListView_GetItemRect(hWnd: HWND; i: Integer; var prc: TRect;
  Code: Integer): Bool;
begin
  if @prc <> nil then
  begin
    prc.left := Code;
    Result := Bool(SendMessage(hWnd, LVM_GETITEMRECT, i, LPARAM(@prc)));
  end
  else
    Result := Bool(SendMessage(hWnd, LVM_GETITEMRECT, i, 0));
end;
Ahh Danke dann kann ich mir den GDI+ Kram sparen.
Delphi-Quellcode:
  if FItemHeight = 0 then
  begin
    ListView_GetItemRect(hListView, nItem, rc, LVIR_LABEL);
    FItemHeight := rc.Bottom - rc.top;
  end;
gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: ListView ItemHeight

  Alt 12. Jan 2017, 11:02
OPs.. Geht doch nicht.
Wenn ich einen höheren Fontsize sagen wir mal 16 verwende geht es wieder nicht.
Bei 12 ist das kein Problem da bekomme ich die 19 so wie jetzt eingestellt.

Bei 16 sind es 22
Wenn ich das über GDI+ mache bekomme ich die korrekt höhe erst beim zeichnen.
Ich brauche sie aber früher.

Wenn die höhe nicht exakt stimmt wird das falsche Item selektiert bzw. ein falscher Song abgespielt.
Hmm...

gruss

Geändert von EWeiss (11. Jul 2019 um 15:45 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: ListView ItemHeight

  Alt 12. Jan 2017, 11:28
Hast du mal, versucht es über den Code zu versuchen, den ich gepostet habe? Bei mir funktioniert der. Allerdings funktioniert er unter iOS/Android nicht, wenn die Schriftgröße der Standardgröße entspricht
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: ListView ItemHeight

  Alt 12. Jan 2017, 11:38
Hast du mal, versucht es über den Code zu versuchen, den ich gepostet habe? Bei mir funktioniert der. Allerdings funktioniert er unter iOS/Android nicht, wenn die Schriftgröße der Standardgröße entspricht
Es wird nicht funktionieren weil dafür das ListView sichtbar sein muss (in dem von dir verlinkten Beispiel).
Ich benötige die ItemHöhe aber vorher weil abhängig davon die Images gezeichnet werden die anzeigen ob ein Eintrag selektiert wurde
bzw. beim drüberfahren auf den Items.

Bei GDI+ habe ich das Problem das ich kein gültiges DC habe solange nichts gezeichnet wird.


gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: ListView ItemHeight

  Alt 13. Jan 2017, 07:58
Edit: Quatsch!

Geändert von TiGü (13. Jan 2017 um 08:02 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: ListView ItemHeight

  Alt 13. Jan 2017, 08:06
Edit: Quatsch!
Zitat:
Ist hListView ein Handle auf die ListView oder auf das ListItem?
Die Funktion erwartet das Handle eines einzelnen ListItem.
Erwartet das ListView Handle und gibt den Rect des Item zurück

Nebenbei:
Salopp gesagt!
Ist der größte Mist mit dem ListView warum konnte man das nicht so wie bei der ListBox händeln.
Extrem verkompliziert das ganze.

gruss

Geändert von EWeiss (13. Jan 2017 um 08:08 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: ListView ItemHeight

  Alt 13. Jan 2017, 09:40
Genau das ist doch der Vorteil des ListView, dass nur die sichtbaren Elemente auch vorhanden sind. Bei der ListBox sind immer alle vorhanden und brauchen damit viel Speicher und lange zum Erstellen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: ListView ItemHeight

  Alt 13. Jan 2017, 09:48
Genau das ist doch der Vorteil des ListView, dass nur die sichtbaren Elemente auch vorhanden sind. Bei der ListBox sind immer alle vorhanden und brauchen damit viel Speicher und lange zum Erstellen.
Ach das ist doch eine frage wie man die Einträge behandelt.
Wenn man alle nicht sichtbaren Einträge behandelt ist das kein Wunder es geht aber auch anders. (Ist aber nicht mein Problem)
Vorteile sehe ich da bei dem ListView in dieser Hinsicht keine.

Listbox
Delphi-Quellcode:
        TopIndex := ListGetTopIndex(WinHandle);
        Count := ListCount(WinHandle);
        for i := TopIndex to Count do
        begin
ListView
Delphi-Quellcode:
        TopIndex := ListView_GetTopIndex(WinHandle);
        Count := ListView_GetItemCount(WinHandle);
        for i := TopIndex to Count do
        begin
Unterschiede sehe ich da keine bei beiden müssen alle Einträge durchlaufen werden.

Hingegen.. bei der abfrage von nur sichtbaren teilen werden die nicht sichbaren Teile nicht mehr gezeichnet beim Scrollen.

Delphi-Quellcode:
        TopIndex := ListView_GetTopIndex(WinHandle);
        Count := ListView_GetCountPerPage(WinHandle);
        for i := TopIndex to Count do
        begin
Wo ist da der Vorteil?
Warum also gibt es kein LVM_SETTOPINDEX wie bei der ListBox LB_SETTOPINDEX.. sorry das ist Schmarrn.
Hier muss man mit Pixeln rechnen abhängig vom Font.. bei der ListBox nicht nötig.

Das gleiche mit der VScrollBar die kann man nicht abschalten und wenn man es tut lässt sich das ListView nicht mehr scrollen.

gruss

Geändert von EWeiss (13. Jan 2017 um 10:01 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz