PDA

View Full Version : تغییر آیکون فایل از درون دلفی



pm_hamze
چهارشنبه 15 خرداد 1387, 19:28 عصر
با سلام و خسته نباشید خدمت شما دوستان گرام
می خواستم از درون دلفی آیکون یک فایل رو تغییر بدم و آیکون مورد نظر از فایل Shell32.dll لود کنه.
و همچنین کد درآوردن آیکون از فایل Shell32.dll اینه که خدمت شما می دم


var
hMod: HMODULE;
hIco: HICON;
begin
hMod := LoadLibrary('shell32.dll');
if hMod <> 0 then
begin
hIco := LoadIcon(hMod, PChar(3));
if hIco <> 0 then
Form1.Icon.Handle := hIco;
end;
end;


اگه می شه کمکم کنید

pm_hamze
پنج شنبه 16 خرداد 1387, 00:38 صبح
کسی جواب نمیده

مهران موسوی
پنج شنبه 16 خرداد 1387, 02:19 صبح
با اين نمونه مشكلت حل ميشه ...

pm_hamze
پنج شنبه 16 خرداد 1387, 08:45 صبح
از نمونه برنامتون ممنون اما آیکون فایل رو عوض نمی کنه و از توی Shell32.dll هم نمی تونه لود کنه

مهران موسوی
پنج شنبه 16 خرداد 1387, 16:19 عصر
عوض ميكنه ولي فكر كنم فقط براي Exe هاي دلفي باشه ... قسمت لود كردن از Shell32.dll هم خودتون بنويسيد بهترهستش ...

كد زير كمكت ميكنه تا ايكونها رو از فايلهاي exe يا dll استخراج كني .... اتفاقا اونم توسط API هاي موجود در Shell32 اين كار رو انجام ميده ...


type ThIconArray = array[0..0] of hIcon;
type PhIconArray = ^ThIconArray;

function ExtractIconExA(lpszFile: PAnsiChar;
nIconIndex: Integer;
phiconLarge : PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external 'shell32.dll' name 'ExtractIconExA';


function ExtractIconExW(lpszFile: PWideChar;
nIconIndex: Integer;
phiconLarge: PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external 'shell32.dll' name 'ExtractIconExW';

function ExtractIconEx(lpszFile: PAnsiChar;
nIconIndex: Integer;
phiconLarge : PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external 'shell32.dll' name 'ExtractIconExA';


procedure TForm1.Button1Click(Sender: TObject);
var
NumIcons : integer;
pTheLargeIcons : phIconArray;
pTheSmallIcons : phIconArray;
LargeIconWidth : integer;
SmallIconWidth : integer;
SmallIconHeight : integer;
i : integer;
TheIcon : TIcon;
TheBitmap : TBitmap;
begin
NumIcons :=
ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe',
-1,
nil,
nil,
0);
if NumIcons > 0 then begin
LargeIconWidth := GetSystemMetrics(SM_CXICON);
SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
GetMem(pTheLargeIcons, NumIcons * sizeof(hIcon));
GetMem(pTheSmallIcons, NumIcons * sizeof(hIcon));
FillChar(pTheLargeIcons^, NumIcons * sizeof(hIcon), #0);
FillChar(pTheSmallIcons^, NumIcons * sizeof(hIcon), #0);
ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe',
0,
pTheLargeIcons,
pTheSmallIcons,
numIcons);
{$IFOPT R+}
{$DEFINE CKRANGE}
{$R-}
{$ENDIF}
for i := 0 to (NumIcons - 1) do begin
DrawIcon(Form1.Canvas.Handle,
i * LargeIconWidth,
0,
pTheLargeIcons^[i]);
TheIcon := TIcon. Create;
TheBitmap := TBitmap.Create;
TheIcon.Handle := pTheSmallIcons^[i];
TheBitmap.Width := TheIcon.Width;
TheBitmap.Height := TheIcon.Height;
TheBitmap.Canvas.Draw(0, 0, TheIcon);
TheIcon.Free;
Form1.Canvas.StretchDraw(Rect(i * SmallIconWidth,
100,
(i + 1) * SmallIconWidth,
100 + SmallIconHeight),
TheBitmap);
TheBitmap.Free;
end;
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+}
{$ENDIF}
FreeMem(pTheLargeIcons, NumIcons * sizeof(hIcon));
FreeMem(pTheSmallIcons, NumIcons * sizeof(hIcon));
end;
end;

pm_hamze
شنبه 18 خرداد 1387, 06:08 صبح
دستتون درد نکنه اما ظاهر آیکن رو میریزه بهم
نمی دونم چرا.
یه غلطی کردیم یه پروژه بزرگ برا پایان نامه برداشتیم حالا100 تا مشکل داریم که تا حالا هیچکدوم کامل حل نشده و هرچقدر کتاب یا سی دی که یعنی کامل بوده گرفتم ولی جواب نداده تا امید آخرم این سایته که هنوز به جواب کاملی هم نرسیدم
با تشکر و شرمندگی از پر حرفی