StartseiteRessourcenDelphi-TippsTListView - Abstand zwischen Icons

TListView - Abstand zwischen Icons

Eine TListView-Komponente in Delphi bietet keine Eigenschaft um den Abstand zwischen den Icons (im ViewStyle = vsIcon) einzustellen. Dabei kann es zuweilen recht sinnvoll sein, diese Abstände zu vergrößern, insbesondere wenn man statt 32x32-Pixel-Icons größere Bildchen anzeigen will (z.B. Thumbnails).

Die WinAPI (genauer "comctl32.dll" version 4.70 oder höher) hält dafür das Makro "ListView_SetIconSpacing" bereit, welches LVM_SETICONSPACING Message sendet. Genaue Information dazu gibt's im Microsoft Developer Network (MSDN, http://msdn.microsoft.com/en-us/library/bb775085(VS.85).aspx). Delphi ermöglich den Zugriff auf diese Funktion in der CommCtrl.pas. Ein Aufruf sähe dann wie folgt aus:

CommCtrl.ListView_SetIconSpacing(ListView1.Handle,32+8,32+28);
The width and height parameters are relative to the upper-left corner of an icon bitmap. Therefore, to set spacing between icons that do not overlap, the cx or cy values must include the size of the icon, plus the amount of empty space desired between icons. Values that do not include the width of the icon will result in overlaps.

When defining the icon spacing, cx and cy must set to 4 or larger. Smaller values will not yield the desired layout. You can reset cx and cy to the default spacing by setting both values to -1. This approach only allows you to reset both default settings. You cannot reset only cx or cy to the default setting by setting one of them to -1.
 

Leider haben die Delphi-Programmierung die Funktion "ListView_SetIconSpacing" nicht richtig in der CommCtrl.pas umgesetzt. So ist das zurücksetzen auf die Standardabstände mit dem Befehl

CommCtrl.ListView_SetIconSpacing(ListView1.Handle,-1,-1);
leider nicht möglich, da die Delphi-Funktion als Parameter positive Zahlen (WORD) erwartet, während Microsoft Integer-Werte vorsieht.

Dieses Problem kann man umgehen, indem man die entsprechende LVM_SETICONSPACING Message selbst sendet (was sonst die Funktion "ListView_SetIconSpacing" auch nur tut). Genaue Information dazu gibt's im Microsoft Developer Network (MSDN, http://msdn.microsoft.com/en-us/library/bb761176(VS.85).aspx). Ein Aufruf sähe demnach wie folgt aus:

SendMessage(ListView1.Handle, LVM_SETICONSPACING, 0, MakeLong(32+8,32+28));
Der dritte Parameter muss immer 0 sein. Der x- und y-Anstand werden im vierten Parameter mit der Funktion "MakeLong" als Low-order und High-order Word-Wert übergeben. Will man die Abstände nur auf ihre Standardwerte zurücksetzten, verwendet man:
SendMessage(ListView1.Handle, LVM_SETICONSPACING, 0, -1);
Damit werden sowohl x- und y-Anstand zurückgesetzt. Ein einzelnes Zurücksetzten ist nicht möglich. Die Funktion SendMessage gibt in diesem Fall einen DWORD-Wert zurück, welches den vorherigen x- und y-Anstand im the low-word bzw. high-word enthält.