Форум: "Потрепаться";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизКак можно улучшить этот код Найти похожие ветки
← →
Voland (2004-09-05 15:24) [0]
Procedure GetBitmapFromFile(FileName:String;Bitmap:TBitmap);
var
I:TIcon;
F:PChar;
begin
I:=TIcon.Create;
If AnsiUpperCase(ExtractFileExt(FileName))<>".EXE" then
begin
GetMem(F,Max_Path);
FindExecutable(PChar(FileName),
PChar(ExtractFileDir(FileName)),F);
FileName:=StrPas(F);
FreeMem(f);
end;
I.Handle:= ExractIcon(Application.Handle,PChar(FileName),0);
Bitmap.Width:=I.Width;
Bitmap.Height:=I.Height;
Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,I);
I.Free;
end;
← →
jack128 © (2004-09-05 15:27) [1]Voland (05.09.04 15:24)
используй ExtractAssociatedIcon - код короче будет..
← →
Voland (2004-09-05 15:29) [2]дело в том что наример для текстовых документов иконка не такая как у нотепада
← →
Gero © (2004-09-05 15:30) [3]try..finally не забывай.
← →
pasha_golub (temp) (2004-09-05 15:36) [4]Отступы не мешало бы для начала
← →
GuAV © (2004-09-05 15:38) [5]
Procedure GetBitmapFromFile(const FileName: String; Bitmap: TBitmap);
← →
jack128 © (2004-09-05 15:45) [6]Voland (05.09.04 15:29) [2]
дело в том что наример для текстовых документов иконка не такая как у нотепада
Мдя?? у мя все нормально..procedure TForm1.Button1Click(Sender: TObject);
var
w: word;
i: THandle;
s: string;
begin
w:= 0;
SetLength(s, 255);
Move(PChar("F:\test.txt")^, s[1], Length("F:\test.txt") + 1);
SetLastError(0);
i := ExtractAssociatedIcon(hInstance, PChar(s), w);
if i = 0 then
RaiseLastWin32Error
else
Icon.Handle := i;
end;
GuAV © (05.09.04 15:38) [5]
GuAV © (05.09.04 15:38)
а со строками без разницы. Там все равно счетчик ссылок используется..
← →
jack128 © (2004-09-05 15:47) [7]к тому же код вообще не правильный ;-) С чего ты взял, что в файлом будет ассоциирована именно нулевая иконка??
← →
Гаврила © (2004-09-05 16:02) [8]выкинуть этот код нафиг!
переписать полностью
← →
Voland (2004-09-05 16:02) [9]
procedure GetBitmapFromFile(FileName:String;Bitmap:TBitmap);
var
W:Word;
I:TIcon;
S:String;
begin
Try
I:=TIcon.Create;
W:= 0;
SetLength(S, 255);
Move(PChar(FileName)^, s[1], Length(FileName) + 1);
SetLastError(0);
I.Handle:= ExtractAssociatedIcon(hInstance, PChar(S), W);
if I.Handle = 0 then
RaiseLastWin32Error
else
Begin
Bitmap.Height:=I.Height;
Bitmap.Width:=I.Width;
Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,I);
end;
finally
I.Free;
end;
end;
Усе Всем Спасибо придратся вроде больше не к чему
← →
Гаврила © (2004-09-05 16:10) [10]
> [9] Voland (05.09.04 16:02)
во первых, конструктор иконки перед оператором try
во вторых, не работать с LastError
в третьих, локальная переменная S лишняя
и передавать имя файла как const
зачем засорять стек ?
← →
GuAV © (2004-09-05 22:47) [11]
>и передавать имя файла как const
> зачем засорять стек ?
Стек не засоряется - см. jack128 © (05.09.04 15:47) [7].
Но писать всё равно const. const позволит оптимизировать код внутри процедуры, т.к. позволит предположить, что строка не изменяется.
← →
jack128 © (2004-09-06 00:39) [12]Гаврила © (05.09.04 16:10) [10]
во вторых, не работать с LastError
это в смысле "SetLastError(0);" ?? И чем это так плохо??
> в третьих, локальная переменная S лишняя
это in/out параметр. В него записывается имя асоциированного exe файла, так что константу передовать нельзя..
← →
GuAV © (2004-09-06 00:54) [13]
> else
нафиг. ни на что не влияет только путает.
> SetLastError(0);
не вредит но и незачем.
> SetLength(S, 255);
> Move(PChar(FileName)^, s[1], Length(FileName) +
А оператор := уже не в моде?
> это in/out параметр.
Шо, правда ?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons/iconre ference/iconfunctions/extractassociatedicon.asp
lpIconPath
[in] Pointer to a string that specifies the full path and file name of the file that contains the icon. The function extracts the icon handle from that file, or from an executable file associated with that file. If the icon handle is obtained from an executable file, the function stores the full path and file name of that executable in the string pointed to by lpIconPath.
> I:=TIcon.Create;
Тут уж правда надо до try
← →
jack128 © (2004-09-06 01:07) [14]GuAV © (06.09.04 0:54) [13]
> else
нафиг. ни на что не влияет только путает.
это какой else? и из какого поста??
>> SetLength(S, 255);
>> Move(PChar(FileName)^, s[1], Length(FileName) +
> А оператор := уже не в моде?
нужно, что бы строка была длиной max_path (так это in/out параметр (о этом ниже..))
> If the icon handle is obtained from an executable
> file, the function stores the full path and file name
> of that executable in the string pointed to by
> lpIconPath.
это я перевел как "Если хендл иконки получен из исполняемого файла, то функция сохраняет полный путь файл, который выполняется в строку, на которую указывает lpIconPath"
И вообще, опыт - лудший судья
код [6] работает, а вот этот нет
var
w: word;
i: THandle;
begin
w:= 0;
SetLastError(0);
i := ExtractAssociatedIcon(hInstance, "F:\test.txt", w);
if i = 0 then
RaiseLastWin32Error
else
Icon.Handle := i;
end;
>> I:=TIcon.Create;
>
> Тут уж правда надо до try
no comments ;-)
← →
jack128 © (2004-09-06 01:11) [15]GuAV © (06.09.04 0:54) [13]
> SetLastError(0);
не вредит но и незачем.
судя по нечего не объясняющему коду ошибки из моего примера [14] GetLastError не пременим для этой функции. Да и WinSDK явного указания а-ля "To get extended error information, call GetLastError." для других функций нету..
Так, что SetLastError излишен - согласен..
← →
jack128 © (2004-09-06 01:19) [16]jack128 © (06.09.04 1:11) [15]
полный путь файлА, который
← →
GuAV © (2004-09-06 01:26) [17]
> это какой else? и из какого поста??
> if I.Handle = 0 then
> RaiseLastWin32Error
> else
> Begin
> Bitmap.Height:=I.Height;
> Bitmap.Width:=I.Width;
>
>Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,I);
> end;
> нужно, что бы строка была длиной max_path (так это
> in/out параметр (о этом ниже..))
MAX_PATH AFAIR больше 255. Сколько не помню. Надо так и писать MAX_PATH.
я бы сначала присвоил с пом. :=, а потом SetLength( , MAX_PATH);
или скажешь
> Move(PChar(FileName)^, s[1], Length(FileName) + 1);
> SetLastError(0);
правильно работает, если FileName более 255.
> это я перевел как
правильно перевел. это ошибка, про [in]
← →
GuAV © (2004-09-06 01:38) [18]
> "To get extended error information, call
> GetLastError." для других функций нету..
Так какой тогда RaiseLastWin32Error> if I.Handle = 0 then
> RaiseLastWin32Error
> else
> Begin
> Bitmap.Height:=I.Height;
> Bitmap.Width:=I.Width;
>
>Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,I);
> end;
> finally
надоVoland (05.09.04 16:02) [9]
if I.Handle <> 0 then
Begin
Bitmap.Height:=I.Height;
Bitmap.Width:=I.Width;
Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,I);
end;
finally
← →
icWasya © (2004-09-06 12:46) [19]>jack128 © (06.09.04 00:39) [12]
>это in/out параметр. В него записывается имя асоциированного exe файла, так что константу передовать нельзя..
ну так надо тогда писатьvarFileName:String
← →
Ega23 © (2004-09-06 12:53) [20]И, кстати, нафига Bitmap.StretchDraw? Размеры же совпадают. CopyRect, ИМХОБ достаточно будет...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c