![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Помоги плз, никак немогу найти инфу как можно програмно определить размер картинки такого вида:
Код HTML:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
doc: IHTMLDocument2;
i: Integer;
img: IHTMLImgElement;
begin
doc:=WebBrowser1.Document as IHTMLDocument2;
for i:=0 to doc.all.length-1 do
if doc.all.item(i, 0).QueryInterface(IID_IHTMLImgElement, img)=S_OK then
if img.width=121 then
memo1.Text:=img.fileSize;
end; |
|
#2
|
||||
|
||||
|
А в img что-то есть или он пустой? Если Webbrowser всё же получает картинку, то тогда вариант такой - брать её из кэша.
Код:
uses
WinInet;
function GetCacheFileName(const Url: string; var FileName: string): Boolean;
var
Info: PInternetCacheEntryInfo;
InfoBufSize: Cardinal;
begin
Result := False;
InfoBufSize := 0;
GetUrlCacheEntryInfo(PChar(Url),
TInternetCacheEntryInfo(nil^), InfoBufSize);
if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin
GetMem(Info, InfoBufSize);
try
Result := GetUrlCacheEntryInfo(PChar(Url),
TInternetCacheEntryInfo(Info^), InfoBufSize);
if Result then begin
FileName := Info^.lpszLocalFileName;
end;
finally
FreeMem(Info);
end;
end;
end;
//(c) Nikolai Adrianov![]() |
|
#3
|
|||
|
|||
|
А подкскажи как ее использовать на примерчике?)
А то ошибка одолела( [DCC Error] Unit1.pas(125): E2197 Constant object cannot be passed as var parameter Делаю так: Код:
procedure TForm1.Button5Click(Sender: TObject); //var s:string; begin //s:=edit1.Text; GetCacheFileName(edit1.Text,'5570fae99e97c793fb7443cbd43753d8.png'); end; |
|
#4
|
||||
|
||||
|
Здесь нужно запомнить одно простое правило, если используемая функция или процедура в своих параметрах для запуска содержит ключевое слово var, то с этой переменной нужно работать не на прямую, а передавать ей переменную соответствующего типа, поскольку после того как процедура или функция эта отработает, в "заваренной" переменной будет лежать выходной результат. Это действует всегда и везде.
Конкретно с примером - ведь начиналось всё правильно, зачемто отключена s типа string, в код передается константная величина в одинарных кавычках ('*.png'), которую нельзя изменить во время работы, вот компилятор как раз на это (E2197) и ругается. А решается очень просто Код:
procedure TForm1.Button5Click(Sender: TObject);
var
s:string;
begin
// edit1.Text должен содержать ответ на GET запрос, содержащий адрес картинки на сервере в сети
// используем основной результат функции который по определению типа boolean
if GetCacheFileName(edit1.Text, s) then
Image1.Picture.LoadFromFile(s) //вернула true, т.е. файл в кэше есть, в s её имя на диске
else
ShownMessage('Файл получить не удалось, пичалька'); // вернула false, нету файла
end; |
|
#5
|
|||
|
|||
|
Блин, не остается эта картинка в кэше((( Даже оперовский кэш проверял так opera:cache и там нету(( Как же его выдернуть то?(( Опера главное его размер определяет легко и скачивает тоже.
|
|
#6
|
||||
|
||||
|
Ну загрузить в стрим, обнаружить сигнатуру, от нее отплясать и найти информацию о ширине и высоте, все.
З.Ы. Читал тему по диагонали. |