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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2010, 15:35   #1
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию Вкладки в Webbrowser

Есть задача написать браузер с поддержкой открытия многих интернет ресурсов в одном окне. Реализую через табы (вкладки), как и в Опера, как и в ИЕ 7+ (если не ошибаюсь).

Набрёл на проблему: как это сделать?
Если на каждой переключенной вкладке грузить страницу заново - это сожрёт немало трафика у пользователей. Говорю об этом:
Код:
procedure TForm1.sTabChange(Sender: TObject);
begin
address.Text:=wb.OleObject.Document.URL;
if Stab.Tabs.Count<>0 then wb.navigate(stab.Tabs[sTab.TabIndex]);
end;
Вот такой вариант явно не проходит... Если сохранять открытый сайт в временный файл, а потом при переключении вкладок загружать файл - слишком загрузит программу. Да и сохранение нужно будет делать со всеми вытекающими файлами, картинками и тд и тп - а зачем.

Нужен ваш совет, как реализовать данную задачу, используя TWebBrowser, TTabControl, ну и поле address если нужно будет.
Заранее большое спасибо.
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 01.02.2010, 15:42   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

а если на каждой вкладке создавать свой webbrowser?
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 01.02.2010, 15:45   #3
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Хм... Ну такая мысль проскакивала, но тогда уже не TabControl, а PageControl.

Если так, тогда как это сделать? Нет, не подумайте, но я не часто пользуюсь методом создания классов.
Как-то так:
Код:
var wb1:twebbrowser;
begin
wb1:=twebbrowser.create(nil);
PageControl.Tabs.Add(address.text);
// как вот здесь создавать ВБ в новой вкладке??
wb1.navigate(address.text);
...
И потом еще wb1.show, по-моему, чтобы было видно созданное.
Как-то так пробывал - выскакивает ошибка, с очень нехорошим объяснением.
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 01.02.2010, 16:14   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Sensizu
...Если сохранять открытый сайт в временный файл, а потом при переключении вкладок загружать файл - слишком загрузит программу.
1- можно сохранить в поток и грузить из потока...
Код:
function LoadFromStream(const AStream: TStream): HRESULT;
begin
  AStream.seek(0, 0);
  (WebBrowser1.Document as
  IPersistStreamInit).Load(TStreamAdapter.Create(AStream));
end;
2- создать динамически... как-то так...
Код:
var p: tpagecontrol;
     wb: array of twebbrowser;
begin
 p:= tpagecontrol.create;
 with p do begin
  //прописываете нужные свойства 
  parent:= self
 end;
...
еще вкладки
...

 //тут create нужные компоненты
 setlength(wb, wb[length(wb)+1]);
 wb[length(wb)-1]:= twebbrowser.create(self);
 wb[length(wb)-1].navigate(address[wb[length(wb)-1]]); // address - массив адресов

 //потом
 p.insertcontrol(wb[length(wb)-1]) // или parent, проверите сами
end
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.02.2010, 16:43   #5
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Спасибо за вариации.
Начал делать методом создания новых страниц в PageControl. Делаю так:
Код:
function TForm1.OpenURL(const Addr:String):integer;
var TabSheet : TsTabSheet; PC:TsPageControl; web:TWebBrowser;
begin
PC:=TsPageControl.Create(self);
PC.ShowCloseBtns:=True;
PC.Parent:=wb_par;
PC.Align:=alClient;
PC.TabStop:=False;

with PC do
begin
TabSheet:=TsTabSheet.Create(Self);
TabSheet.PageControl:=PC;
TabSheet.TabStop:=False;
TabSheet.Caption:=addr+'     ';

web:=TWebBrowser.Create(self);
TWinControl(web).Parent:=PC;
web.Align:=alClient;
web.Navigate(addr);

web.OnStatusTextChange:=webStatusTextChange;
web.OnProgressChange:=webProgressChange;
end;
Всё отлично! Но есть одна проблема. При следующем открытии ссылки, которое происходит той же процедурой вверху, новый TabSheet перезаписывает старый, и в итоге более одного в PageControl нет. Как сделать чтобы в куске
Код:
TabSheet:=TsTabSheet.Create(Self);
TabSheet.PageControl:=PC;
как-то определялся индекс, и следующую вкладку вставляло уже второй, а следующую третей и тп. Как?
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 01.02.2010, 16:55   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вариации значит прошли мимо... вы же одну и ту же вкладку создаете, мало того и браузер один и тот-же.
...сделайте динамический массив и будет вам счастье.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.02.2010, 17:13   #7
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Всё. Сделано! =) Огромное спасибо за помощь, массивы как раз помогли.
И на прощание, не могли бы вы посоветовать как сделать, если длинна TabSheet (заголовка имею ввиду) больше скажем 100 символов, чтобы Width таба обрезало до скажем 101?
Пробую так:
Код:
if length(TabSheet[n-1].Tabs[TabSheet[n-1].TabIndex])>100 then ... ??? else Refresh.
Проблема в том, как обрезать именно этот таб, где длинна превысила норму, а не все, имеющиеся в ПейджКонтрол.
Спасибо!
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });

Последний раз редактировалось Sensizu; 01.02.2010 в 17:31.
Sensizu вне форума Ответить с цитированием
Старый 01.02.2010, 17:32   #8
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А почему вот тут :
Код:
TWinControl(web[w-1]).Parent:=PC;
идет присвоение родительского контрола PC, а не только созданной TabSheet ???
Ведь я так понял WebBrowser помещается на закладку ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 01.02.2010, 17:41   #9
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

Kotofff,
Код:
TWinControl(web[w-1]).Parent:=TabSheet[n-1];
Изменил. Работает. На счёт длинны табов Вы не в курсе как?
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });
Sensizu вне форума Ответить с цитированием
Старый 01.02.2010, 17:54   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вот так...
Код:
var
  Form1: TForm1;
  web: array of TWebBrowser;
  tb : array of TTabSheet;
  p: tpagecontrol;

procedure TForm1.FormCreate(Sender: TObject);
begin
 p:= tpagecontrol.Create(self);
 with p do begin
  p.Align:= alclient;
  parent:= panel1
 end;
 setlength(tb, 0);
 setlength(web, 0);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 setlength(tb, length(tb)+1);
 tb[length(tb)-1]:= TTabSheet.Create(self);
 with tb[length(tb)-1] do begin
  Caption:= inttostr(length(tb)-1);
  //height:= 165; width:= 300;
  Align:= alclient;
  tb[length(tb)-1].PageControl:= p;
 end;
 p.ActivePageIndex:= length(tb)-1;

 setlength(web, length(web)+1);
 web[length(web)-1]:= TWebBrowser.Create(self);
 with web[length(web)-1] do begin
  Align:= alclient;
  web[length(web)-1].Navigate('http://ya.ru')
 end;
 tb[length(tb)-1].InsertControl(web[length(web)-1]);
end;
Вложения
Тип файла: zip dinamyc.zip (1.3 Кб, 144 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие вкладки beemoto Общие вопросы Delphi 36 23.07.2009 23:19
Страшные Вкладки (C#/C++) Balizard Помощь студентам 1 05.05.2009 06:49
Вкладки в браузере russian-stalker Общие вопросы Delphi 5 07.09.2008 15:04
Создание вкладки. фЁдОр Общие вопросы Delphi 10 11.02.2008 16:27
Вкладки Каштанка Компоненты Delphi 1 02.05.2007 11:01