Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Пример загрузки файлов в ListView с иконками

01.01.2007
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, comctrls,
StdCtrls;
type
TForm1
= class(TForm)
ListView1
: TListView;
Button1
: TButton;
Button2
: TButton;
procedure Button1Click
(Sender: TObject);
procedure Button2Click
(Sender: TObject);
private
procedure
SaveListViewToFile(AListView: TListView; sFileName: string);
procedure
LoadListViewToFile(AListView: TListView; sFileName: string);
public
end;
const
Msg1
= 'File "%s" does not exist!';
Msg2
= '"%s" is not a ListView file!';
var
Form1
: TForm1;
implementation
{$R *.DFM}
procedure TForm1
.SaveListViewToFile(AListView: TListView; sFileName: string);
var
idxItem
, idxSub, IdxImage: Integer;
F
: TFileStream;
pText
: PChar;
sText
: string;
W
, ItemCount, SubCount: Word;
MySignature: array [0..2] of Char;
begin
//Initialization
with AListView do
begin
ItemCount := 0;
SubCount := 0;
//****
MySignature := 'LVF';
// ListViewFile
F
:= TFileStream.Create(sFileName, fmCreate or fmOpenWrite);
F
.Write(MySignature, SizeOf(MySignature));
if Items.Count = 0 then
// List is empty
ItemCount := 0
else
ItemCount := Items.Count;
F
.Write(ItemCount, SizeOf(ItemCount));
if Items.Count > 0 then
begin
for idxItem := 1 to ItemCount do
begin
with Items[idxItem - 1] do
begin
//Save subitems count
if SubItems.Count = 0 then SubCount := 0 else SubCount := Subitems.Count;
F
.Write(SubCount, SizeOf(SubCount));
//Save ImageIndex
IdxImage := ImageIndex;
F
.Write(IdxImage, SizeOf(IdxImage));
//Save Caption
sText
:= Caption;
w
:= Length(sText);
pText
:= StrAlloc(Length(sText) + 1);
StrPLCopy(pText, sText, Length(sText));
F
.Write(w, SizeOf(w));
F
.Write(pText^, w);
StrDispose(pText);
if SubCount > 0 then
begin
for idxSub := 0 to SubItems.Count - 1 do
begin
//Save Item's subitems
sText
:= SubItems[idxSub];
w
:= Length(sText);
pText
:= StrAlloc(Length(sText) + 1);
StrPLCopy(pText, sText, Length(sText));
F
.Write(w, SizeOf(w));
F
.Write(pText^, w);
StrDispose(pText);
end;
end;
end;
end;
end;
F
.Free;
end;
end;
procedure TForm1
.LoadListViewToFile(AListView: TListView; sFileName: string);
var
F
: TFileStream;
IdxItem, IdxSubItem, IdxImage: Integer;
W
, ItemCount, SubCount: Word;
pText
: PChar;
PTemp: PChar;
MySignature: array [0..2] of Char;
sExeName
: string;
begin
with AListView do
begin
ItemCount := 0;
SubCount := 0;
sExeName
:= ExtractFileName(sFileName);
if not FileExists(sFileName) then
begin
MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
Exit;
end;
F
:= TFileStream.Create(sFileName, fmOpenRead);
F
.Read(MySignature, SizeOf(MySignature));
if MySignature <> 'LVF' then
begin
MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
Exit;
end;
F
.Read(ItemCount, SizeOf(ItemCount));
Items.Clear;
for idxItem := 1 to ItemCount do
begin
with Items.Add do
begin
//Read imageindex
F
.Read(SubCount, SizeOf(SubCount));
//Read imageindex
F
.Read(IdxImage, SizeOf(IdxImage));
ImageIndex := IdxImage;
//Read the Caption
F
.Read(w, SizeOf(w));
pText
:= StrAlloc(w + 1);
pTemp
:= StrAlloc(w + 1);
F
.Read(pTemp^, W);
StrLCopy(pText, pTemp, W);
Caption := StrPas(pText);
StrDispose(pTemp);
StrDispose(pText);
if SubCount > 0 then
begin
for idxSubItem := 1 to SubCount do
begin
F
.Read(w, SizeOf(w));
pText
:= StrAlloc(w + 1);
pTemp
:= StrAlloc(w + 1);
F
.Read(pTemp^, W);
StrLCopy(pText, pTemp, W);
Items[idxItem - 1].SubItems.Add(StrPas(pText));
StrDispose(pTemp);
StrDispose(pText);
end;
end;
end;
end;
F
.Free;
end;
end;
// Example:
procedure TForm1
.Button1Click(Sender: TObject);
begin
// Save Items and Clear the ListView
SaveListViewToFile(ListView1, 'MyListView.sav');
ListView1
.Items.Clear;
end;
procedure TForm1
.Button2Click(Sender: TObject);
begin
// Load Items
LoadListViewToFile(ListView1, 'MyListView.sav');
end;

