Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Иконки в ListView [D7, WinXP]


Ученик ©   (2005-01-11 13:10:00) 

Почему не работает следующий код?

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


BiN   (2005-01-11 15:15:00) [1]

Игорь Шевченко ©   (11.01.05 15:07) [7]

Мда, опять я невнимательно прочел описание флага SHGFI_SYSICONINDEX. Я подумал, что в коде происходит попытка присвоения описателя одной иконки описателю системного ImageList-a. Спасибо за разъяснения.

С уважением.


d3coder   (2005-01-11 15:09:00) [2]

Такой код пополнее будет :)

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;

но все равно не работает :((((


Игорь Шевченко   (2005-01-11 15:07:00) [3]

BiN ©   (11.01.05 15:04) [6]

Насколько я понимаю, Handle ImageList получается в первом вызове ShGetFileInfo, потому как в нем (в системном ImageList) содержатся иконки всех дисков.
У меня используется собственная прорисовка иконок, поэтому иконки извлекаются для каждого устройства отдельно.

С уважением,


BiN   (2005-01-11 15:04:00) [4]

Может, я чего-то недопонимаю, но разве хэндл ImageList-а и хэндл иконки - это одно и тоже?

С уважением.


Игорь Шевченко   (2005-01-11 14:57:00) [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;


Игорь Шевченко   (2005-01-11 14:48:00) [6]


> как реализовано MainMenu такого типа, как в Office?


Свой оконный класс.

С уважением,


Ученик   (2005-01-11 14:47:00) [7]

Да, и вопрос вдогонку: как реализовано MainMenu такого типа, как в Office? Похоже, что оно лежит в кулбанде CoolBar'а...
Никто не пытался такое сделать?


Игорь Шевченко   (2005-01-11 14:47:00) [8]

А проверить результат функции ? :)

Убери '*.*' и поставь пустую строку.

SHGetFileInfo('', 0, Info, SizeOf(TShFileInfo),
   SHGFI_SYSICONINDEX or SHGFI_SMALLICON);


Ученик   (2005-01-11 14:40:00) [9]

Я не понимаю, что очень сложный код???
Неужели никто не работал с ShGetFileInfo?


Наверх

Титульная страница Поиск, карта сайта Написать письмо