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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2013, 23:16   #1
RTO
 
Регистрация: 24.06.2011
Сообщений: 4
По умолчанию Обработчик события динамического TWebBrowser

Суть проблемы: по нажатию клавиши Enter в ComboBox создаётся динамический экземпляр TTabControl и в него помещается динамически же экземпляр TWebBrowser (попросту создаётся новая вкладка интернет-браузера), ему в качестве адреса страницы для навигации передаётся текст, введённый в этом самом ComboBox. Необходимо чтобы в названии вкладки отображался адрес загруженной страницы, но в корректной форме, т.е. вместо введённого "google.ru" должно отображаться "https://www.google.ru/".
Как я понимаю, этот адрес можно получить из самого TWebBrowser через свойство LocationURL, по событию OnNavigateComplite2. Но как осуществить этот процесс для несуществующего в момент запуска TWebBrowser? Нужно как-то в явной форме прописать обработчик события OnNavigateComplite2 для динамически созданного TWebBrowser, так чтобы, после создания вкладки браузера и загрузки страницы, адрес самой страницы передавался в контейнер
Код:
PageControl.ActivePage.Caption := TWB.LocationURL
Но вот вопрос, КАК это сделать?

Буду благодарен за разъяснения или хотя бы примеры кода, где это реализовано, пусть и не для моего примера (код создания обработчика события, который получает свойство динамического объекта при действии с этим объектом).


P.S. Тему пошарил, точного ответа не нашёл, пару раз нарывался на подобные посты в которых ТС находил решение, но увы не сообщал как. Поэтому прошу не ругать, если всё же не нашёл готовый ответ на свой вопрос, весь интернет не перекопать, а вот если кто-то сталкивался с таким, то совет даст стократ быстрее. =)

P.P.S. Среда - Embarcadero Delphi XE4.
Уровень владения программированием - любительский, то есть понимаю что делаю, но без заумных определений (например не знаю толком что такое "инкапсуляция" или "наследование классов", но вполне уже мог их применять на практике). Как следствие, неадаптированные статьи из книг для профессионалов могу не понять (но код разберу).

Заранее благодарен за конструктивные ответы или ссылки на необходимые ресурсы.
RTO вне форума Ответить с цитированием
Старый 29.08.2013, 00:08   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,775
По умолчанию

Странно, с браузером разобрался, а создать вручную обработчик в своей форме и программно присвоить экземпляру браузера не догадался. Нечто похожее, по всей видимости, описывается здесь (Google заботливо предложил исправить OnNavigateComplite2 на OnNavigateComplete2).

События -- по сути самые обыкновенные методы, их можно создавать в любом количестве где нужно и присваивать обычным присвоением. Если порядок и тип параметров вдруг не совпадет, компилятор заругается.
Vapaamies вне форума Ответить с цитированием
Старый 29.08.2013, 21:14   #3
RTO
 
Регистрация: 24.06.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Странно, с браузером разобрался, а создать вручную обработчик в своей форме и программно присвоить экземпляру браузера не догадался.
Я просто ещё занимался этим, то есть впервые работаю с динамическими объектами, потому всегда пользовался имеющимися обработчиками событий (чего там, даблклик по соответствующему полю Events и пиши код...)

Цитата:
Нечто похожее, по всей видимости, описывается ... (Google заботливо предложил исправить OnNavigateComplite2 на OnNavigateComplete2).
Да опечаточка вышла))) А пример по ссылке не то. Дело в том, что там экземпляр TWebBrowser уже находится на форме (о чём говорит его объявление в графе "Type"), в моём же случае объект отсутствует, и появляется главным образом по воле пользователя. Вот так выглядит фрагмент моего кода, скажите что не верно?

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.XPMan, Vcl.Tabs,
  Vcl.DockTabSet, Vcl.StdCtrls, Vcl.Buttons, Vcl.OleCtrls, SHDocVw, Vcl.ToolWin,
  Unit2, Vcl.ExtCtrls, Vcl.Menus;

type
    TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    PageControl1: TPageControl;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N4: TMenuItem;
    N6: TMenuItem;
    N10: TMenuItem;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    ComboBox1: TComboBox;
    BackButton: TSpeedButton;
    FwrdButton: TSpeedButton;
    RefreshButton: TSpeedButton;
    NewPageButton: TSpeedButton;
    OpenDialog1: TOpenDialog;
    GOButton: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure NewPageButtonClick(Sender: TObject);
    procedure GOButtonClick(Sender: TObject);
    procedure N4Click(Sender: TObject);
        Procedure WBNavigateComplete2 (ASender: TObject;  const pDisp: IDispatch; const URL: OleVariant);
Выше я указываю на создание этого обработчика события для динамического TWebBrowser (экземпляром его класса в программе является WB)

Код:
private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;
  PageControl: TPageControl;
  TS: TTabSheet;
  WB: TWebBrowser;
  Counter: integer;
  Panel: TPanel;

Задал все необходимые переменные. TS и WB - динамически создаваемые TTabSheet и Подконтрольный ему TWebBrowser)


