Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Der Tile-Modus

  Alt 2. Mär 2003, 18:59
Der Tile-Modus ist ebenfalls aus dem Explorer bekannt. Man sieht dabei das Icon, und rechts daneben steht der Dateiname, und darunter (abhängig vom Typ) noch zusätzliche Infos. Zur Benutzung müssen wir der List-View erst mitteilen, wie wir uns den Kachelmodus vorstellen. Dazu gibt´s das Record TLVTileViewInfo, das wir am besten im "OnCreate" der Form füllen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  tileview : TLVTileViewInfo; // CommCtrl_Fragment.pas
begin
  // Recordgröße initialisieren
  tileview.cbSize := sizeof(TLVTileViewInfo);

  // was wollen wir beeinflussen? die Anzahl der zusätzlichen Zeilen
  tileview.dwMask := LVTVIM_COLUMNS;

  // die Tiles sollen sich möglichst automatisch anpassen
  tileview.dwFlags := LVTVIF_AUTOSIZE;

  // wie viele zusätzliche Zeilen sollen es denn sein?
  tileview.cLines := 2;

  // und ab damit zur List-View
  ListView_SetTileViewInfo(lv1.Handle,tileview);
end;
Wichtig erscheint mir diese Zeile:
  tileview.cLines := 2; Damit wird der List-View mitgeteilt, wie viele zusätzliche Zeilen im Kachelmodus zu sehen sein sollen. Das bedeutet: zusätzlich zum Itemnamen (TListItem.Caption), der ja sowieso und in jedem Darstellungsmodus angezeigt wird!

Nehmen wir als Beispiel einen kleinen Explorer, der die Dateien des aktuellen Ordners anzeigt. Im Reportmodus zeigt er außerdem in der Spalte #1 die Dateigröße und in Spalte #2 das Datum. Was wir davon im Kachelmodus sehen, hat ursächlich mit diesen Spalten im Reportmodus zu tun.
Anzumerken ist noch, dass der Kachelmodus für jedes Item separat eingestellt werden muss. Das hört sich umständlich an, bietet aber auch den Vorteil, die Ansicht direkt zu beeinflussen. Ich zeige ein Mini-Beispiel aus dem "OnCreate" der Form:
Delphi-Quellcode:
res := FindFirst(ExtractFilePath(paramstr(0)) + '*.*',
  faAnyFile,ds);

while(res = 0) do begin
  if(ds.Attr and faDirectory = 0) then begin
    // wie gehabt, füllen wir die List-View
    lv := lv1.Items.Add;
    lv.Caption := ds.Name;
    lv.ImageIndex := 0;
    lv.SubItems.Add(inttostr(ds.Size) + ' Bytes');
    lv.SubItems.Add(FormatDateTime('',FileDateToDateTime(ds.Time)));

// JETZT KOMMT DER TILE-MODUS -->

    // wir initialisieren das TLVTileInfo-Record
    tile.cbSize := sizeof(TLVTileInfo);

    // welches Item ist´s?
    tile.iItem := lv1.Items.Count - 1;


    // wie viele zusätzliche Zeilen sollen es für
    // dieses spezielle Item sein?
    tile.cColumns := 2;

    // welche Spalten sollen angezeigt werden?
    tile.puColumns := @ca[0];

    // an die List-View übergeben
    ListView_SetTileInfo(lv1.Handle,tile);
  end;

  res := FindNext(ds);
end;
FindClose(ds);
Wichtig hierbei ist diese Anweisung:
    tile.puColumns := @ca[0]; "ca" ist dabei ein Integer-Array, das die Indexwerte der anzuzeigenden Spalten enthält:
Delphi-Quellcode:
var
  ca : array[0..1]of integer = (1,2);
Wenn wir davon ausgehen, dass -wie oben erwähnt!- die erste Spalte die Dateigröße und die zweite das Datum enthält, dann würden wir im Tile-Modus also auch unter dem Dateinamen erst die -größe und dann das Datum sehen. Tauschen wir die Angabe um, etwa
Delphi-Quellcode:
var
  ca : array[0..1]of integer = (2,1);
dann sähen wir erst das Datum und dann die Größe. Abhängig von den Spalten, die ihr im Reportmodus habt (oder generell: falls ihr versteckte Subitems habt, die in keiner Spalte auftauchen!), könnt ihr mit dem Array beeinflussen, was im Tile-Modus zu sehen sein soll.

That's all.

(PS: Fehler mit "Code" vs. "Delphi" im Text gefixt.)
  Mit Zitat antworten Zitat