Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102

Многостраничный TWebBrowser: проверка возможности хода назад на активной вкладке

27.05.2012, 16:40. Показов 2870. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я наверно уже достал, но когда пргограммно создаю вкладку и веббраузер на ней, устанавливаю обработчик события OnCommandStateChange:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.CreateNewTab(Title : string);
begin
tabsheet := TTabSheet.Create(PageControl1);
tabsheet.PageControl := PageControl1;
tabsheet.Caption:='Ýêñïðåññ ïàíåëü';
PageControl1.ActivePage := tabsheet;
Panel:=TPanel.Create(tabsheet);
Panel.Parent:=tabsheet;
Panel.Align:=alTop;
Panel.Height:=25;
Edit:=TEdit.Create(panel);
Edit.Parent:=Panel;
Edit.Left:=0;
Edit.Width:=Width div 2 + 80;
Edit.OnKeyPress := EditKeyPress;
WebBrowser := TWebBrowser.Create(tabsheet);
TWinControl(WebBRowser).Parent := TabSheet;
WebBRowser.Align := alClient;
WebBRowser.OnNewWindow2 := WebBrowser1NewWindow2; 
WebBrowser.OnDocumentComplete := WebBrowser1DocumentComplete;
WebBrowser.OnStatusTextChange := WebBrowser1StatusTextChange;
WebBrowser.OnProgressChange := WebBrowser1ProgressChange;
TabSheet.Tag := Integer(WebBRowser); 
WebBrowser.Tag:=Integer(Edit);
WebBrowser.OnCommandStateChange:=WebBrowser1CommandStateChange;
end;
А потом проверяю
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
procedure TForm1.WebBrowser1CommandStateChange(Sender: TObject;
   Command: Integer; Enable: WordBool);
 begin
   case Command of
CSC_NAVIGATEBACK:
begin
Back.Enabled := Enable;
if Back.Enabled=false then begin
     back.Visible:=false;
     back2.Visible:=true;
     end
else
     begin
     back.Visible:=true;
     back2.Visible:=false;
     end;
     end;
CSC_NAVIGATEFORWARD:
begin
Forward.Enabled:=Enable;
if Forward.Enabled=false  then begin
     Forward.Visible:=false;
     Forward2.Visible:=true;
     end
else
     begin
     Forward.Visible:=true;
     Forward2.Visible:=false;
     end;
     end;
CSC_UPDATECOMMANDS:
begin
 Stop.Enabled := TWebBrowser(Sender).Busy;
if Stop.Enabled=false then begin
    Stop.Visible:=false;
    Refresh.Visible:=true;
    end
else
    begin
    Stop.Visible:=true;
    Refresh.Visible:=false;
    end;
    end;
end;
end;
то это работает только для веба на первой вкладке, а как сделать что бы работало на активной вкладке, т.е. проверяло возможность хода назад на активной вкладке, а не на первой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2012, 16:40
Ответы с готовыми решениями:

Элементы на активной вкладке PageControl1
У меня по клику на кнопке программно создается tabsheet в PageControl-e. Нужно сделать так, чтобы после ввода адреса в Edit срабатывал...

Создать ссылки на активной вкладке
Задача такая С помощью макроса создать линки на активной вкладке для перехода на соседную вкладку/соответстующую ячейку? пример ...

Метод отрабатывания назад (обратного хода)
Здравствуйте! Помогите реализовать задачу в Делфи методом отрабатывания назад (т.е. от цели (результата) к началу задачи) Имеется два...

24
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.05.2012, 17:18
Вот... Давно я ждал этого вопроса от тебя. А теперь - внимание, ответ: никак при текущей архитектуре твоего приложения.

Этот вопрос поднимался на форуме Эмбаркадеро, там пришли к выводу, что для того функционала, который тебе нужен, потребуется не создавать динамически вкладку со всем содержимым, а создать TFrame, и вот его создавать динамически на вкладке. Хоть и кажется, что это одно и то же - ан нет, между созданием браузера и назначением его событию свойству какого-то обработчика и генерацией нового экземпляра фрейма со всем содержимым (включая и все установленные обработчики событий) есть разница.

К тому же и код упростится.
2
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
27.05.2012, 17:34  [ТС]
Да, я его только заметил, а TFrame это что??????
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.05.2012, 17:39
Скажем так: это SubФорма. То есть, некая форма, которую ты можешь по желанию вставить в другую форму. Почитай
2
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
27.05.2012, 21:26  [ТС]
Так получается мне надо во фрейме создавать вкладку, а потом эту вкладку помещать в pagecontrol1?

Добавлено через 1 час 11 минут
Или создавать вкладку в основном юнит, а во фрейм размещать браузер т.д.?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.05.2012, 21:43
Смотри. Фрейм:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls;
 