Код:
implementation

{$R *.dfm}


Procedure TForm1.WBNavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
    PageControl.ActivePage.Caption := WB.LocationURL;
end;
И сама процедура обработчика событий (делал по аналогии с той что выдаётся на объекте с формы)

Ниже фрагмент кода, в котором процедура перехода на введённый адрес по энтеру в комбобоксе.


Код:
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_RETURN then
   begin
    WB.Navigate(ComboBox1.Text);
    ComboBox1.Items.Add(Combobox1.Text);
   end;
end;

Здесь, ниже, процедура создания пустой вкладки при создании формы (чтобы на первых порах избежать ошибки, когда адрес введён, а передавать его некому. После приведу всё в божеский вид, уберу сотни строк излишнего и неорганизованного кода)

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin

// При создании окна программы создаём пустую вкладку, готовясь к открытию страницы 

Counter :=0;

TS := TTabSheet.Create(PageControl1);
     with TS do
       begin
         visible := true;
         TS.Caption := 'Пустая страница';
         TS.Parent:=PageControl1;
         TS.PageControl := PageControl1;

       end;
         Panel:= TPanel.Create(TS);
         Panel.Align:=alclient;

         TControl(Panel).Parent:=TS;
         WB:=Twebbrowser.Create(Panel);
         TControl(WB).Parent:=Panel;

         WB.Align:=alClient;
         WB.Silent:=true;
         WB.Visible:=true;

         PageControl1.ActivePage:=TS;

end;
Цитата:
События -- по сути самые обыкновенные методы, их можно создавать в любом количестве где нужно и присваивать обычным присвоением. Если порядок и тип параметров вдруг не совпадет, компилятор заругается.
Вот вроде и понимаю Вас, и наверное не до конца всё же понимаю. Ну вот создал я то что вы видели выше, вроде всё верно, ошибок нет, компилятор не ругается, но ничего и не происходит. Укажите, пожалуйста, что я сделал не так, или быть может забыл.
RTO вне форума Ответить с цитированием
Старый 29.08.2013, 21:49   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,775
По умолчанию

Не вижу присвоения:
Код:
begin
  ...
  WB.OnNavigateComplete2 := WBNavigateComplete2;
end;
Кроме того, чтобы написаное перестало быть быдлокодом, все глобальные переменные, кроме Form1, должны переехать либо в секцию private формы, либо стать локальными переменными в FormCreate.
Vapaamies вне форума Ответить с цитированием
Старый 29.08.2013, 21:50   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

При создании WB присвойте ему обработчик
Код:
WB.OnNavigateComplete2:=WBNavigateComplete2;
northener вне форума Ответить с цитированием
Старый 29.08.2013, 22:21   #6
RTO
 
Регистрация: 24.06.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Не вижу присвоения:
Код:
begin
  ...
  WB.OnNavigateComplete2 := WBNavigateComplete2;
end;
Кроме того, чтобы написаное перестало быть быдлокодом, все глобальные переменные, кроме Form1, должны переехать либо в секцию private формы, либо стать локальными переменными в FormCreate.
Переменные прописывал ночью и на автомате запихнул не туда, прошу прощения =)

Извините за, быть может, совсем уж глупый вопрос, но в какой части кода необходимо присвоить обработчик события? Сразу за строкой
Код:
WB:=Twebbrowser.Create(Panel);
Как я понимаю именно она и создаёт необходимый мне WebBrowser?

(В этом случае выдаёт ошибку: Project WebBrowser.exe raised exception class $C0000005 with message 'c0000005 ACESS_VIOLATION'.
После чего я вижу перед глазами окно с заголовком CPU и кодом ассемблера...)

Я в отпуске, и тут под рукой не оказалось учебника по Delphi, чтобы на досуге полистать книгу, так что вы уж не серчайте. =)
RTO вне форума Ответить с цитированием
Старый 30.08.2013, 00:49   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
в какой части кода необходимо присвоить обработчик события?
В любой. Но естественно после того как компонент будет создан. И желательно до того, как этот обработчик понадобится.
Цитата:
В этом случае выдаёт ошибку
В каком этом случае? Дайте код, который даёт ошибку, проверим.
northener вне форума Ответить с цитированием
Старый 30.08.2013, 22:01   #8
shulavina
Новичок
Джуниор
 
Аватар для shulavina
 
Регистрация: 30.08.2013
Сообщений: 1
По умолчанию

Кто нить пробовал свой браузер с минимумом функционала писать? отпишитесь о успехах.. Пишу но туго идет(
shulavina вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик события nanom1t C++ Builder 1 15.04.2013 01:02
обработчик события Rymbil C# (си шарп) 8 29.10.2012 21:25
Обработчик события BodyZ C# (си шарп) 0 24.10.2012 18:17
С# Обработчик события yulshaz Помощь студентам 7 24.09.2012 08:12
Обработчик события yardie Общие вопросы .NET 3 26.03.2011 18:30