Autor Beitrag
MedanoCC
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 10.08.02 18:27 
So hallo erstmal !!

Mein erster Eintrag hier in diesem Board und ich bin echt gespannt ob ihr da drausen eine Antwort auf mein Problem habt :)

Und zwar will ich die Höhe der Einträge bzw. der Zeilen in einem ListView einstellen. Also nicht die Breite der Columns sondern die Höhe der Items.

In einem ListBox ist dies kein Problem, jedoch in einem ListView schon eher.

Unter Kylix oder der CLX Programmierung ist die mithilfe der Eigenschaft "Height" von "TCustomViewItem" ohne weiteres möglich. Ein Übertragen ins VCL jedoch funktioniert nicht.

Auch in der WINAPI DDK konnte ich keine Antwort hierzu finden. Aber vielleicht hier ?? :D


Ich bin gespannt....

MedanoCC
Arakis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: Mi 14.08.02 10:20 
Hi,
vermutlich muss ich dich auch enttäuschen: Es gibt tatsächlich keinen eindeutigen Weg, die Höhe eines Items einzustellen. Die Infos, die ich gefunden habe redeten alle in den Dunst hinein, also unbrauchbar. Jedenfalls musst du einen TCustomListView erstellen, mehr hab ich nicht gefunden :cry:

Bis dann
user defined image

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
MedanoCC Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 14.08.02 17:54 
Titel: DIE ANTWORT !!
Also, falls es jemand interessiert :) , hier die Antwort:

Es ist nicht mehr im Nachhinein machbar !
Um dieses trotzdem handeln zu können, muss also die Windows Message WM_MEASUREITEM abgefangen werden, die an das dem ListView übergeordneten Fenster bzw. an den Besitzer des ListView gesendet wird.

Hier muss man nun den Zeiger "lParam" mit einem Record des Typs MEASUREITEMSTRUCT "verknüpfen" und so erhält man die Parameter der Nachricht WM_MEASUREITEM.

Aus dem Record kann man nun den Typ des zu erstellenden Controls feststellen, also in diesem Fall ein ListView und man kann dann mittels der Eigenschaften "itemHeight" die Höhe der Eintragszeilen festlegen.
(Für die, die hiermit noch nicht so bewandert sind, kleine Anmerkung: Der Record wird nach Beendigung des WindowProc an den Control, hier ListView, zurückgegeben und dieses wertet dann die eingestellten Eigenschaften aus).

So kann man also dann doch die Höhe der Einträge festlegen.
Um das ganze im Nachhinein festzulegen, muss man Windows einfach vorgauckeln, dass das Control komplett neu gezeichnet werden muss und schon greift WM_MEASUREITEM.

Übrigens: Dieses Vorgehen ist dasselbe, wie wenn ein Menü von Hand per OwnerDraw ohne VCL erstellt werden soll ;)

Mehr Infos in der WinAPI oder im Google nach "Listview Item height" suchen und den zweiten gefundenen Eintrag anzeigen :D


Soweit von mir von hier....


MedanoCC

P.S.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 
Procedure TBESITZER.WndProc(var Message: TMessage);
var ItemStruct: PMEASUREITEMSTRUCT;
begin
with Message do
        case Msg of
        WM_MEASUREITEM: if wParam <> 0 then
                                begin
                                ItemStruct:= PMEASUREITEMSTRUCT( lParam );
                                if ItemStruct.CtlType = 102 then                     //ODT_LISTVIEW
                                          { Stellt die ListViews ein }
                                        ItemStruct.itemHeight:= 18;                  //Höhe der Einträge
                                end;
        end;
Inherited WndProc(Message);
end;