type
  TFrame2 = class(TFrame)
    Panel1: TPanel;
    Edit1: TEdit;
    WebBrowser1: TWebBrowser;
    procedure WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
      var Cancel: WordBool);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
implementation
uses Unit1;
 
{$R *.dfm}
 
procedure TFrame2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if Key = #13 then
      with Sender as TEdit do
      begin
         WebBrowser1.Navigate(Text);
      end;
end;
 
procedure TFrame2.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool);
begin
   Form1.DoCreateTab('Untitled');
   ppDisp := TFrame2(Form1.PageControl1.ActivePage.Tag).WebBrowser1.DefaultDispatch;
end;
 
end.
, часть основного модуля:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Кнопка "новая закладка"
procedure TForm1.Button1Click(Sender: TObject);
begin
   DoCreateTab('Untitled');
end;
 
// Собственно, формирование новой закладки
procedure TForm1.DoCreateTab(s: string);
var
   ts : TTabSheet;
   MyFrame : TFrame2;
begin
   ts := TTabSheet.Create(PageControl1);
   ts.PageControl := PageControl1;
   ts.Caption := s;
   PageControl1.ActivePage := ts;
 
   MyFrame := TFrame2.Create(ts);
   MyFrame.Parent := ts;
   MyFrame.Align := alClient;
   ts.Tag := Integer(MyFrame);
end;
Все, больше ничего здесь присваивать не надо, все обработчики делаются прямо в модуле, где описывается фрейм. То есть, ты там создал всё что надо один раз - и потом просто добавляешь в новую вкладку, когда нужно...
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
27.05.2012, 22:25  [ТС]
Блин, а я не дадумался через процедуру, а так ок, спс. потом попробую

Добавлено через 19 минут
Ага, т.е. описание создания закладки и объектов на ней в
Delphi
1
procedure TForm1.DoCreateTab(s: string);
а если какое нибудь событие с объектом из фрейма, то в юните фрейма?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.05.2012, 23:28
Цитата Сообщение от gamerfox Посмотреть сообщение
а если какое нибудь событие с объектом из фрейма, то в юните фрейма?
Я ж сделал событие Edit1KeyPress - сам эдит во фрейме - и событие прямо там же. Да и OnNewWindow2 тоже во фрейме реализовано.
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
27.05.2012, 23:54  [ТС]
Подожди, так получается у тя на фрейме сразу есть edit, panel и webbrowser, а в его юните ты описал эти событи (enter по edit, и открытие новой вкладке). А на форме у тя кнопка и pagecontrol и в юните формы ты просто создаешь вкладку и на ее помещаешь этот фрейм? Если да то у меня так вкладка создается но она пустая.

Добавлено через 4 минуты
Да, я знаю что тя уже "достал" но плиз
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.05.2012, 23:54
Значит, что-то не доделал. Могу проект (2009-я Дельфи) прикрепить, открываются вкладки вместе со всем содержимым фрейма.
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
28.05.2012, 00:10  [ТС]
Ну что я не доделал? Создал проект; создал фрейм; кинул на фрейм webbrowser, panel,edit; описал события как ты; на форму кинул pagecontrol, panel,button; прописал для batoon, скопировал твою процедуру DoCreateTab и описал ее в { Public declarations }; save и f9; ругается на MyFrame : TFrame2 и MyFrame := TFrame2.Create(ts); делаю TFrame и f9; запускается, нажимаю на батон; создается вкладка но пустая.

Добавлено через 7 минут
ну вот:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls;
type
  TFrame2 = class(TFrame)
    Panel1: TPanel;
    Edit1: TEdit;
    WebBrowser1: TWebBrowser;
    procedure WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
      var Cancel: WordBool);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
implementation
uses Unit1;
{$R *.dfm}
procedure TFrame2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if Key = #13 then
      with Sender as TEdit do
      begin
         WebBrowser1.Navigate(Text);
      end;
end;
procedure TFrame2.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
  var Cancel: WordBool);
begin
   Form1.DoCreateTab('Untitled');
   ppDisp := TFrame2(Form1.PageControl1.ActivePage.Tag).WebBrowser1.DefaultDispatch;
end;
end.
и вот:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    PageControl1: TPageControl;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure DoCreateTab(s: string);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DoCreateTab(s: string);
var
   ts : TTabSheet;
   MyFrame : TFrame;
begin
   ts := TTabSheet.Create(PageControl1);
   ts.PageControl := PageControl1;
   ts.Caption := s;
   PageControl1.ActivePage := ts;
   MyFrame := TFrame.Create(ts);
   MyFrame.Parent := ts;
   MyFrame.Align := alClient;
   ts.Tag := Integer(MyFrame);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 DoCreateTab('Untitled');
end;
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
28.05.2012, 00:23
Тогда расскажи мне, что именно я делаю не так:

1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
28.05.2012, 00:46  [ТС]
НУ А ЧЕ Я НЕ ТАК ДЕЛАЮ???:w all:
Миниатюры
Многостраничный TWebBrowser: проверка возможности хода назад на активной вкладке  
Вложения
Тип файла: rar 1.rar (195.4 Кб, 9 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
28.05.2012, 00:56
Кто будет

Delphi
1
2
implementation
uses Unit2; // <--- Вот это
делать в модуле формы? Я как раз сделал. Ты ж хочешь использовать что-то описанное в другом модуле - так будь добр этот "другой модуль" подключить.
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
28.05.2012, 20:21  [ТС]
Вот халера. :yaho o::ya hoo:

Добавлено через 19 часов 21 минуту
Еще вопрос, а как теперь указать ширину edit на фрейме когда он создается. Когда без фрейма то при создании вкладки сразу указывал
Delphi
1
edit.width:=width div 2
а потом под onResize тоже самое. А как теперь указать ширину edit при создании?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
28.05.2012, 21:35
Я не понял, а что, при изменении размеров формы ты считаешь, что размер фрейма не меняется? А коли меняется - то:

Delphi
1
2
3
4
procedure TFrame2.FrameResize(Sender: TObject);
begin
   Edit1.Width := Form1.Width div 2;
end;
Больше ничего делать не надо, после создания фрейма ему делается Align = alClient, это приводит к OnResize фрейма, ширина эдита выставится правильно.

Добавлено через 11 минут
Кстати, еще одна идея... Если сделать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Переделать процедуру в функцию
function TForm1.DoCreateTab(s: string) : TWebBrowser;
var
   ts : TTabSheet;
   MyFrame : TFrame2;
begin
   ts := TTabSheet.Create(PageControl1);
   ts.PageControl := PageControl1;
   ts.Caption := s;
   PageControl1.ActivePage := ts;
 
   MyFrame := TFrame2.Create(ts);
   MyFrame.Parent := ts;
   MyFrame.Align := alClient;
   Result := MyFrame.WebBrowser1; // Вернуть ссылку на браузер фрейма
end;
, то можно вообще убрать всю работу с тегами. В частности, OnNewWindow2 может выглядеть вот так:
Delphi
1
2
3
4
5
procedure TFrame2.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
   ppDisp := Form1.DoCreateTab('Untitled').DefaultDispatch; // Гораздо проще, правда?
end;
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
28.05.2012, 21:47  [ТС]
Насчет ширины конечно лоханулся, меня че то понесло на OnCanResize и не работало. А вот это
Delphi
1
2
3
4
5
6
Result := MyFrame.WebBrowser1; // Вернуть ссылку на браузер фрейма
procedure TFrame2.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
   ppDisp := Form1.DoCreateTab('Untitled').DefaultDispatch; // Гораздо проще, правда?
end;
типа ссылка будет открыватся в одной вкладке, т.е. не будут создаватся вкладки а все будет в одной или как и зачем этот result?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
28.05.2012, 21:53
Цитата Сообщение от gamerfox Посмотреть сообщение
типа ссылка будет открыватся в одной вкладке
Не-а. Все так же работает, проверь, функционал нисколько не изменился. Просто при создании вкладки ссылка на WebBrowser, лежащий на фрейме (на новом фрейме, заметь) будет возвращаться как результат функции. И нет необходимости записывать ту же ссылку в ts.Tag, чтобы потом ее прочитать в событии OnNewWindow...
1
1 / 1 / 0
Регистрация: 04.05.2012
Сообщений: 102
28.05.2012, 22:28  [ТС]
А функцию обьявить
Delphi
1
function DoCreateTab(s: string): TWebBrowser;
?

Добавлено через 20 минут
Цитата Сообщение от gamerfox Посмотреть сообщение
А функцию обьявить
Delphi
1
function DoCreateTab(s: string): TWebBrowser;
?
просто у меня ругается на TWebBrowser;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
28.05.2012, 22:37
Delphi
1
Uses ..., SHDocVw;
Спасет тебя
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2012, 22:37
Помогаю со студенческими работами здесь

PageControl - как обратиться к активной вкладке
Добрый день. Создаю динамические вкладки void __fastcall TForm1::BitBtn1Click(TObject *Sender) { // создание новой вкладки ...

Шахматы, проверка корректности хода пешки
как всем известно: пешка ходиать может вначале на две клетки вперед, а затем по одной. делаю на с# и не могу придумать алгоритм. ...

Проверка координат для хода слона
Задается расположение фигурки слона. Так же задаем точку для проверки. Как проверить может ли слон с текущего положения совершить...

Преобразовать код из C++ в С#. Проверка хода ладьи
Нужно переобразовать в С# #include &lt;iostream&gt; #include &lt;clocale&gt; // чтобы русский шрифт был class ladya{ public: int ver; ...

Не могу найти ошибку в программе(для просмотра картинок):кнопка НАЗАД не работает(не становится активной) Найдите ошибку.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru