Delphi XE2:TListView作为平铺视图在Windows XP中不起作用

时间:2012-02-10 02:12:53

标签: delphi delphi-xe2

我有一个在TListView控件上使用LV_VIEW_TILE的代码:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, ComCtrls, CommCtrl,
  StdCtrls;

procedure TileView(aListView: TListView);
var
  ti: TLVTILEINFO;
  Order: array of Integer;
  tvi: TLVTILEVIEWINFO;
  i: integer;
begin
  ListView_SetView(aListView.Handle, LV_VIEW_TILE);

  for i := 0 to aListView.Items.Count - 1 do begin
    FillChar(ti, SizeOf(ti), 0);
    ti.cbSize := SizeOf(ti);
    // First item
    ti.iItem := i;
    // Specifying the order for three columns
    ti.cColumns := 4;
    // Array initialization
    SetLength(order, ti.cColumns);
    // The order is 2nd, 3rd and 4th columns
    order[0] := 1;
    order[1] := 2;
    order[2] := 3;
    order[3] := 4;
    ti.puColumns := PUINT(order);
    ListView_SetTileInfo(aListView.Handle, ti);
  end;

  tvi.cbSize := Sizeof(tvi);
  tvi.dwMask := LVTVIM_COLUMNS;
  // Requesting space to draw the caption + 3 subitems
  tvi.cLines := aListView.Columns.Count;
  ListView_SetTileViewInfo(aListView.Handle, tvi);
end;

procedure TForm3.FormCreate(Sender: TObject);
var V: TListView;
    A: TListItem;
begin
  V := TListView.Create(Self);
  V.Parent := Self;
  V.Align := alClient;

  V.Columns.Add;

  A := V.Items.Add;
  A.Caption := 'Item A';
  A.SubItems.Add('Sub A');

  A := V.Items.Add;
  A.Caption := 'Item B';
  A.SubItems.Add('Sub B');

  TileView(V);
end;

使用Delphi 2007编译和构建代码并在Windows XP中运行该应用程序,它显示:

enter image description here

使用Delphi XE2编译相同的代码并在Windows XP中运行,它显示:

enter image description here

在Delphi XE2中编译时没有显示子项。

两个Delphi 2007 / XE2应用程序都在Windows 7中显示平铺视图子项。

我已尝试在应用程序的资源中嵌入清单或外部文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
  type="win32"
  name="DelphiApplication"
  version="1.0.0.0"
  processorArchitecture="*"/>
  <dependency>
  <dependentAssembly>
    <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    processorArchitecture="*"/>
  </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
    <requestedExecutionLevel
      level="asInvoker"
      uiAccess="false"/>
    </requestedPrivileges>
  </security>
  </trustInfo>
</assembly>

为什么Delphi XE2编译的应用程序在Windows XP中没有显示平铺视图的想法?

1 个答案:

答案 0 :(得分:2)

Delphi XE2中的单元Winapi.CommCtrl.pas定义:

tagLVTILEINFO = record
  cbSize: UINT;
  iItem: Integer;
  cColumns: UINT;
  puColumns: PUINT;

  piColFmt: PInteger;

end;

MSDN API定义为:

typedef struct LVTILEINFO {
  UINT  cbSize;
  int   iItem;
  UINT  cColumns;
  PUINT puColumns;
#if (_WIN32_WINNT >= 0x0600)
  int   *piColFmt;
#endif 
} LVTILEINFO, *PLVTILEINFO;

piColFmt不应在Windows XP平台中使用。删除piColFmt应该适用于Windows XP。