Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование иконки в cxGrid, отображение графики 
V
    Опции темы
Akella
  Дата 21.9.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Первоначальная задача: показать иконки в cxGrid, которые ассоциированы с файлами. В базе есть колонка с именем файла, которая выводится в грид. В гриде создал  ещё одно поле и рисую там иконку в событии OnCustomDrawCell. Выводится без ошибок, можно сказать, за тем исключением, что
1. Размер иконки слишком велик, хочется 16х16.
2. В ячейке, где рисуется изображение, появляется всякий мусор.
user posted image

Я решил поступить иначе. Создал вычисляемое поле типа ftGrafic. Захотел этому полю присвоить иконки, но вычисляемые поля такого типа создавать нельзя.


Вот код рисования иконки:
Код

//http://forum.sources.ru/index.php?showtopic=126092&view=findpost&p=981950
function TfmEmailEdit.GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдвним для расширения в реестре
  IconPath,Ext: string; //путь для файла с иконкой
  IconNum, //номер иконки в файле
  QPos: Integer; //позиция запятой в записи реестра
begin
  IconNum := 0;
  Ext:=ExtractFileExt(FileName);
  if (Ext='.exe') or (ext='.EXE') then ext:='.com';

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  //передача хендлера иконки как результат выполнения
  Result := ExtractIcon(hInstance, PChar(IconPath), IconNum);
  if result=0 then
    Result:=LoadIcon(Hinstance,'NO_FILE');
end;

procedure TfmEmailEdit.dbgMailAttachmentsCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
Var
 val: boolean;
 vIconHandle: HIcon;
begin
  try
    if AViewInfo.GridView.DataController.RecordCount <= 0 then exit;
    val := AViewInfo.GridRecord.Values[dbgMailAttachmentsIsFileExists.Index];
    if not val then
      ACanvas.Font.Color := clRed;


    if (AViewInfo.Item = dbgMailAttachmentsIcon) then
        begin
          vIconHandle := GetRegistryIconHandle(AViewInfo.GridRecord.Values[dbgMailAttachmentsNAME.Index]);
          DrawIcon(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle);
          ADone := True;
        end;



Как без артефактов нарисовать иконоку в ячейке грида размером 16х16?

Это сообщение отредактировал(а) Akella - 22.9.2009, 08:40
PM MAIL   Вверх
Akella
Дата 22.9.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Ура. Ай да я, ай да молодец  smile 
Заменил на ExtractIconEx()  smile 
Код

function TfmEmailEdit.GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдвним для расширения в реестре
  IconPath,Ext: string; //путь для файла с иконкой
  IconNum, //номер иконки в файле
  QPos: Integer; //позиция запятой в записи реестра
  LI, SI : HICON;
begin
  IconNum := 1;
  Ext:=ExtractFileExt(FileName);
  if (Ext='.exe') or (ext='.EXE') then ext:='.com';

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  ExtractIconEx(PChar(IconPath), IconNum, LI, SI, 1);
  Result := SI;

  if result = 0 then
    Result := LoadIcon(Hinstance,'NO_FILE');
end;


Это сообщение отредактировал(а) Akella - 22.9.2009, 10:17
PM MAIL   Вверх
Akella
Дата 30.7.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



К сожалению из-за этого
Код

  R.RootKey := HKEY_CLASSES_ROOT;
    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then

Без прав админа приложение не показывает значки.
Что можно придумать?
PM MAIL   Вверх
~FoX~
Дата 30.7.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



Цитата(Akella @  30.7.2010,  12:54 Найти цитируемый пост)
Что можно придумать? 
 Использовать шел объекты... SHGetFileInfo с флагами SHGFI_SYSICONINDEX or SHGFI_LARGEICON or SHGFI_PIDL, вернет тебе хендл иконки не только ассоциированного файла  но и PIDL-ов 


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 30.7.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



А если файла не существует? Мне нужно получить значок в любом случае: хоть файл, хоть нету. У нас на форуме видел пример с использование какой-то функции из WinAPI, но не могу найти :(

Добавлено через 12 минут и 46 секунд
Цитата(~FoX~ @  30.7.2010,  12:17 Найти цитируемый пост)
SHGetFileInfo

Пример нашёл
http://forum.vingrad.ru/index.php?showtopi...t&p=2020313

Но всё равно, нужно рисовать иконки даже несуществующих файлов.
PM MAIL   Вверх
~FoX~
Дата 30.7.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



Akella, 
Цитата(Akella @  30.7.2010,  13:32 Найти цитируемый пост)
А если файла не существует?
 Ну не существует, расширение есть, получишь значек.....)))



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 30.7.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



нет, там, помнится, была функция, в которой явно было написано,что она возвращает иконку файла,а если файла нет, то берёт значение из реестра

Это сообщение отредактировал(а) Akella - 30.7.2010, 17:58
PM MAIL   Вверх
~FoX~
Дата 30.7.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



Цитата(Akella @  30.7.2010,  18:58 Найти цитируемый пост)
нет, там, помнится, была функция, в которой явно было написано,что она возвращает иконку файла,а если файла нет, то берёт значение из реестра

Да блин... Шел тебе вернет хендл на иконку фала, существует он или нет, не важно.... Если есть ext файла, есть ассоциация с этим екстом, вернется хендл ассоциированной иконы, в противном случе вернеться стандартный икон...


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 3.8.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Да, этот возвращает значок, даже если файл не существует.
Код

function GetRegistryIconHandle2(FileName: string): HICON;
Var
 ic: TIcon;
 fi: TSHFileInfo;
 ext: string;
begin
  ic := TIcon.Create;
  try
    ext := LowerCase(ExtractFileExt(FileName));
    SHGetFileInfo(PChar('*' + ext),
                  FILE_ATTRIBUTE_NORMAL,
                  fi,
                  SizeOf(fi),
                  SHGFI_ICON or SHGFI_SMALLICON or
                  SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES
                  );
    result := fi.hIcon;
  finally
    ic.Free;
  end;
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.