Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.5 MB
Время: 0.039 c
4-1092476916
Nomolos
2004-08-14 13:48
2004.09.26
Добавить свой пункт в меню "Найти"


1-1095072110
limon_
2004-09-13 14:41
2004.09.26
поиск в combobox


1-1094628758
HotDog
2004-09-08 11:32
2004.09.26
сохранение


4-1092402037
Shuma
2004-08-13 17:00
2004.09.26
Проблемы с DLL


14-1094242665
Ломброзо
2004-09-04 00:17
2004.09.26
Гуманное перевоспитание!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский