Перейти к содержанию
Fire Monkey от А до Я
  • 0

Скриншот с WebBrowser (WebBrowser1.MakeScreenshot)


afors

Вопрос

Всем доброго дня или вечера...

Пытаюсь разобраться как получить скриншот загруженной страницы в Image1. У WebBrowser1 есть встроенная функция WebBrowser1.MakeScreenshot. Если по нажатии на Button1 выполнить код 

Image1.Bitmap:=WebBrowser1.MakeScreenshot;

, то все работает. А если выполнить этот же код при срабатывании события OnDidStartLoad, приложение зависает.

Как это побороть?

PS: файл проекта прилагается...

SceenShotFromWebBrowser.zip

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Замените код на такой

procedure TForm1.WebBrowser1DidStartLoad(ASender: TObject);
var
  aThread: TThread;
begin
  aThread := TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize(nil,
        procedure
        begin
          If CheckBox1.IsChecked Then
            Image1.Bitmap := WebBrowser1.MakeScreenshot;
        end)
    end);
  aThread.FreeOnTerminate := true;
  aThread.Start;
end;
Ссылка на комментарий
  • 0
  • Модераторы
9 минут назад, afors сказал:

Так работает, хоть и не до конца понимаю такой подход. Это запуск процедуры в потоке?

Спасибо, Равиль!!!

Да создается поток и в нем синхронизация в которой уже выполняется ваш код

Ссылка на комментарий
  • 0

Рано радовался)

При повторном обновлении снова зависает. Похоже в какую-то цикличность уходит, оперативная память забивается, В студии бегут строки как на картинке. А с кнопки все как надо (не в потоке)

sh.png

Ссылка на комментарий
  • 0

Проблема решилась динамическим созданием/удалением TWebBrowser:

...
var
  Form1: TForm1;
  DynBrowser: TWebBrowser;

implementation

{$R *.fmx}

procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
var
  aThread: TThread;
begin
  aThread := TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize(nil,
        procedure
        begin
            Image1.Bitmap := DynBrowser.MakeScreenshot;
            DynBrowser.Free
        end)
    end);
  aThread.FreeOnTerminate := true;
  aThread.Start;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DynBrowser:=TWebBrowser.Create(self);
  DynBrowser.Parent:=TabItem2;
  DynBrowser.Align:=TAlignLayOut.Client;
  DynBrowser.OnDidFinishLoad:=Form1.WebBrowser1DidFinishLoad;
  DynBrowser.Navigate(Memo1.Text);
  DynBrowser.Free;
end;
...

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...