Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zur Laufzeit erzeugter TWebbrowser navigiert nicht


Gerhard_S - Mi 18.09.13 22:30
Titel: Zur Laufzeit erzeugter TWebbrowser navigiert nicht
Hallo,
folgender Code sollte es tun:

Delphi-Quelltext
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:
uses SHDocVw;
...
procedure TForm1.TabSheetPlusShow(Sender: TObject);
var WB1: TWebBrowser; NewTab: TTabSheet;
begin
    Edit1.Text := 'http://www.wikipedia.de';
    PageControl1.ActivePage:= TabSheetPlus;
    try
    WB1 := TWebbrowser.Create(TabSheetPlus);
//  TabSheetPlus.InsertControl(WB1); //kein Unterschied zu folgendem zu sehen
    TControl(WB1).Parent := TabSheetPlus;
    WB1.Align := alClient;
    WB1.Visible := True;
    WB1.Navigate(Edit1.Text); //funktioniert nicht
    TabSheetPlus.Caption := Edit1.Text;
    PageControl1.ActivePage:= TabSheetPlus;
    //NewTab erzeugen funktioniert
    NewTab:= TTabSheet.Create(PageControl1);
    NewTab.Visible := True;
    NewTab.PageControl := Form1.PageControl1;
    NewTab.Caption := '   +  ';
  except
      WB1.Free;
      NewTab.Free;
  end;
end;

doch leider navigiert der WB nicht zum Ziel.
Eine Browserinstanz ist allerdings vorhanden, wie folgendes zeigt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject); //ausgeführt, wenn TabSheetPlus aktiv ist
var i : integer;
begin
 for i:=0 to PageControl1.ActivePage.ControlCount -1 do
    if PageControl1.ActivePage.Controls[i] is TWebbrowser then
      begin
       ShowMessage('Soso'); //wird angezeigt  
      end;
end;

Aber das hier funktioniert problemlos:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.FormCreate(Sender: TObject);
var WB: TWebbrowser;
begin
   WB := TWebbrowser.Create(TabSheet1);
   TControl(WB).Parent := TabSheet1;
   WB.Align := alClient;
   WB.Silent := True;
   WB.Visible := True;
   PageControl1.ActivePage := TabSheet1;
   Edit1.Text := 'http://www.google.de';
   WB.Navigate(Edit1.Text);
   TabSheet1.Caption := Edit1.Text;
end;

Woran kann dieses unterschiedliche Verhalten liegen?


Jakane - Do 19.09.13 10:26

mach mal das try-except weg, vielleicht wirft er ein Fehler und du siehst den blos nicht


Gerd Kayser - Do 19.09.13 10:41

user profile iconGerhard_S hat folgendes geschrieben Zum zitierten Posting springen:
Woran kann dieses unterschiedliche Verhalten liegen?

Mir fällt auf, dass die Reihenfolge von ActivePage und dem Navigate in beiden Sourcen unterschiedlich ist. Stell mal die beiden Zeilen um. Vielleicht liegt es daran.


baumina - Do 19.09.13 11:58

Lass diese Zeile weg, dann gehts :


Delphi-Quelltext
1:
// NewTab.Visible := True;                    


Gerhard_S - Do 19.09.13 14:08

So geht's mit der Anzeige der Website:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.TabSheetPlusShow(Sender: TObject);
var  NewWeb: TWebBrowser;
begin
   Edit1.Text := 'http://wikipedia.de';
   StatusBar1.Panels[0].Text := 'TabSheetPlus gewählt';
   NewWeb:=TWebBrowser.Create(TabSheetPlus);
   TWinControl(NewWeb).parent := TabSheetPlus;
   NewWeb.Align:= alClient;
   NewWeb.Visible := True;
   NewWeb.Navigate(Edit1.Text);
   TabSheetPlus.Caption := Edit1.Text;
end;

