Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit zur Laufzeit erstelltem Button (https://www.delphipraxis.net/91358-problem-mit-zur-laufzeit-erstelltem-button.html)

Fox80 3. Mai 2007 23:51


Problem mit zur Laufzeit erstelltem Button
 
Hi,

ich möchte in meinem zur Laufzeit erstellten Tabsheet mittels Button das Tabsheet wieder schließen.

folgenden Code habe ich:

Delphi-Quellcode:
procedure THauptseite.closeButtonClick(Sender: TObject);
begin
  if navpagecontrol.ActivePageIndex > 0 then NavPageControl.ActivePage.Free;
end;

// target_new
procedure THauptseite.WebBrowserNewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
  TabSheet: TTabSheet;
  Web: TWebbrowser;
  newNav: TPanel;
  closeTabButton: TButton;
begin
  TabSheet := TTabSheet.Create(NavPageControl);
  TabSheet.PageControl := NavPageControl;
  newNav := TPanel.Create(TabSheet);
  newNav.parent := TabSheet;
  with newNav do begin
    height := 30;
    align := altop;
  end;
  closeTabButton := TButton.Create(newNav);
  closeTabButton.Parent := newNav;
  with closeTabButton do begin
    caption := 'closeTab';
    width := 60;
    height := 20;
    top := 5;
  end;
  CloseTabButton.OnClick := closeButtonClick;
  Web := TWebBrowser.Create(TabSheet);
  Web := TWebbrowser.CreateParented(TabSheet.Handle);
  TabSheet.InsertControl(Web);
  Web.Align := alClient;
  Web.OnNewWindow2 := WebbrowserNewWindow2;
  NavPageControl.ActivePageIndex := NavPageControl.PageCount-1;
  ppDisp := Web.DefaultDispatch;

end;
Ist es möglich den bereits vorhandenen Button zu "kopieren" anstatt einen neuen zur Laufzeit zu erstellen?
Ich würde auch gerne die "vor/zurück/aktualsieren" Buttons des "echten" Webbrowsers nutzen/kopieren, so daß sie auch nur im aktiven tabsheet arbeiten.

Zweite Frage: wie bekomme ich nun noch den neuen Locationname in die Tabsheet.caption des neu erzeugten Fensters?

chaosben 4. Mai 2007 05:29

Re: Problem mit zur Laufzeit erstelltem Button
 
Hi Fox80!

Das "Kopieren" wird nicht so einfach möglich sein. So wie du es jetzt machst, ist das ganz ok.
Die Vor/Zurück/Refresh Aktionen kannst du auch mit einem eigenen Button auslösen. Einfach einen dynamisch erstellen und onClick die entsprechende Aktion ausführen.

Folgendes Leak solltest du noch beheben:
Delphi-Quellcode:
Web := TWebBrowser.Create(TabSheet); //Dieser Webbrowser wird wahrscheinlich nie freigegeben werden
Web := TWebbrowser.CreateParented(TabSheet.Handle);

PS:
Das Ganze kann man auch schön mit einem Frame lösen.
Du erstellst dir einen Frame der ein Webbrowser-Control und alle zugehörigen Buttons enthält. Den Code dafür schreibst du auch gleich in den Frame.
Und wenn ein neuer Tab geöffnet werden soll, erzeugst du einfach einen neuen Frame in diesem Tabsheet. Ist einfach und spart viel Arbeit. :)

Blackheart 4. Mai 2007 06:37

Re: Problem mit zur Laufzeit erstelltem Button
 
Du kannst auch deinen Button per Parent setzen wenn das reicht.
Button.Parent:=AktuellesTabSheet;

marabu 4. Mai 2007 06:38

Re: Problem mit zur Laufzeit erstelltem Button
 
Herzlich willkommen in der Delphi-PRAXiS, Fox80.

Anstelle einzelne Buttons für jedes TabSheet vorzusehen würde ich eine Symbolleiste (ToolBar) verwenden, deren Actions auf das jeweils aktuelle TabSheet wirken.

Für dein Problem mit der Anzeige der Location findest du vielleicht hier eine Anregung: klick

Freundliche Grüße vom marabu

Fox80 4. Mai 2007 10:46

Re: Problem mit zur Laufzeit erstelltem Button
 
Danke schon einmal für die Infos

Zitat:

Zitat von marabu
Für dein Problem mit der Anzeige der Location findest du vielleicht hier eine Anregung: klick

Freundliche Grüße vom marabu

nunja, soweit war ich schon einmal - allerdings wird dann jeder Caption in den neuen Tabsheets der Locationname vom 1ten Browser gegeben

Delphi-Quellcode:
procedure THauptseite.WebBrowserNewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
  TabSheet: TTabSheet;
  newNav: TPanel;
  closeTabButton: TButton;
  Web: TWebbrowser;
begin
  TabSheet := TTabSheet.Create(NavPageControl);
  TabSheet.PageControl := NavPageControl;
...

  Web.OnNewWindow2 := WebbrowserNewWindow2;
  Web.OnBeforeNavigate2 := WebbrowserBeforeNavigate2;

...

end;
Delphi-Quellcode:
procedure THauptseite.WebBrowserBeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  NavPageControl.ActivePage.Caption := Webbrowser.LocationName;
end;

marabu 4. Mai 2007 11:50

Re: Problem mit zur Laufzeit erstelltem Button
 
Hast du den Unterschied bemerkt? Ich verwende den URL aus dem Event anstelle von Location. Da ich nicht unbedingt alle Parameter aus dem URL in der Caption sehen möchte, zerlege ich den URL zuerst in seine Bestandteile und baue mir die Anzeige dann nach Bedarf zusammen.

Freundliche Grüße

Fox80 4. Mai 2007 22:02

Re: Problem mit zur Laufzeit erstelltem Button
 
gesehen schon, allerdings möchte ich wie gesagt den Locationname, nicht die URL sehen ;)
muss ja irgendwie möglich sein auf dem zur laufzeit erstellten webbrowser das in die caption zu bekommen :gruebel:

marabu 5. Mai 2007 13:47

Re: Problem mit zur Laufzeit erstelltem Button
 
Hallo,

der URL steht vor dem Laden des HTML-Dokuments fest, der LocationName (TITLE) erst hinterher:

Delphi-Quellcode:
procedure TDemoForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  with pDisp as IWebBrowser2 do
    PageControl.ActivePage.Caption := LocationName;
end;
Wenn jede Instanz von TWebBrowser diesen event handler benutzt, dann sparst du dir das Suchen nach dem WebBrowser auf der ActivePage. Bei Webseiten mit Frames kann man das noch etwas verfeinern, damit der Title nicht n-mal ausgewertet wird.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz