Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Delphi 7 Webbrowser вызов процедурки "save as...." КАК?

8.4K
31 января 2007 года
ratttx
64 / / 06.06.2006
У меня скажем так не простой вопросик....
Все вы знаете, что если в IE на загруженом сайте правой кнопкой мыши щелкнуть по рисунку выплывет минюшка в которой будет команда save as(сохранить рисунок как...). После чего выскакивает диалоговое окно, где вы говорите куда ее сохранить и под каким именем....
Так вот мне это нужно сделать програмно........ (ПРИЧЕМ ИМЕННННННННО ЭТО!)
Я не могу просто скачать этот рисунок с сервера....
И не могу скопировать его в буффер, а после через image сохранить на диск.....
(потому, что после с этим рисунком нельзя правильно работать, а вот когда его через "сохранить как", то ошибок после в работе с риссунком не возникает - это мне и нужно....)
нужна команда что то вроде Web1.OleObject.Document.frames.item(3).document.frames.item(0).document.images.item(4).savetofile('c:\\1.bmp');
Или как то вызвать именно эту функцию (сохранить как, уже с заданными параметрами(с:\1.бмп) )
П.с. Web1.OleObject.Document.frames.item(3).document.frames.item(0).document.images.item(4) - это точный путь к рисунку.

Помогите плизззз.
С английским у меня плоховато... Так что плиз не посылайте меня на msdn....
92
31 января 2007 года
Тень Пса
2.2K / / 19.10.2006
а почему ты не можешь скачать рисунок с сервера?

ищешь этот объект используя DOM HTML, выдираешь адрес, и спокойненько "кушаешь" его используя какой-нибудь компонент (idHTTP например с вкладки Indy)
8.4K
31 января 2007 года
ratttx
64 / / 06.06.2006
Потому, что при следующей загрузке его с сервера, обьект изменится....
По этому, есть только один вариант - вынимать его из самого броузера...
Но вот как????
Вернее вынимать то его получается черз
Image1.Picture.Bitmap.LoadFromClipBoardFormat(cf_Bitmap, ClipBoard.GetAsHandle(cf_Bitmap), 0);//вставляем

но через это работать нельзя... Что то с кодировкой рисунка происходит...Перекодировать тоже нельзя....
Так что единственный способ, который отвечает требованиям задачи - это через стандартную функцию ИЕ "Сохранить риссунок как...", только программным способом без задания адресса пути(имени файла)....
Но вот как это сделать?????
11K
31 января 2007 года
.nornad
125 / / 04.01.2007
Буквально две недели назад переполошили полрунета этим вопросом. :)
Код:
for i := 0 to doc.images.length - 1 do
  begin
    if (doc.images.item(i, i) as IHTMLImgElement).src = url then
    begin
      Image1.Picture.Bitmap.Width := (doc.images.item(i, i) as
        IHTMLImgElement).width;
      Image1.Picture.Bitmap.Height := (doc.images.item(i, i) as
        IHTMLImgElement).height;
      finded := doc.images.item(i, i) as IHTMLElement;
      break;
    end;
  end;
  if finded <> nil then
  begin
    body := WB.OleObject.document.body;
    ControlRange := body.createControlRange;
    ControlRange.add(finded);
    ControlRange.execCommand('Copy', False, EmptyParam);
    if ClipBoard.HasFormat(CF_BITMAP) then
    begin
      Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,
        ClipBoard.GetAsHandle(CF_BITMAP), 0);
    end;
  end;

Вот такой вот код для нахождения картинки по урлу, копированию в буфер, а потом из буфера в битмап. Далее можешь делать, что хочется - отображать, сохранять на диск или ещё что-то.

P.S. Код не моего авторства и автора я не знаю, но хотелось бы выразить ему благодарность за решение (искали всем миром и идеи были, в принципе, одинаковы, но вот решение далось не всем).
8.4K
31 января 2007 года
ratttx
64 / / 06.06.2006
Этот код не подходит....
Хоть он и копирует, но проблема в том, что кодировка не сохраняется....(формат рисунка, рисунок можно посмотреть, он схож на все 100% по пискелям, размеру, формату, НО При открытии этого рисункаи сохраненного в ручную с помощью НОТЕПАДА - в глаза сразу бросается разница :( ) - по этому я не могу работать с этим рисунком, мне нужно что бы он сохранялся в точности, как это делается в ручную....
Я этот код уже давно нашел, и пробывал.....
Я же говорю, нужна стандартная процедурка от IE, "сохранить рисунок как..." - только она делает правильное копирование....
92
31 января 2007 года
Тень Пса
2.2K / / 19.10.2006
чолт ))) а я щаз сидел час и искал... msdn перерыл )) а насчет COPY в ExecWB не догадался ))))))))))))

круть =)
8.4K
31 января 2007 года
ratttx
64 / / 06.06.2006
Угу, только мне это не помогло :(

Вот, что люди писали на других форумах, может это вам поможет, что бы понять, эту проблему...
--------------------------------------------------------------
ratttx

Да кстати пробывал еще такой кодик...... использовать....
try
Web1.ExecWB(4, 0);
except
Хех - сайт он сохранил, причем с глюками и причем ВЕСЬ :(((( Только вот того, что мне нужно, не сохранил.....
Так что такой вариант тоже не подходит...(если только у меня руки не кривые, и я не забыл несколько параметров добавить....)
Кстати говоря - мой вопрос весьма актуальный в интернете.... И на него нет еще нормального достойного ответа на русском языке ;)
--------------------------------------------------

andycount
Ему надо вызвать не стандартный диалог сохранения фала а диплог из MSHTML.
-------------------------------------------------------
11K
31 января 2007 года
.nornad
125 / / 04.01.2007
Насколько я понял инет (и рунет, и буржуйскую часть), а также мсдн... нормального способа заставить микрософтовский активэкс сохранить картинку в файл так, как делает это именно он сам - нет.

P.S. Кстати, а как ты через Notepad сохранял картинку? И причём тут кодировка?
8.4K
31 января 2007 года
ratttx
64 / / 06.06.2006
Я не сохронял картинку через нотепад....
Я сохранял картинку многими способами(програмными,, один из них описан выше...) и в ручную, после чего сравнивал картинки открывая их через НОТЕПАД... И в итоге они различаются... :( а на счет, что способа нет, это врятли - должен быть.... Или этой функции бы небыло....
11K
31 января 2007 года
.nornad
125 / / 04.01.2007
Блажен, кто верует.
Если способ всё же отыщется - буду только рад. Я же не нашёл даже просто возможности пнуть активэкс с командой сохранения какого-либо элемента. Всю страницу - пожалуйста. Один элемент - кукиш.
8.4K
01 февраля 2007 года
ratttx
64 / / 06.06.2006
Жаль блаженство тут не поможет....
У кого-нибудь есть идеи, как можно отследить действия IE во время сохранения рисунка? (Самая глупая идея, которая мне на ум пришла....)

Кстати говоря, этот вопрос ОЧЕНЬ актуален в интернете!!!!!!!!!!!
И в нем нуждаются многие.... Так что призываю людей способных помочь большинству решить этот вопрос о помощи..... (Надежда на умных, уже все надежды на всех форумах иссякли.. :( )
92
04 февраля 2007 года
Тень Пса
2.2K / / 19.10.2006
солюшн я вроде как нашел.... счась поставлю дельфю и буду пробовать ;) ждём-с результатов

/*4:26 утра.... чокнутый :D*/

если честно... то мозг уже не варит......

могу рассказать идею:

значится создать HTML-ку (типа хак документ...) он будет являться оберткой....

значится внутри него, js и iframe.... то есть все Navigate твоего CppWebBrowser'а ты перенапрявляешь в этот iframe..... ну соотвессна растяни его там не знаю... на всю страницу... чтобы было похоже что это и есть документ ;) дальше....

значится в ifram'е на onload (если щаз не ошибаюсь... ща псмтарю....) да... точно на OnLoad в iframe ставишь следующую функцию.....

[html]

<script>
function SaveImage() {

if (typeof document.getElementById(iframe_id).window.document.images[image_index] == 'object') {
imgOrURL = document.getElementById(iframe_id).window.document.images[image_index].src;
document.getElementById("win").location = imgOrURL;
setTimeout('document.getElementById("win").document.execCommand("SaveAs")', 10);
}

}
</script>

[/html]строчка document.getElementById("win").location = imgOrURL; - WIN это твой второй IFRAME с id="win", невидимый, чтобы открывать в нем рисунки для сохранения ;)

строчка setTimeout('document.getElementById("win").document.execCommand("SaveAs")', 10); - тут точно не скажу, но почитай здесь про комманду SaveAs... ну всмысле спрятать диалог... и имя файла по умолчанию...


вот как бы вот такая идея... но реализовать я её, простите, в данный момент не в состоянии......... о как.... если сможете, и идейка чем-то помогла... то гут... если нет... ну нет так нет.... жаль конечно будет )

PS: с утра встану, буду тож пробовать... но ничего не обещаю ..... ) давно Дельфи не юзал

а счась спаааать .....
8.4K
04 февраля 2007 года
ratttx
64 / / 06.06.2006
Функция скорее всего сработает, только вот чет я ее на дельфи перевести не могу :(
92
04 февраля 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: ratttx
Функция скорее всего сработает, только вот чет я ее на дельфи перевести не могу :(



эту функцию надо вставить в свою HTML-обертку =)

PS: я вот встал водички попить ) решил заглянуть )

8.4K
04 февраля 2007 года
ratttx
64 / / 06.06.2006
Эта функция сохраняет весь сайт, как я понял... (Вернее невидемый фрейм...), так вот, я уже пытался сохранить ВЕСЬ сайт...... Используя эту команду... web1.ExecWB(4,0); Так вот он сохранил ВСЕ, кроме того, что мне нужно все фреймы, все картинки, НО ТУ КАРТИНКУ, которая мне нужна не сохранил :( Я не знаю, как ИЕН сохраняет, своей процедуркой, но вот ее нам и нужно вызвать.....
9.0K
12 февраля 2007 года
Toxin_F
93 / / 03.01.2007
Цитата: ratttx
сравнивал картинки открывая их через НОТЕПАД... И в итоге они различаются... :(


Вот исходник попробуй...

27K
21 февраля 2007 года
zhenek
2 / / 21.02.2007
Цитата: Toxin_F
Вот исходник попробуй...



за работающий исходник спасибо и респект, а вот за трояна с сайта, указанного по умолчанию, можно и навалять пи###лей, так что всё уважение к автору как рукой сняло

27K
21 февраля 2007 года
zhenek
2 / / 21.02.2007
Цитата: .nornad
Буквально две недели назад переполошили полрунета этим вопросом. :)
Код:
for i := 0 to doc.images.length - 1 do
  begin
    if (doc.images.item(i, i) as IHTMLImgElement).src = url then
    begin
      Image1.Picture.Bitmap.Width := (doc.images.item(i, i) as
        IHTMLImgElement).width;
      Image1.Picture.Bitmap.Height := (doc.images.item(i, i) as
        IHTMLImgElement).height;
      finded := doc.images.item(i, i) as IHTMLElement;
      break;
    end;
  end;
  if finded <> nil then
  begin
    body := WB.OleObject.document.body;
    ControlRange := body.createControlRange;
    ControlRange.add(finded);
    ControlRange.execCommand('Copy', False, EmptyParam);
    if ClipBoard.HasFormat(CF_BITMAP) then
    begin
      Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,
        ClipBoard.GetAsHandle(CF_BITMAP), 0);
    end;
  end;

Вот такой вот код для нахождения картинки по урлу, копированию в буфер, а потом из буфера в битмап. Далее можешь делать, что хочется - отображать, сохранять на диск или ещё что-то.

P.S. Код не моего авторства и автора я не знаю, но хотелось бы выразить ему благодарность за решение (искали всем миром и идеи были, в принципе, одинаковы, но вот решение далось не всем).



а есть ли у этого кода описание переменных, а то не везде ясно какого типа должна быть переменная, а кусок (doc.images.item(i, i) as IHTMLImgElement).src компилятор вообще ругается благим матом

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог