So´n Quark, Daniel B. Nichts für ungut, dennoch.
Der Fehler bezieht sich darauf, dass bestimmte "Common Controls" der älteren Delphi-Versionen (bis einschließlich D6, würde ich mal behaupten) unter bestimmten Umständen Fehler verursachen, wenn man sie mit der Manifest-Datei von WinXP im neuen Glanz "erstrahlen" lassen will. Im Fall der Listview wäre das im "vsReport"-Modus.
Die mir bekannten XP-Komponenten funktionieren alle nach dem selben Prinzip: sie stellen dem Programm die besagte
XML-Manifest-Datei zur Verfügung; ob nun extern oder in den Resourcen.
Da erst Delphi 7 offiziell mit einer kompletten WinXP-Unterstützung ausgewiesen wurde, müssen
IMHO also alle älteren Versionen manuell fit gemacht werden. Das hat mit den Komponenten, wenn es denn um den LUNA-Stil von WinXP geht, nichts zu tun.
@Scorpion: Keine Ahnung, wo dein Fehler liegt, aber prinzipiell steht alles im Kommentar drin.
Unit "ComCtrl.pas" öffnen -> die genannte Prozedur suchen -> die auskommentierte Zeile suchen, auskommtentieren und dann das reinschreiben, was die Schweizer angeben -> die
Unit kompilieren und das Programm mit einer Listview testen ...
Vielleicht hätte man besser die komplette Prozedur zeigen sollen; nicht nur den Auszug, das könnte ein Grund für die Verwirrung sein. Meine sieht übrigens so aus:
Code:
procedure TCustomListView.UpdateColumn(AnIndex: Integer);
const IAlignment: array[Boolean, TAlignment] of LongInt =
((LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER),
(LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_CENTER));
var
Column: TLVColumn;
AAlignment: TAlignment;
begin
if HandleAllocated then
with Column, Columns.Items[AnIndex] do
begin
mask := LVCF_TEXT or LVCF_FMT or LVCF_IMAGE;
iImage := FImageIndex;
pszText := PChar(Caption);
AAlignment := Alignment;
if Index <> 0 then
fmt := IAlignment[UseRightToLeftAlignment, AAlignment]
else fmt := LVCFMT_LEFT;
if FImageIndex <> -1 then
fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES
// WinXP patch
else
mask := mask and not (LVCF_IMAGE);
if WidthType > ColumnTextWidth then
begin
mask := mask or LVCF_WIDTH;
cx := FWidth;
ListView_SetColumn(
Handle, Columns[AnIndex].FOrderTag, Column);
end
else begin
ListView_SetColumn(
Handle, Columns[AnIndex].FOrderTag, Column);
if ViewStyle = vsList then
ListView_SetColumnWidth(
Handle, -1, WidthType)
else if (ViewStyle = vsReport) and not OwnerData then
ListView_SetColumnWidth(
Handle, Columns[AnIndex].FOrderTag, WidthType);
end;
end;
end;