Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизИконки в ListView Найти похожие ветки
← →
Ученик (2005-01-11 13:10) [0]Почему не работает следующий код?
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";
end;
UpdateFiles;
end;
Иконки не рисуются :( PLZ help
← →
Ученик (2005-01-11 14:40) [1]Я не понимаю, что очень сложный код???
Неужели никто не работал с ShGetFileInfo?
← →
Ученик (2005-01-11 14:47) [2]Да, и вопрос вдогонку: как реализовано MainMenu такого типа, как в Office? Похоже, что оно лежит в кулбанде CoolBar"а...
Никто не пытался такое сделать?
← →
Игорь Шевченко © (2005-01-11 14:47) [3]А проверить результат функции ? :)
Убери "*.*" и поставь пустую строку.
SHGetFileInfo("", 0, Info, SizeOf(TShFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
← →
Игорь Шевченко © (2005-01-11 14:48) [4]
> как реализовано MainMenu такого типа, как в Office?
Свой оконный класс.
С уважением,
← →
Игорь Шевченко © (2005-01-11 14:57) [5]Извиняюсь, в [3] маху дал.
Полный код такой:var
DriveCount, I : Integer;
{ Из JVCL JvDriveCtrls.pas }
tmp : array[0..104] of char; // 4 chars ("C:\#0") * 26 possible drives +
// 1 terminating #0 = 105 chars
P : PChar;
S : String;
Info: TSHFileInfo;
begin
FLogicalDrives := TStringList.Create;
LogicalImageList.Handle := SHGetFileInfo("", 0, Info, SizeOf(TShFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
FillChar(tmp[0], sizeof(tmp), #0);
GetLogicalDriveStrings(sizeof(tmp), tmp);
P := tmp;
while P^ <> #0 do begin
S := string(P);
Inc(P, 4);
SHGetFileInfo(PChar(S), 0, Info, SizeOf(TShFileInfo),
SHGFI_DISPLAYNAME or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
LogicalDriveComboBox.Items.AddObject(Trim(Info.szDisplayName),
TObject(Info.iIcon));
FLogicalDrives.Add(S);
end;
← →
BiN © (2005-01-11 15:04) [6]Может, я чего-то недопонимаю, но разве хэндл ImageList-а и хэндл иконки - это одно и тоже?
С уважением.
← →
Игорь Шевченко © (2005-01-11 15:07) [7]BiN © (11.01.05 15:04) [6]
Насколько я понимаю, Handle ImageList получается в первом вызове ShGetFileInfo, потому как в нем (в системном ImageList) содержатся иконки всех дисков.
У меня используется собственная прорисовка иконок, поэтому иконки извлекаются для каждого устройства отдельно.
С уважением,
← →
d3coder © (2005-01-11 15:09) [8]Такой код пополнее будет :)
var
DriveCount, I : Integer;
{ Èç JVCL JvDriveCtrls.pas }
tmp : array[0..104] of char; // 4 chars ("C:\#0") * 26 possible drives +
// 1 terminating #0 = 105 chars
P : PChar;
S : String;
Info: TSHFileInfo;
FLogicalDrives: TStringList;
LogicalImageList: TImageList;
begin
FLogicalDrives := TStringList.Create;
LogicalImageList:= TImageList.CreateSize(16,16);
with ListView1 do
begin
LogicalImageList.Handle := SHGetFileInfo("", 0, Info, SizeOf(TShFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
FillChar(tmp[0], sizeof(tmp), #0);
GetLogicalDriveStrings(sizeof(tmp), tmp);
P := tmp;
while P^ <> #0 do begin
S := string(P);
Inc(P, 4);
SHGetFileInfo(PChar(S), 0, Info, SizeOf(TShFileInfo),
SHGFI_DISPLAYNAME or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
DriveComboBox1.Items.AddObject(Trim(Info.szDisplayName),
TObject(Info.iIcon));
FLogicalDrives.Add(S);
end;
end;
end;
но все равно не работает :((((
← →
BiN © (2005-01-11 15:15) [9]Игорь Шевченко © (11.01.05 15:07) [7]
Мда, опять я невнимательно прочел описание флага SHGFI_SYSICONINDEX. Я подумал, что в коде происходит попытка присвоения описателя одной иконки описателю системного ImageList-a. Спасибо за разъяснения.
С уважением.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c