Witam
Zajmuję się właśnie programem do katalogowania danych.
Już prawie wszystko mam gotowe, tylko jest jeden problem.
Program ładuje z pliku liste katalogow do TreeView, a
pliki z danego katalogu do ListView - cos jak Windows'owy
explorer.
Podczas kazdego ladowania do listview na podstawie rozszerzenia
do pliku przydzielany jest obrazek. Problem w tym, że trwa
to strasznie długo! Moze ktos ma lepszy sposob?
// nieistotny kod wyciety
procedure TMainFrm.FormCreate(Sender: TObject);
begin
// zeby w WinXP nie wyswietlaly sie czarne obszarpane obramowania ikon
ImageList.Handle := ImageList_Create(16, 16, ILC_COLOR32 or ILC_MASK, 0, 0);
end;
function TMainFrm.GetAssociatedIcon(const AExtension: string; ASmall: Boolean): Integer;
var
Info: TSHFileInfo;
Flags: Cardinal;
begin
if ASmall then
Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES
else
Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;
SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags);
Result := Info.hIcon;
procedure TMainFrm.RefreshListView(FileList: TList); //lista z obiektami typu TFile - to nieistotne
var
cFile: TFile;
i: integer;
Item: TListItem;
Attrs: string;
Icon: TIcon;
Child: TTreeNode;
begin
// BeginUpdate i EndUpdate sa w innej procedurze!
LV.Items.Clear;
StatusBar.Panels[1].Text := 'Wczytywanie danych...';
Images.ShareImages := True;
Icon := TIcon.Create;
for i := 0 to FileList.Count - 1 do
begin
cFile := TFile(FileList.Items[i]);
Item := LV.Items.Add;
with Item do
begin
Caption := cFile.FileName;
// bez ponizszych dwoch linijek wczytywanie jest kilkanascie razy szybsze:
Icon.Handle := GetAssociatedIcon(ExtractFileExt(cFile.FileName), True);
ImageIndex := Images.AddIcon(Icon);
{...}
end;
end;
Icon.Free;
StatusBar.Panels[1].Text := 'Gotowe';
end;