Веб-браузер(WebBrowser) своими руками: Судный день

Дочитал до сюда? Мы под впечатлением. Итак, почему собственно Судный день. Потому после сегодняшних преобразований станет ясно идем мы дальше на продолжение, или бросаем делать браузер. Нет, мы не закрываем лавочку, просто надо сесть и подумать, что можно еще прикрутить на базе стандартных элементов. Теперь поехали.

В прошлый раз мы сказали, что сделаем, чтобы вкладки не только создавались, но на них еще можно было и использовать элемент CppWebBrowser, раз уж он там есть. Тут было два пути.

Первый все элементы находящиеся на вкладке зарядить в класс и каждая вкладка это был бы минибраузер. Мы сделали, но нам не понравилось, что много памяти съедается неоправданно. Поэтому мы решили использовать путь номер два.

Второй путь, состоял в том, что мы делаем единую систему управления и при переключении вкладки меняли бы объект контроля этой системой.

Еще раз для тех кто на бронепоезде. Мы сделаем единую панель, где будут кнопки различные - Назад, Вперед, Стоп и прочие. И она будет управлять активной страницей. Скажем, если открыта вторая вкладка, то управление кнопками будет именно этой вкладкой, а не какой-нибудь другой. Логично ведь.

Для начала, вытащи CoolBar со всеми созданными элементами(SpeedButton, ComboBox и Label) на форму. Другими словами сделай так как было раньше, до прихода вкладок. CppWebBrowser оставь на месте.

Теперь надо подкорректировать код события onClick у кнопок. Это связано с тем, что мы сделаем дальше.

newbrowser[PageControl1->ActivePageIndex-1]->GoBack();
newbrowser[PageControl1->ActivePageIndex-1]->GoForward();
newbrowser[PageControl1->ActivePageIndex-1]->Stop();
newbrowser[PageControl1->ActivePageIndex-1]->Refresh();
newbrowser[PageControl1->ActivePageIndex-1]->GoHome();

Догадаешься, что к чему? Тут все так же просто. По одной строчке на кнопку. Но старую строчку надо удалить. Пробуем. Все работает. Но только на новых вкладках. А на первой вылетает. Это происходит, потому что обращаемся мы к массиву, который у нас еще не создан.

Примечание: Это автору все просто. А вот у меня не получилось. Но я разобрался, чего автор не договорил. Помнишь у тебя в onKeyDown компонента Form1 ты выделял память под TTabSheet и под TCppWebBrowser. Так вот, выдели эти две строчки:
TTabSheet* newtab;
TCppWebBrowser* newbrowser;

И вырежи их. А вставь повыше. После всех #include, сразу после TForm *Form1. Причем так как автор задумал делать массив вкладок, то вторая строчка будет выглядеть так:
TCppWebBrowser* newbrowser[50];
И создай сразу счетчик вкладок:
int num=0;
А главное подкорректируй код в событии onKeyDown компонента Form1. Теперь создание браузера будет выглядеть так:
newbrowser[num] = new TCppWebBrowser(PageControl1); newbrowser[num]->TOleControl::Parent = newtab; newbrowser[num]->TOleControl::Name = AnsiString("CppWebBrowser")+IntToStr(PageControl1->PageCount)+1; newbrowser[num]->TOleControl::Align = alClient; num++;
Немного изменилось, я думаю ты поймешь где. Вот теперь все работает. Автор, продолжай.

Убирай первую вкладку. Удали ее. Ты так этого хотел. Компилируй. Ошибка! Ну конечно, он укажет на то, что ты удалил вкладку, а там же был CppWebBrowser1. Удаляй эту строку смело. Уже запустил? Черт возьми, ну куда ты торопишься. А. На свидание. Ну иди, потом продолжим.

Значит так, мы убрали первую вкладку. Это значит, что снова надо подкорректировать код кнопок. Чтобы много не повторять, мы приведем тебе состояние До и После.

До

newbrowser[PageControl1->ActivePageIndex-1]->GoBack();

После

newbrowser[PageControl1->ActivePageIndex]->GoBack();

Надо просто убрать "-1". И так со всеми остальными кнопками. Докажи, что ты это можешь.

И в довершение, оформи код создания вкладки в отдельную функцию. Для этого запиши в заголовочный файл(тот который с расширением .h) в класс TForm1, в секцию published следущее:

void __fastcall make_tab();

Затем перелистни обратно на файл .cpp и добавь эту функцию скопировав операторы предусмотрительно из onKeyDown компонента Form1. Согласно нашему вероисповеданию она выглядит так:

void __fastcall TForm1::make_tab()
{
newtab = new TTabSheet(this);
newtab->PageControl = PageControl1;
newtab->Name = AnsiString("TabSheet")+IntToStr(PageControl1->PageCount+1);
newtab->Caption = "NewTab";
newbrowser[num] = new TCppWebBrowser(PageControl1);
newbrowser[num]->TOleControl::Parent = newtab;
newbrowser[num]->TOleControl::Name = AnsiString("CppWebBrowser")+IntToStr(PageControl1->PageCount)+1;
newbrowser[num]->TOleControl::Align = alClient;
num++;
}

Этой функцией ты облегчишь себе всю работу с вкладками. Только нужна вкладка - make_tab(); и вперед. Не всегда же Ctrl + t жать. Конечно, вкладок ты скажешь ограниченное количество, всего 50. Но никто не мешает тебе увеличить это число. Просто знай, что чем больше вкладок, тем больше кушается памяти твоего мощного компьютера.

Меньше слов, больше дела. Теперь давай идем в onKeyDown компонента Form1. И вместо, скопированного кода впиши там свое имя. Шутим. Впиши туда название созданной функции. Записал? Выглядит теперь так:

if((Key=='T')&&(Shift==TShiftState() << ssCtrl)) make_tab();

Теперь когда все написано, сравним ощущения по скриншоту:

Рисунок 1.

Рисунок 2.

И бонус. Ты наверное заметил, что когда раскрываешь на весь экран, то строка адреса не увеличивается в размерах. Поправим это, если хочешь, конечно. Иди в событие onResize компонента Form1. И пишем:

Form1->ComboBox1->Width = Form1->Width - 150;

Исходники и релиз смотрим тут.

В следующей части займемся мелочами. Кстати, ты герой, эта часть была просто огромной и ты ее таки прочитал;)

P.S. Прежде чем браузить, создай вкладку:)




Ссылки:

К содержанию

© Copyright 2004-2017 - CMS Made Simple
Сайт работает на CMS Made Simple version 1.4.1

© Все печеньки Break-people.ru принадлежат авторам проекта.

Яндекс цитирования Рейтинг@Mail.ru Яндекс.Метрика