Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2014, 17:08   #11
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

код:

Код:
Application.Icon.LoadFromFile('D:\icos.ico');
beegl вне форума Ответить с цитированием
Старый 19.02.2014, 17:15   #12
[XyZ]
Пользователь
 
Регистрация: 19.02.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
код:

Код:
Application.Icon.LoadFromFile('D:\icos.ico');
Значит та иконка, которая слева это в запущеном EXE, а которая справа,
в записанном на диск файле.

Левая меняется программно, а правая утилитой.
[XyZ] вне форума Ответить с цитированием
Старый 19.02.2014, 17:26   #13
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Иконка в исполняемом файле, меняется с помощью замены ресурсов
STRELOK-2007 вне форума Ответить с цитированием
Старый 19.02.2014, 17:37   #14
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

нашел модуль, загружает временный *exe файл (темпфайлом, его надо переименовать, запустить), а потом меняет у этого (нужного) *exe файла основную иконку

Код:
unit ReplaseICO;   
{$WARNINGS OFF}
{$HINTS OFF}  
 interface   
  
 uses   
   Windows, Classes, SysUtils, Graphics;   
  
 procedure ChangeIcon(FileName, IconFile, ResName:string);   
  
 implementation   
  
 resourcestring   
   SInvalidFileName = 'Invalide filename %s';   
  
 type   
   TNewHeader = record   
     idReserved:WORD;   
     idType:WORD;   
     idCount:WORD;   
   end;   
  
   TResDirHeader = packed record   
     bWidth:Byte;   
     bHeight:Byte;   
     bColorCount:Byte;   
     bReserved:Byte;   
     wPlanes:WORD;   
     wBitCount:WORD;   
     lBytesInRes:Longint;   
   end;   
  
   TIconFileResDirEntry = packed record   
     DirHeader:TResDirHeader;   
     lImageOffset:Longint;   
   end;   
  
   TIconResDirEntry = packed record   
     DirHeader:TResDirHeader;   
     wNameOrdinal:WORD;   
   end;   
  
   PIconResDirGrp = ^TIconResDirGrp;   
   TIconResDirGrp = packed record   
     idHeader:TNewHeader;   
     idEntries:array[0..0] of TIconResDirEntry;   
   end;   
  
   PIconFileResGrp = ^TIconFileResDirGrp;   
   TIconFileResDirGrp = packed record   
     idHeader:TNewHeader;   
     idEntries:array[0..0] of TIconFileResDirEntry;   
   end;   
  
   TBeginUpdateRes=function(pFileName: PChar; bDeleteExistingResources: BOOL): THandle; stdcall;   
  
   TUpdateRes=function(hUpdate: THandle; lpType, lpName: PChar;   
                wLanguage: Word; lpData: Pointer; cbData: DWORD): BOOL; stdcall;   
  
   TEndUpdateRes=function(hUpdate: THandle; fDiscard: BOOL): BOOL; stdcall;   
  
 function MakeLangID:WORD;   
 begin   
   Result:=(SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;   
 end;   
  
 procedure CheckFileName(Value:string);   
 begin   
   if (Trim(Value) = EmptyStr) or (not FileExists(Value)) then   
     raise Exception.Create(Format(SInvalidFileName, [Value]));   
 end;   
  
 procedure ChangeIcon(FileName, IconFile, ResName:string);   
 var   
   I:Integer;   
   Group:Pointer;   
  
   Header:TNewHeader;   
   FileGrp:PIconFileResGrp;   
   IconGrp:PIconResDirGrp;   
   IconGrpSize,   
   FileGrpSize:Integer;   
  
   Icon:TIcon;   
   Stream:TMemoryStream;   
   hUpdateRes:THandle;   
 begin   
   CheckFileName(FileName);   
   hUpdateRes:=BeginUpdateResource(PChar(FileName), False);   
   Win32Check(hUpdateRes <> 0);   
   CheckFileName(IconFile);   
   Icon:=TIcon.Create;   
   Icon.LoadFromFile(IconFile);   
   Stream:=TMemoryStream.Create;   
   try   
     Icon.SaveToStream(Stream);   
   finally   
     Icon.Free;   
   end;   
   Stream.Position:=0;   
   Stream.Read(Header, SizeOf(Header));   
   FileGrpSize := SizeOf(TIconFileResDirGrp) + (Header.idCount - 1) * SizeOf(TIconFileResDirEntry);   
   IconGrpSize := SizeOf(TIconResDirGrp) + (Header.idCount - 1) * SizeOf(TIconResDirEntry);   
   GetMem(FileGrp, FileGrpSize);GetMem(IconGrp, IconGrpSize);   
   Stream.Position:=0;   
   Stream.Read(FileGrp^, FileGrpSize);//loading icongroup   
   Group:=nil;   
   try   
     for I:=0 to FileGrp^.idHeader.idCount - 1 do //building icongroup from loaded entries   
     begin   
       with IconGrp^ do   
       begin   
         idHeader:=FileGrp^.idHeader;   
         idEntries[I].DirHeader:=FileGrp^.idEntries[I].DirHeader;   
         idEntries[I].wNameOrdinal:=I;//fixing Ordinals   
       end;   
       with FileGrp^.idEntries[I] do   
       begin   
         Stream.Seek(lImageOffset, soFromBeginning);   
         ReallocMem(Group, DirHeader.lBytesInRes);   
         Stream.Read(Group^, DirHeader.lBytesInRes);   
         Win32Check(UpdateResource(hUpdateRes,RT_ICON,PChar(MakeIntResource(I)),   
                             MakeLangID, Group, DirHeader.lBytesInRes));   
       end;   
     end;//for   
     Win32Check(UpdateResource(hUpdateRes,RT_GROUP_ICON, PChar(ResName),   
                    MakeLangID, IconGrp, IconGrpSize));//adding the icongroup   
     Win32Check(EndUpdateResource(hUpdateRes, False));   
     finally   
       Stream.Free;   
       FreeMem(FileGrp);   
       FreeMem(IconGrp);   
       FreeMem(Group);   
     end;   
 end;   
  
 var   
   BeginUpdateRes:TBeginUpdateRes;   
   UpdateRes:TUpdateRes;   
   EndUpdateRes:TEndUpdateRes;   
  
 procedure GetFunctions(hLib:HMODULE);   
 begin   
   @BeginUpdateRes:=GetProcAddress(hLib,'BeginUpdateResourceA');   
   @UpdateRes:=GetProcAddress(hLib,'UpdateResourceA');   
   @EndUpdateRes:=GetProcAddress(hLib,'EndUpdateResourceA');   
 end;   
 end.

Последний раз редактировалось beegl; 19.02.2014 в 17:40.
beegl вне форума Ответить с цитированием
Старый 19.02.2014, 22:25   #15
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Теоретически, если все иконки одинакового размера в байтах и известно смещение, по которому расположена исходная иконка в файле (а точнее - ее графические данные: рисунок и альфа-маска, т.к. кроме них там еще и заголовок по любому есть в каком-то виде, чтоб винда могла знать размер и цветность иконки), то все решается загрузкой нужного ico-файла в буфер и последующей записью этого буфера в конечный exe-шник по известному смещению.

Другое дело, возможно, экзешник сам в себя записать ничего не может пока он работает. Тогда экзешник должен запустить вспомогательную прогу с номером требуемого значка в командной строке и завершиться, а вспомогательная прога должна дождаться пока файл экзешника будет свободен для записи и записать требуемую иконку в нужное смещение, а затем снова запустить этот экзешник и завершиться сама.
blackstrip вне форума Ответить с цитированием
Старый 20.02.2014, 12:27   #16
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

напишите пожалуйста пример, как программно заменить иконку приложения, мне надо в зависимости от состояния программы, что-то не получается совсем

beegl вне форума Ответить с цитированием
Старый 20.02.2014, 12:31   #17
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Сам себе иконку exe не изменит, пока работает. Иконку Windows берет из ресурсов exe.
Человек_Борща вне форума Ответить с цитированием
Старый 20.02.2014, 12:55   #18
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Человек_Борща, может как-то отредактировать юнит, что нашел я, иконку меняет, только получается, что другой программой хакает, надо как-то из моей программы также заменило, не получится?
beegl вне форума Ответить с цитированием
Старый 20.02.2014, 13:01   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
не получится?
Не получится. Не могу придумать адекватного смысла сего действа. Зачем?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.02.2014, 14:05   #20
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Аватар, для красоты)
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импортировать данные из файла .xls Alekc87 Microsoft Office Excel 18 28.10.2012 20:32
Как импортировать дамп ? sectorX БД в Delphi 0 08.05.2011 23:36
перенос exe-шника скомпилированный delphi 2009, на комп где delphi7 Berta Помощь студентам 4 10.05.2010 11:26
Не работает скомпилированный экзешник Laxis Общие вопросы C/C++ 0 01.04.2010 05:14
Как импортировать dll? wegS Общие вопросы Delphi 1 05.03.2008 09:35