Wenn ich aber im gleichen Zug einen neuen Tab erzeugen will, zeigt der Cursor kurz das Aktivitätssymbol, das Tabsheet bleibt aber weiß. Langsam wird mir mulmig.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.TabSheetPlusShow(Sender: TObject);
var NewTab: TTabSheet;
    NewWeb: TWebBrowser;
begin
   Edit1.Text := 'http://wikipedia.de';
   StatusBar1.Panels[0].Text := 'TabSheetPlus gewählt';
   NewWeb:=TWebBrowser.Create(TabSheetPlus);
   TWinControl(NewWeb).parent := TabSheetPlus;
   NewWeb.Align:= alClient;
   NewWeb.Visible := True;
   NewWeb.Navigate(Edit1.Text);
   TabSheetPlus.Caption := Edit1.Text;
   NewTab:= TTabSheet.Create(Form1.PageControl1);
   TWinControl(NewTab).parent := Form1.PageControl1;
   NewTab.PageIndex := TabSheetPlus.PageIndex + 1;
   NewTab.PageControl := Form1.PageControl1;
   NewTab.Caption := '   +  ';
end;


baumina - Do 19.09.13 14:18

Das Ereignis OnShow des TTabSheets ist da sicher auch kein geeigneter Ort für solch Code.


Gerhard_S - Do 19.09.13 15:40

Welches andere Ereignis als "OnEnter" bietet sich denn an?
Das hier zeigt jedenfalls überhaupt keine Reaktion:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.TabSheetPlusEnter(Sender: TObject);
begin
ShowMessage('On Enter ');
end;

wobei ich für OnShow schon die funktionierende Kurzvariante nehme.


baumina - Do 19.09.13 15:48

Ins FormCreate vielleicht, aber ich hab keine Ahnung wann dein Programm das machen soll.


Gerhard_S - Do 19.09.13 15:59

Es soll so sein, wie im Firefox zu sehen:
Bei Klick auf das Plus-Tabsheet öffnet sich ein leeres Tabsheet (Caption: 'Neuer Tab'); außerdem wird ein neues Tabsheet mit + als Caption erzeugt.
Leider kann ich nicht erkennen, ob der Webbrowser auf dem leeren Tabsheet schon vorhanden ist oder ob er erst nach einer Eingabe in das Edit-Feld erzeugt wird.


baumina - Do 19.09.13 16:12

Ich habe kein Firefox, aber wie wäre es denn, wenn Du gleich zu Anfang 2 TabSheets machen würdest. Im 2. würde dann das "+" stehen (aber kein Webbrowser drauf haben), hier könntest du z.B. den Tag auf 1 stellen, damit du weisst, dass dieses ein neues Tabsheet ist. Im OnChange des TPageControls könntest du dann anhand des ActivePageIndexes schauen, ob dieses TabSheet den Tag=1 hat, wenn ja, Tag auf 0 setzen und deinen Code dazu (Webbrowser auf das aktive Tabsheet erzeugen) und Tag des neue erzeugten Tabsheets (ohne Webbrowser) wieder auf 1 setzen. Anstatt den Tag zu setzen, kannst auch einfach schauen, ob das aktive Tabsheet einen Webbrowser hat.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.PageControl1Change(Sender: TObject);
var NewTab: TTabSheet;
    NewWeb: TWebBrowser;
begin
  if PageControl1.ActivePage.Tag = 0 then
  begin
    Exit;
  end;

  PageControl1.ActivePage.Tag := 0;
  NewWeb:=TWebBrowser.Create(PageControl1.ActivePage);
  TWinControl(NewWeb).parent := PageControl1.ActivePage;
  NewWeb.Align:= alClient;
  NewWeb.Visible := True;
  NewWeb.Navigate('http://wikipedia.de');
  PageControl1.ActivePage.Caption := 'http://wikipedia.de';
  NewTab:= TTabSheet.Create(PageControl1);
  TWinControl(NewTab).parent := PageControl1;
  NewTab.PageControl := PageControl1;
  NewTab.Caption := '   +  ';
  NewTab.Tag := 1;
end;


Gerhard_S - Do 19.09.13 18:15

Danke, so geht's.