Автор: Song

Взято с Vingrad.ru https://forum.vingrad.ru


Удобнее всего воспользоваться компонентом ListView. Его используют многие программы, так как он позволяет очень просто создать удобный список.

Вначале создадим ImageList и с помощью функции WinAPI SHGetFileInfo заполним его иконками, связанными со всеми зарегистрированными расширениями. Затем, при выборе пользователем в DirectoryListBox каталога, найдем все файлы в этом каталоге и для каждого определим иконку при помощи той же функции SHGetFileInfo. И еще к каждому элементу списка добавляется размер файла. Если вывести список в виде таблицы (для этого нужно выбрать пункт Table в ComboBox), то справа от имени каждого файла окажется его размер.

uses ShellAPI;
 
procedure
UpdateFiles;
var
  sr
: TSearchRec;
  li
: TListItem;
 
fi: TSHFileInfo;
  ext
: string;
 
IconIndex: word;
  ic
: TIcon;
begin
  Form1
.ListView1.Items.BeginUpdate;
  Form1
.ListView1.Items.Clear;
 
if FindFirst(Form1.DirectoryListBox1.Directory + '\*.*', faAnyFile, sr)= 0 then
 repeat
   
if sr.Attr and faDirectory <> 0 then continue;
    li
:= Form1.ListView1.Items.Add;
 
    li
.Caption := sr.Name;
    ext
:= LowerCase(ExtractFileExt(li.Caption));
   
ShGetFileInfo(PChar('*' + ext), 0, fi, SizeOf(fi),
      SHGFI_SMALLICON
or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
    li
.ImageIndex := fi.iIcon;
   
if sr.Size < 1024
     
then li.SubItems.Add(IntToStr(sr.Size) + ' byte')
     
else if sr.Size < 1024 * 1024
       
then li.SubItems.Add(IntToStr(round(sr.Size / 1024)) + ' KByte')
       
else li.SubItems.Add(IntToStr(round(sr.Size / (1024 * 1024))) + ' MByte');
 
    li
.SubItems.Add(fi.szTypeName);
 
until FindNext(sr) <> 0;
 
FindClose(sr);
  Form1
.ListView1.Items.EndUpdate;
end;
 
procedure TForm1
.FormCreate(Sender: TObject);
var
 
fi: TSHFileInfo;
  lc
: TListColumn;
begin
  DriveComboBox1
.DirList := DirectoryListBox1;
 
with ListView1 do begin
   
SmallImages := TImageList.CreateSize(16,16);
   
SmallImages.Handle := ShGetFileInfo('*.*', 0, fi,
     
SizeOf(fi), SHGFI_SMALLICON or SHGFI_ICON
 
     
or SHGFI_SYSICONINDEX);
   
LargeImages := TImageList.Create(nil);
   
LargeImages.Handle := ShGetFileInfo('*.*', 0, fi,
     
SizeOf(fi), SHGFI_LARGEICON or SHGFI_ICON
     
or SHGFI_SYSICONINDEX);
    lc
:= Columns.Add;
    lc
.Caption := 'Name';
    lc
:= Columns.Add;
    lc
.Caption := 'Size';
    ComboBox1
.Items.Add('Icons');
    ComboBox1
.Items.Add('List');
    ComboBox1
.Items.Add('Table');
    ComboBox1
.Items.Add('SmallIcons');
    ComboBox1
.ItemIndex := 0;
 
 
end;
 
UpdateFiles;
end;
 
procedure TForm1
.DirectoryListBox1Change(Sender: TObject);
begin
 
UpdateFiles;
end;
 
procedure TForm1
.ComboBox1Click(Sender: TObject);
begin
 
case ComboBox1.ItemIndex of
   
0: ListView1.ViewStyle := vsIcon;
   
1: ListView1.ViewStyle := vsList;
   
2: ListView1.ViewStyle := vsReport;
   
else ListView1.ViewStyle := vsSmallIcon;
 
end;
end;

Автор: Даниил Карапетян (delphi4all@narod.ru)

Автор справки: Алексей Денисов (aleksey@sch103.krasnoyarsk.su)