[Delphi] - Mehrspaltig

Hallo.

wie mache ich sowas :wink:

http://delphi312.tripod.com/temp.jpg

bye
Martin

Mit FindFist, FindNext, FindClose und nem TListView :smile:

Hi Martin,
die Dateien grabbelst Du Dir mit FindFirst, FindNext zusammen. In der Prozedur ScanFiles werden die dann in einen ListView (ViewStyle auf vsReport stellen) eingelesen. Die erste Spalte ist dabei die Eigenschaft „Caption“ der Listvieweinträge, die nächsten Spalten füllst Du mit " NewItem.SubItems.Add(inttostr(SearchRec.Size));"…

procedure TMainForm.ScanFiles(AFileMask: string);
var
 Found : Integer;
 SearchRec : TSearchRec;
 NewItem : TListItem;
 ShFileInfo : TShFileInfo;
begin
 ListViewFiles.Items.BeginUpdate;
 try
 ListViewFiles.Items.Clear;
 Found := FindFirst(CurrentDir + '\'+ AFileMask, faAnyFile - faDirectory - faHidden, SearchRec);
 while Found = 0 do
 begin
 NewItem := ListViewFiles.Items.Add;
 // Dateiname
 NewItem.Caption := SearchRec.Name;
 // Icon anzeigen
 ShGetFileInfo (PChar(CurrentDir + NewItem.Caption), 0, ShFileInfo, SizeOf(ShFileInfo),
 shgfi\_SysIconIndex or shgfi\_Icon or
 shgfi\_DisplayName or shgfi\_SmallIcon);
 NewItem.ImageIndex := ShFileInfo.IIcon;
 // Größe
 NewItem.SubItems.Add(inttostr(SearchRec.Size));
 Found := FindNext(SearchRec);
 end;
 finally
 FindClose(SearchRec);
 ListViewFiles.Items.EndUpdate;
 end;
end;

Das zugehörige SystemIcon lese ich aus den ImageListen des Listviews, die ich vorher mit der sgn. SystemImageList gefüllt habe, in der alle Icons der bekannten Dateitypen drin sind.

procedure TMainForm.GetSystemImageList;
{--------------------------------------------------------------------
 System-Iconlisten lesen für Datei-Icon
 --------------------------------------------------------------------}
var
 SysImageList : Integer; // temporäres Handle für System ImageLists
 ShFileInfo : TShFileInfo;
begin
 ListViewFiles.LargeImages := TImageList.Create(Self);
 SysImageList := ShGetFileInfo('', 0, ShFileInfo, SizeOf(ShFileInfo),
 shgfi\_SysIconIndex or shgfi\_LargeIcon);
 if SysImageList 0 then
 begin
 ListViewFiles.LargeImages.Handle := SysImageList;
 ListViewFiles.LargeImages.ShareImages := True;
 end;
 ListViewFiles.SmallImages := TImageList.Create(Self);
 SysImageList := ShGetFileInfo('', 0, ShFileInfo, SizeOf(ShFileInfo),
 shgfi\_SysIconIndex or shgfi\_SmallIcon);
 if SysImageList 0 then
 begin
 ListViewFiles.SmallImages.Handle := SysImageList;
 ListViewFiles.SmallImages.ShareImages := True;
 end;
end;

Gruß Thomas

Übrigens wird mit der obigen Methode nur ein Icon in der ersten Spalte gezeichnet (automatisch). Wenn Du in den anderen Spalten auch Icons darstellen willst, mußt Du m.E. die Eigenschaft „OwnerDraw“ des Listviews auf True setzen und im Ereignis „OnDrawItem“ den ganzen Mist selbst zeichnen…Ist nicht jedermanns Sache :o) Wenn Du das vorhast, schreib ich mal ein Beispiel für so ein Ereignis…

Gruß Thomas