![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание TChromium [D7, D2005, XP]
Vlad © (2015-05-01 20:30:00)Здравствуйте.
Пробую динамически создавать Chromium следующим способом:
procedure TChromF.NewTab(num: integer);
var ts: TTabSheet; c: TChromium;
begin
ts := TTabSheet.Create(CF_PC);
ts.Name := 'ts'+IntToStr(num);
ts.PageControl := CF_PC;
c := TChromium.Create(CF_PC.Pages[num-1]);
c.Parent := CF_PC.Pages[num-1];
c.Align := alClient;
c.Name := 'c'+IntToStr(num);
end;
Создается вкладка( ts2 ) в списке компонентов которой есть c2 - TChromium( хотя на вид не ясно есть он или нет ). А при обращении к нему, например:
procedure TChromF.CF_URL_CBKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var cnum: integer; chm: tchromium;
begin
cnum := CF_PC.ActivePageIndex+1;
// по нажатию на Enter переходим по адресу
if Key=13 then begin
chm := TChromium(FindComponent('c'+IntToStr(cnum)));
chm.Load(CF_URL_CB.Text); end;
end;
На строке chm.Load происходит ошибка. Нашел в сети пример:
procedure TForm1.Button1Click(Sender: TObject);
var
NPageControl: TPageControl;
NTab: TTabSheet;
Chromium: TChromium;
i: integer;
begin
// if OpenDialog1.Execute then
begin
// создаем новый TabSheet
NTab := TTabSheet.Create(PageControl1);
with NTab do
begin
PageControl := PageControl1;
Caption := 'Закладка ' + IntToStr(PageControl1.Tag + 1);
Name := 'Page' + IntToStr(PageControl1.Tag);
end;
NPageControl := TPageControl.Create(NTab);
with NPageControl do
begin
Parent := NTab;
Align := alClient;
TabPosition:=tpLeft;
Name := 'PageControl' + IntToStr(PageControl1.Tag);
end;
for i := 0 to 0 do
begin
NTab := TTabSheet.Create(NPageControl);
with NTab do
begin
PageControl := NPageControl;
Name := 'Page' + IntToStr(i);
end;
end;
NPageControl.Pages[0].Caption:='виз';
Chromium := TChromium.Create(NPageControl.Pages[0]);
Chromium.Parent := NPageControl.Pages[0];
Chromium.Name := 'Chromium' + IntToStr(PageControl1.Tag);
Chromium.Align := alClient;
PageControl1.Tag := PageControl1.Tag + 1;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
Chm: TChromium;
begin
// if OpenDialog1.Execute then
begin
// Получаем индекс текущей вкладки
s := copy(PageControl1.Pages[PageControl1.ActivePageIndex].Name, 5,
Length(PageControl1.Pages[PageControl1.ActivePageIndex].Name) - 4);
Chm := (PageControl1.FindComponent('Page' + s).FindComponent('PageControl' + s).
FindComponent('Page0').FindComponent('Chromium' + s) as TChromium);
Chm.Load(Edit1.Text);
end;
end;
Проверил - работает, вкладки создаются и Chromium тоже. Вопрос в том, что за манипуляции такие делаются при нажатии на button1. Зачем там создается NpageControl, цикл вообще бессмысленный ( от 0 до 0 - 1 проход ведь всего). Но в любом случае этот код работает, а мой нет. Подскажите чего не происходит у меня при создании Chromium, что есть в этом коде
Ega23 (2015-05-05 11:24:00) [1]
> Правильно
> c := TChromium.Create(Self);
Может это у него такой хитромудрый аналог ассерта на то, чтобы ChromF как синглтон работала?
Хотя в целом - согласен.
icWasya (2015-05-05 11:10:00) [2]Правильно
c := TChromium.Create(Self);
Vlad (2015-05-02 10:05:00) [3]Ничего себе и правда, спасибо. Поменял строку
c := TChromium.Create(CF_PC.Pages[num-1]);
на
c := TChromium.Create(ChromF);
и все заработало.
Ega23 (2015-05-01 23:03:00) [4]Вдумчиво вглядываться лень, но на первый взгляд ты при создании Owner заем-то вкладку ставишь. А FindComponent - от формы идёт.