![]() |
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:
Ist es möglich den bereits vorhandenen Button zu "kopieren" anstatt einen neuen zur Laufzeit zu erstellen?
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; 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? |
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. :) |
Re: Problem mit zur Laufzeit erstelltem Button
Du kannst auch deinen Button per Parent setzen wenn das reicht.
Button.Parent:=AktuellesTabSheet; |
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: ![]() Freundliche Grüße vom marabu |
Re: Problem mit zur Laufzeit erstelltem Button
Danke schon einmal für die Infos
Zitat:
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; |
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 |
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: |
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:
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.
procedure TDemoForm.WebBrowserDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant); begin with pDisp as IWebBrowser2 do PageControl.ActivePage.Caption := LocationName; end; 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