![]() |
|
|
|
|
#1
|
|||
|
|||
|
проблема встала не с самим вытаскиванием иконки из файла,
а с определением количества иконок в данном файле var Icon : TIcon; begin Icon := TIcon.Create; Icon.Handle := ExtractIcon(0, 'имя файла', IconIndex); ..... в help-e написано, что если IconIndex сделать равным -1, то вернется количество иконок однако отрицательные значения вообще не воспринимаются как поступить? может есть другой способ? посоветуйте |
|
#2
|
|||
|
|||
|
а в ответ тишина
не может быть, чтобы наши уважаемые модераторы не знали ответа на этот вопрос |
|
#3
|
||||
|
||||
|
ээ... ну попобуй так:
var Icon : TIcon; ic:byte; begin repeat Icon := TIcon.Create; ic:=ic+1; Icon.Handle := ExtractIcon(0, 'icon'+IntToStr(ic)+'.ico', ic); until FileExists('icon'+IntToStr(ic+1)+'.ico'); Ну ясный пень что какую то фигню написал. Ну если чё додумать можно =DD |
|
#4
|
||||
|
||||
|
IconIndex не может быть равным -1, т.к. его значение лежит в пределах 0..4294967295.
Делай так Код:
procedure TForm1.FormCreate(Sender: TObject);
const
//path = 'calc.exe';
//path = 'notepad.exe';
//path = 'mspaint.exe';
path = 'shell32.dll';
var
hi: HICON;
i: integer;
begin
i := 0;
hi := ExtractIcon( HInstance, path, 0 );
while ( hi > 0 ) do
begin
Inc( i );
hi := ExtractIcon( HInstance, path, i );
end;
Caption := IntToStr( i );
end; |
|
#5
|
|||
|
|||
|
Ок попробую
|
|
#6
|
|||
|
|||
|
ответили на форуме delphimaster.ru
написали довольно громоздко но главное Код:
...
NumIcons :=ExtractIconEx('IcoFile',-1, nil, nil, 0);
...
Сначала в разделе interface пишем такой код:
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;всех благодарю за советы особая благодарность X-rem ![]() Последний раз редактировалось DeSwan, 16.04.2007 в 13:20. |