Delphi XE2: TListView как представление листов не работает в Windows XP - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть код, который использует LV_VIEW_TILE для элемента управления TListView:

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 Ответ

2 голосов
/ 05 сентября 2012

Блок Winapi.CommCtrl.pas в Delphi XE2 определяет:

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.

...