Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.11.2013, 10:38   #1
Ангелина1989
Пользователь
 
Аватар для Ангелина1989
 
Регистрация: 22.11.2013
Сообщений: 22
По умолчанию Chrome

Здравствуйте! пытаюсь создать браузер и обработать его событие динамически
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
   FBrowser := TChromium.Create(Self);
   FBrowser.Parent := TWinControl(Self);
   FBrowser.OnLoadEnd := BrowserOnLoadEnd;
   FBrowser.Load('http://google.com');
end;


procedure TForm1.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
  Visitor: TCefFastDomVisitor;
begin
  if HttpStatusCode = 200 then
  begin
ShowMessage('готово');
  end;
end;
но в отдельном потоке таким образом создать не получается. Вместо Self подставляла Главную форму. Создается, но событие не срабатывает. посоветуйте как можно поймать событие или как можно иначе его создать в отдельном потоке. Нужно именно создавать его а потом уничтожать. Заранее благодарна вам.

Последний раз редактировалось Ангелина1989; 26.11.2013 в 10:51.
Ангелина1989 вне форума
Старый 26.11.2013, 12:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
но в отдельном потоке таким образом создать не получается.
Показывай как пробуешь.
I'm learning to live...
Stilet вне форума
Старый 26.11.2013, 13:27   #3
Ангелина1989
Пользователь
 
Аватар для Ангелина1989
 
Регистрация: 22.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Показывай как пробуешь.
вот код потока
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,cefvcl,ceflib;

type
  FormTThread = class(TThread)
  private
  FBrowser:TChromium;
    procedure showmess;
  protected
    procedure Execute; override;
    public
    procedure BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
  end;

implementation
 uses unit1;

procedure FormTThread.showmess;
begin
with form1 do
begin
ShowMessage('готово');
end;
end;


procedure FormTThread.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
  Visitor: TCefFastDomVisitor;
begin
  if HttpStatusCode = 200 then
  begin
Synchronize(showmess);
  end;
end;


procedure FormTThread.Execute;
begin
FreeOnTerminate:=true;
FBrowser := TChromium.Create(form1);
FBrowser.Parent := TWinControl(form1);
FBrowser.OnLoadEnd := BrowserOnLoadEnd;
FBrowser.Load('http://google.com');


end;


end.
Ангелина1989 вне форума
Старый 26.11.2013, 13:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

По идее вроде все верно за некоторым исключением - FBrowser нигде не освобождается.
Единственное что - FBrowser.Load видимо синхронный, поэтому не стопорит поток. Поток завершается и событие не происходит.
Наверное в этом случае можно сделать так:
Код:
  FormTThread = class(TThread)
  private
  LoadComplete:Boolean;
  FBrowser:TChromium;
    procedure showmess;
  protected
    procedure Execute; override;
    public
    procedure BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
  end;
...
procedure FormTThread.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
  Visitor: TCefFastDomVisitor;
begin
  if HttpStatusCode = 200 then
  begin
   Synchronize(showmess);
   LoadComplete:=true;
  end;
end;


procedure FormTThread.Execute;
begin
FreeOnTerminate:=true;
LoadComplete:=false;
FBrowser := TChromium.Create(form1);
FBrowser.Parent := TWinControl(form1);
FBrowser.OnLoadEnd := BrowserOnLoadEnd;
FBrowser.Load('http://google.com');
while not LoadComplete do sleep(10);

end;
I'm learning to live...
Stilet вне форума
Старый 26.11.2013, 14:06   #5
Ангелина1989
Пользователь
 
Аватар для Ангелина1989
 
Регистрация: 22.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
По идее вроде все верно за некоторым исключением - FBrowser нигде не освобождается.
Единственное что - FBrowser.Load видимо синхронный, поэтому не стопорит поток. Поток завершается и событие не происходит.
Наверное в этом случае можно сделать так:
Код:
  FormTThread = class(TThread)
  private
  LoadComplete:Boolean;
  FBrowser:TChromium;
    procedure showmess;
  protected
    procedure Execute; override;
    public
    procedure BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
  end;
...
procedure FormTThread.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
  Visitor: TCefFastDomVisitor;
begin
  if HttpStatusCode = 200 then
  begin
   Synchronize(showmess);
   LoadComplete:=true;
  end;
end;


procedure FormTThread.Execute;
begin
FreeOnTerminate:=true;
LoadComplete:=false;
FBrowser := TChromium.Create(form1);
FBrowser.Parent := TWinControl(form1);
FBrowser.OnLoadEnd := BrowserOnLoadEnd;
FBrowser.Load('http://google.com');
while not LoadComplete do sleep(10);

end;
Не получается(((( ничего не происходит... ждала пару минут(((( а Fbrowser я освободила в конце потока.

Последний раз редактировалось Ангелина1989; 26.11.2013 в 14:12.
Ангелина1989 вне форума
Старый 26.11.2013, 14:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Точки прерывания расставь в обработчик BrowserOnLoadEnd и в сам поток.
Потом пошагово пройди и посмотри есть ли ожидание загрузки, и попадает ли в событие. Может банально HttpStatusCode далеко не 200.
I'm learning to live...
Stilet вне форума
Старый 26.11.2013, 15:04   #7
Ангелина1989
Пользователь
 
Аватар для Ангелина1989
 
Регистрация: 22.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Точки прерывания расставь в обработчик BrowserOnLoadEnd и в сам поток.
Потом пошагово пройди и посмотри есть ли ожидание загрузки, и попадает ли в событие. Может банально HttpStatusCode далеко не 200.
Я именно так как ты говоришь и проверяла. Через BreakPoint. поток бесконечно выполняет
Код:
while not LoadComplete do
sleep(10);
в чем проблема понять не могу(((((((
Ангелина1989 вне форума
Старый 26.11.2013, 15:37   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Что смущает - VCL. Создаем из потока визульный объект и цепляем его на форму без всякой синхронизации. Не в этом ли собака зарыта?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 26.11.2013, 15:47   #9
Ангелина1989
Пользователь
 
Аватар для Ангелина1989
 
Регистрация: 22.11.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Что смущает - VCL. Создаем из потока визульный объект и цепляем его на форму без всякой синхронизации. Не в этом ли собака зарыта?
А как его создать?))) Я не разу не создавала визуальный объект из потока и не цепляла на форму)))) Подскажи пожалуйста как сделать)))))
Ангелина1989 вне форума
Старый 26.11.2013, 17:06   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Встречный вопрос: А почему в треаде решила работать? Смысл?
I'm learning to live...
Stilet вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пароли Chrome koval0312 Свободное общение 1 07.11.2012 23:08
Opacity в Chrome russian-stalker JavaScript, Ajax 0 09.07.2010 21:16
Google Chrome Syltan Операционные системы общие вопросы 1 16.04.2010 08:18
Google Chrome HellMercenariess Софт 1 06.10.2009 15:53
Странности Chrome` а ]Wowan[ Софт 1 27.04.2009 04:11