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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2014, 14:24   #1
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию TWebBrowser onStatusTextChange

Всем привет!

Пишу компонент - наследник TWebBrowser. Мне нужно в компоненте обрабатывать событие onStatusTextChange. То есть

Код:
 {...}
type
  TAGBrowser = class (TWebBrowser)
private
 {...}
procedure StatusTextChange(Sender: TObject; const Text: WideString);
 {...}
end;

 {...}
constructor TAGBrowser.Create(AOwner: TComponent);
begin
  inherited;
 {...}
  self.OnStatusTextChange:=StatusTextChange;
end;

procedure TAGBrowser.StatusTextChange(Sender: TObject;
  const Text: WideString);
begin
  {...}
end;
Событие срабатывает. Но когда кидаешь компонент на форму и назначаешь это событие в свойствах, то его перехват в самом компоненте не работает. Что я делаю не так? На других компонентах такой трюк всегда работал.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 21.11.2014, 14:34   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего он должен работать, если задавлен другой процедурой? Запомнить OnStatusTextChange перед присвоением в него. В StatusTextChange анализировать на не nil и выполнять при необходимости
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.11.2014 в 14:36.
Аватар вне форума Ответить с цитированием
Старый 21.11.2014, 14:42   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чесслово помню что там есть секрет один, но не помню какой именно
Кажись у Тексейры было описано как правильно переопределять публишед события.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2014, 14:42   #4
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
А чего он должен работать, если задавлен другой процедурой?
Когда я писал обертки над другими компонентами, то всегда работало. Поэтому я удивился почему тут не работает

Цитата:
Запомнить OnStatusTextChange перед присвоением в него. В StatusTextChange анализировать на не nil и выполнять при необходимости
Можно небольшой пример? А то никак не соображу
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 21.11.2014, 15:01   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На примере TEdit. Возможно в Loaded подкрутить нужно с анализом ComponentState
Код:
  TEdit = class(StdCtrls.TEdit)
  private
    lOldOnChange: TNotifyEvent;
    procedure MyOnChange(Sender: TObject);
  protected
    procedure Loaded; override;
  end;
  TForm1 = class(TForm)
...
procedure TEdit.Loaded;
begin
  inherited;
  lOldOnChange:=OnChange;
  OnChange:=MyOnChange;
end;

procedure TEdit.MyOnChange(Sender: TObject);
begin
  Form1.Label2.Caption:=Text;
  if Assigned(lOldOnChange) then lOldOnChange(Sender);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Label1.Caption:=Edit1.Text;
end;
Ну и динамически потом OnChange менять беда, ну или геттер и сеттер переделывать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.11.2014 в 15:05.
Аватар вне форума Ответить с цитированием
Старый 21.11.2014, 20:18   #6
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Аватар, спасибо за пример. Позже попробую
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 02.02.2015, 18:03   #7
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Проверил на другом своем компоненте. Нужно было перехватить создание формы, а потом вернуть прежний обработчик.

Все работает. Спасибо!

Если кому нужно, то вот пример:

Код:
type
TTest = class (TComponent)
  private
    FForm: TForm;
    OldCreateForm:TNotifyEvent;
    procedure FormCreate(Sender: TObject);
  public
    Constructor Create(AOwner:TComponent);override;
    Destructor Destroy;override;
end;

implementation

{ TTest }

constructor TTest.Create(AOwner: TComponent);
begin
  inherited;
  FForm:=(AOwner as TForm);
  OldCreateForm:=FForm.OnCreate;
  FForm.OnCreate:= FormCreate;
end;

destructor TTest.Destroy;
begin
  inherited;
end;

procedure TTest.FormCreate(Sender: TObject);
begin
MessageBox(0,'','',0);
if assigned(OldCreateForm) then OldCreateForm(FForm);
end;
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 03.02.2015, 05:00   #8
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Столкнулся с проблемой.

Когда таким образом перехватываешь событие, то при открытии проекта из инспектора удаляется процедура создания формы. Оно и понятно, так как в компоненте процедура изымается и заменяется.

Можно ли как-то не давать перехватывать это событие при открытии проекта? Я пробовал назначать условные директивы, пока до меня не дошло, что компонент лежит уже откомпилированный в dcu, и ему похер на директивы.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 03.02.2015, 05:27   #9
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

А, все, понял. Нужно же было проверять свойство ComponentState

Код:
  if not (csDesigning  in self.ComponentState) then
   begin
    OldCreateForm:=FForm.OnCreate;
    FForm.OnCreate:= FormCreate;
  end;
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать отступы в TWebBrowser? + аналоги TWebBrowser? FleXik Общие вопросы Delphi 4 19.07.2013 21:53
TWebBrowser DeDoK Работа с сетью в Delphi 2 24.07.2010 20:58
Incompatible types: 'Unit1.TWebBrowser' and 'SHDocVw.TWebBrowser' simon15x Общие вопросы Delphi 0 10.04.2010 03:11
TWebbrowser. У кого есть? medved6216 Компоненты Delphi 1 08.04.2010 00:59
TWebBrowser Saint_IV Компоненты Delphi 4 15.09.2009 21:36