Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 063

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Скажите, пожалуйста, почему у меня некоторые иконки сохраняются, но при этом теряют свой цвет и не совпадают с оригиналами?
И как можно это исправить?
Заранее благодарен !

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ShellAPI, StdCtrls, ExtCtrls, ExtDlgs;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. Button2: TButton;
  13. Image1: TImage;
  14. SavePictureDialog1: TSavePictureDialog;
  15. Edit1: TEdit;
  16. procedure Button1Click(Sender: TObject);
  17. procedure Button2Click(Sender: TObject);
  18. private
  19. { Private declarations }
  20. public
  21. { Public declarations }
  22. end;
  23.  
  24. var
  25. Form1: TForm1;
  26.  
  27. implementation
  28. function GetLongPathName(lpszLongPath: PChar; lpszShortPath: PChar;
  29. cchBuffer: DWORD): DWORD; stdcall; external kernel32 name 'GetLongPathNameA';
  30. {$R *.dfm}
  31. function GetFileIcon(filename: String; small: Boolean = False ): HICON;
  32. var
  33. info: SHFILEINFO;
  34. flags: Cardinal;
  35. begin
  36. flags := SHGFI_ICON;
  37. ZeroMemory(Addr(info), SizeOf(info));
  38.  
  39. SHGetFileInfo(PAnsiChar(filename), 0, info, SizeOf(info), flags);
  40. GetFileIcon := info.hIcon;
  41. end;
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. begin
  44. Edit1.SetFocus ;
  45. image1.Picture.Icon.Handle := GetFileIcon(PChar(Edit1.Text));
  46. if Edit1.GetTextLen = 0
  47. then
  48. begin
  49. MessageBeep(40000);
  50.  
  51. exit ;
  52. end;
  53. image1.Picture.Icon.Handle := GetFileIcon(PChar(Edit1.Text));
  54. end;
  55.  
  56. procedure TForm1.Button2Click(Sender: TObject);
  57. var
  58. FileName: String;
  59. begin
  60. if SavePictureDialog1.Execute = True then
  61. begin
  62. try
  63. FileName := SavePictureDialog1.FileName;
  64. Form1.Image1.Picture.SaveToFile(FileName);
  65. finally
  66. end;
  67. end;
  68. end;
  69. end.
  70.  


Kyran29 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Kyran29 (статус: Посетитель)
Вопрос отправлен: 3 августа 2009, 23:00
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Kyran29!
ico формат очень интересный. грубо говоря, это массив иконок разных размеров.
Указанный выше код сохраняет только одну иконку с всей пачки и преобразовывает его формат, совместимый с "диспееем".
Во вторых, нужно помнить, что тот же проводник, при отображении иконки выбирает удну с доступных, иногда по ведомымим ему одному алгоритмам.
Поэтому, лучше использовать класс TIcon напрямую. что то в виде

var ico:TICon;
 
ico := TIcon.Create(nil);
Ico.Handle := GetFileIcon(PChar(Edit1.Text));
ico.SaveToFile('имя');
ico.free;
и во вторых, лучше поискать хороший редактор иконок.

Если иконку хочеться отображать на форме, то лучше загрузить её туда паралельно.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 3 августа 2009, 23:10
Оценка за ответ: 1


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.