Registriert seit: 1. Feb 2018
3.691 Beiträge
Delphi 11 Alexandria
|
AW: VirtualTreeView, OnGetImageIndexEx und OverlayImages
20. Mär 2018, 18:58
Vielleicht kann die dieser Abschnitt aus meinen Code helfen, arbeitet mit ListView, der liest ein Verzeichniss ein und gibt es mit icons und mini-Info aus.
Leider weder optimiert, noch gut anzuschauen, zumindest macht es das was ich vorhatte.
Delphi-Quellcode:
procedure GetFiles(const hLV: HWND; Path, Mask: String);
var
finddata : TWin32FindData;
hFile : cardinal;
Loop : dword;
lvi : TLVItem;
buf : array[0..25]of char;
tile : TLVTileInfo;
fi : TSHFileInfo;
LVIMark : TLVInsertMark;
tmp : String;
i : integer;
begin
hFile := FindFirstFile(PChar(IncludeTrailingPathDelimiter(Path) + Mask), finddata);
if(hFile <> INVALID_HANDLE_VALUE) then begin
LockWindowUpdate(hDlg);
LastFolder := IncludeTrailingPathDelimiter(Path);
Loop := 0;
repeat
if(finddata.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then begin
ZeroMemory(@fi, sizeof(TSHFileInfo));
ListView_SetImageList(hLV,
SHGetFileInfo(PChar(IncludeTrailingPathDelimiter(Path) + finddata.cFilename), 0,
fi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_SMALLICON), LVSIL_SMALL);
ZeroMemory(@fi, sizeof(TSHFileInfo));
ListView_SetImageList(hLV,
SHGetFileInfo(PChar(IncludeTrailingPathDelimiter(Path) + finddata.cFilename), 0,
fi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_ICON), LVSIL_NORMAL);
lvi.mask := LVIF_TEXT or LVIF_IMAGE;
lvi.iItem := Loop;
lvi.iSubItem := 0;
lvi.pszText := finddata.cFileName;
i := 0;
lvi.iImage := fi.iIcon;
ListView_InsertItem(hLV, lvi);
tmp := IntToStr(finddata.nFileSizeLow)+' byte';
if (finddata.nFileSizeLow / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024),-1,2)+' kb';
if (finddata.nFileSizeLow / 1024 / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024 / 1024),-1,2)+' mb';
if (finddata.nFileSizeLow / 1024 / 1024 / 1024) > 1 then tmp := FloatToStr((finddata.nFileSizeLow / 1024 / 1024 / 1024),-1,2)+' gb';
lvi.mask := LVIF_TEXT;
lvi.iSubItem := 1;
lvi.pszText := pChar(tmp);
ListView_SetItem(hLV, lvi);
lvi.mask := LVIF_TEXT;
lvi.iSubItem := 2;
lvi.pszText := fi.szTypeName;
ListView_SetItem(hLV, lvi);
// ZeroMemory(@buf, sizeof(buf));
// wvsprintf (buf, '%u byte', pchar(@finddata.nFileSizeLow));
lvi.mask := LVIF_TEXT;
lvi.iSubItem := 3;
lvi.pszText := pChar(IntToStr(finddata.nFileSizeLow)); //buf;
ListView_SetItem(hLV, lvi);
if GetOSVersion = osXP then begin
tile.cbSize := sizeof(TLVTileInfo);
tile.iItem := Loop;
// tile.cColumns := length(colArray);
tile.puColumns := @colArray[0];
ListView_SetTileInfo(hLV, tile);
end;
LVIMark.cbSize := sizeof(TLVInsertMark);
LVIMark.dwFlags := LVIM_AFTER;
LVIMark.iItem := Loop;
LVIMark.dwReserved := 0;
ListView_SetInsertMark(hLV, LVIMark);
if LowerCase(ExtractFileName(SelectedFile)) = LowerCase(finddata.cFileName) then
begin
{ if LowerCase(ExtractFileName(SelectedFile)) = LowerCase(finddata.cFileName) then
ListView_SetItemState(hLV, Loop, 0, LVIS_SELECTED);}
lvi.stateMask := LVIS_SELECTED;
lvi.state := LVIS_SELECTED;
SendMessage(hLV, LVM_SETITEMSTATE, Loop, Longint(@lvi))
end;
Inc(Loop);
end;
until (not FindNextFile(hFile, finddata));
FindClose(hFile);
LockWindowUpdate(0);
end;
end;
Das war mein Versuch eine ListView ähnlich dem Explorer nachzubasteln, primitiv ich weiss.
|