Autor |
Beitrag |
Arakis
      
Beiträge: 344
|
Verfasst: Mi 12.06.02 14:33
Hallo, in diesen Tutorial möchte ich euch zeigen, wie man in Dephi ganz einfach einen Browser erstellt. Ist im Prinzip recht simpel, die einzigste Schwierigkeit besteht darin, den Aufruf eines neuesn Browserfensters abzufangen und die neue Seite im eigenen Browser zu behalten. Ich habe mich hier für eine TabSheet-Browser entschieden.
Wir benötigen
- 2 Buttons
- 1 Edit
- und ein Pagecontrol ohne Tabsheets draf.
Zusätzlich müssen die Units OleCtrls und SHDocVw eingebunden werden.
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: 27: 28: 29: 30:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, OleCtrls, SHDocVw;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; PageControl1: TPageControl; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); private public procedure NewWindow(Sender: TObject;var ppDisp: IDispatch; var Cancel: WordBool); end;
var Form1: TForm1;
implementation
{$R *.dfm} |
Mit dem Klick auf den ersten Button soll ein neues Tabsheet mit einer Browserkomponente erstellt werden:
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:
| procedure TForm1.Button1Click(Sender: TObject); var NewTab : TTabSheet; NewWeb : TWebBrowser;begin NewTab:= TTabSheet.Create(Form1.PageControl1); NewTab.Visible := True; NewTab.Caption := 'Neue Seite'; NewTab.PageControl := Form1.PageControl1; Form1.PageControl1.ActivePage:= NewTab; NewWeb:=TWebBrowser.Create(NewTab); TWinControl(NewWeb).parent := NewTab; NewWeb.Align:= alClient; NewWeb.OnNewWindow2:= NewWindow; NewWeb.Visible := True; end; |
Damit der frisch erstellte TWebbrowser auch eine Seite anzuzeigen hat, proggen wir eben kurz den zweiten Button:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button2Click(Sender: TObject); begin (PageControl1.ActivePage.Controls[0] as TWebBrowser).Navigate(Edit1.Text); end; |
Die Zeile sieht ein wenig kompliziert aus, aber letzt endlich wird damit einfach die Brower-Komponente angesprochen. Die Methode Navigate() ist dafür zuständig, das jetzt gesuft wird.
Jetzt das schwierigste(wenn man es weiß natürlch nicht mehr):
Wenn z.B. ein PopUp-Fenster geöffnet wird, soll nicht ein Microsoft Internet-Explorer starten, sondern es soll ein neuer Tabsheet mit neuen Browser angelget werden. Dafür ist die Methode NewWindow() zuständig. Leider gibt uns diese Methode keine Auskunft darüber, welche URL aufgerufen wurde. Dies ist kein Bug von Borland, sondern Microsoft verheimlicht dieses. Die werden ihre Gründe haben...
Über einen Trick geht es aber trotzdem:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.NewWindow(Sender: TObject;var ppDisp: IDispatch; var Cancel: WordBool); var Tabsheet: TTabsheet; Browser: TWebBrowser; begin Form1.Button1Click(nil); TabSheet:= Form1.PageControl1.ActivePage; ppDisp:= (PageControl1.ActivePage.Controls[0] as TWebBrowser).DefaultInterface; end; |
Mit Button1Click(nil) wird ein neuer Tabsheet erstellt, die nächste Zeile macht dieses zu aktiven Seite. Der wichtigste Befehl ist hier der letzte.
Damit das Programm direkt beim starten auch schon was zu tun bekommt, emulieren wir hier den Button1- und 2-Klick. Vorraussetzung ist natürlich, dass im Editfeld standartmäßig eine URL eingetragen ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormActivate(Sender: TObject); begin Form1.Button1Click(nil); Form1.Button2Click(nil); end;
end. |
Fertig ist der Browser. Kleiner Tipp: mit Shift und gleichzeitigem Klicken auf einen Link versucht der Internet-Explorer immer, den Link im neuen Fenster zu öffnen.
Für die, die keine Lust am puzzeln haben, gibt es das oben genannte Beispiel als ZIP-Datei:
dateien.desk-work.de...tabsheetbrowser1.zip 3,21 KB
Falls jemand Fragen hat, der kann die gerne posten.
Nachtrag: Vielen dank an Highbam aus dem alten DF, dieses Beispiel hatte ich noch aus seiner FAQ
Ein weiterer Teil folgt in Kürze
Bis dann

_________________ Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
Zuletzt bearbeitet von Arakis am Fr 14.06.02 09:00, insgesamt 1-mal bearbeitet
|
|
CB
      
Beiträge: 23
|
Verfasst: Fr 14.06.02 09:00
Du solltest vielleicht noch erwähnen, dass das natürlich kein eigenständiger Browser ist, sondern die TWebBrowser Komponente nur per ActiveX ein Internet Explorer Fenster in die eigene Applikation einbindet.
D.h., dass der Benutzer auf jedenfall die Version 3.0 oder höher des IEs installiert haben muss. Des weiteren hängt es von den IE Einstellungen ab, ob z.B. JavaScripts, etc. ausgeführt werden oder nicht.
_________________ mfg\CB
|
|
Chatfix
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: So 22.09.02 14:48
wenn mein browser eine seite mit einem formular aufruft kann ich kein enter in enem memo-feld drücken, also es passiert kein zeilen umbruch wenn ich drücke.. woran kann das liegen?
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Arakis 
      
Beiträge: 344
|
Verfasst: So 22.09.02 14:53
Hi Chatfix  ,
dazu musst du folgenden Code am ende des Quelltextes einfügen: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| {...}
initialization OleInitialize(nil);
finalization OleUninitialize;
end. |
Bis dann

_________________ Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
|
|
Chatfix
      
Beiträge: 1583
Erhaltene Danke: 10
Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
|
Verfasst: So 22.09.02 14:56
das habe ich schon es geht trotzdem nicht.... ich habe diese zeien eingefügt damit z.B. Copy usw geht, aber enter kann ich trotzdem nciht drücken...
_________________ Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
|
|
Cyberbob
      
Beiträge: 38
|
Verfasst: Sa 19.10.02 13:19
hmm... diese Unit hier : SHDocVw
die wird nciht gefunden beim compilieren. Wo finde ich die bzw, muss ich die runterladen?? (hab Delphi 6, die version aus dem i-net)
_________________ Cyberb:)b
|
|
Arakis 
      
Beiträge: 344
|
Verfasst: Sa 19.10.02 14:48
Chatfix hat folgendes geschrieben: | das habe ich schon es geht trotzdem nicht.... ich habe diese zeien eingefügt damit z.B. Copy usw geht, aber enter kann ich trotzdem nciht drücken... |
Die Enter-Taste zu aktivieren ist ein bisschen komplizierter, darum hab ich es weggelassen. Außerdem kapier ich den Quelltext dazu nämlich nicht. Aber so wie in diesem Beispiel sollte ein TWebbrowser mit Enter funzen:
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw_TLB, ActiveX, StdCtrls;
type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; Button2: TButton; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } FOleInPlaceActiveObject: IOleInPlaceActiveObject; procedure MsgHandler(var Msg: TMsg; var Handled: Boolean); public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormDestroy(Sender: TObject); begin FOleInPlaceActiveObject := nil; end;
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := MsgHandler; end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean); var iOIPAO: IOleInPlaceActiveObject; Dispatch: IDispatch; begin { exit if we don't get back a webbrowser object } if (WebBrowser1 = nil) then begin Handled := False; Exit; end;
Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
if (Handled) and (not WebBrowser1.Busy) then begin if FOleInPlaceActiveObject = nil then begin Dispatch := WebBrowser1.Application; if Dispatch <> nil then begin Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO); if iOIPAO <> nil then FOleInPlaceActiveObject := iOIPAO; end; end;
if FOleInPlaceActiveObject <> nil then if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then //nothing - do not pass on Backspace, Left or Right arrows else FOleInPlaceActiveObject.TranslateAccelerator(Msg); end; end; |
Die Originalquelle dazu findet sich unter www.swissdelphicente...showcode.php?id=1055
Bis dann

_________________ Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
|
|
Tomekk
Hält's aus hier
Beiträge: 11
Windows,(bisschen Linux)
Delphi4
|
Verfasst: Do 20.02.03 18:00
Titel: html quelltext
Ja dieses unglaubliche Activex dings ist schon toll!
Aber ist es möglich den Quelltext der aufgerufenen html seite im Programm zu benutzen? so als wenn man im IE rechts klickt und dann auf quelltext geht? Ich hab schon alles mögliche Versucht z.B. gettextbuf und gettextlen (wobei ich immer noch nicht weiß wofür das gut ist) aber ich habs einfach nicht hingekriegt! Hab auch schon im Internet nach einer Beschreibung der einzelnen Funktionen der Komponente gesucht aber nichts gefunden! Wäre net wenn ihr mir weiterhelfen könntet!
|
|
Arakis 
      
Beiträge: 344
|
Verfasst: Do 20.02.03 18:22
Das geht recht einfach. Ich hab grad leider nur Delphi 6 Personal zur Hand, kann also nix selber ausprobieren. TWebBrowser.Document hat das Interface IHTMLDocument2 implementiert, was dir zugriff auf sämtliche HTML-Elemente gibt. Auch den HTML-Quelltext:
Quelltext 1:
| (WebBrowser.Document as IHTMLDocument2).innerHTML |
Dazu musst du aber erst glaub ich die Unit mshtml einbinden(geht nicht bei der Delphi Personal-Version).
Hier zwei recht hilfreiche Seiten:
www.dataweb.de/artic...g/mshtmlediting.html (Designmode des IE)
www.euromind.com/iedelphi/ (Ein muss für jeden TWebBroser-Nutzer)
Bis dann

_________________ Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
|
|
Tomekk
Hält's aus hier
Beiträge: 11
Windows,(bisschen Linux)
Delphi4
|
Verfasst: Fr 21.02.03 08:32
Na toll! Wo soll ich als kleiner armer Schüler den jetzt delphi professional herkriegen? Trotzdem danke für den hilfe! Kann man nicht vieleicht die mshtml.dll direkt benutzen?
|
|
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 18.08.03 22:40
Cyberbob hat folgendes geschrieben: | hmm... diese Unit hier : SHDocVw
die wird nciht gefunden beim compilieren. Wo finde ich die bzw, muss ich die runterladen ?? (hab Delphi 6, die version aus dem i-net)
Cyverb b |
hmm, ich habe auch das gleiche Problem, und ich konnte es leider auch nicht lösen, also schließe ich mich Cyberbob an.
Hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Roy
      
Beiträge: 184
Windows7 Ultimate
Delphi 2007, NET, Embarcadero
|
Verfasst: Fr 23.05.14 20:44
Wie kann ich einen Tab schließen
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Fr 23.05.14 22:51
Hi Roy, das Datum hast Du aber schon gesehen von dem Tutorial?
Um den aktiven Tab zu schließen, mach einen neuen Button auf die Form und in den Event schreibst Du dann rein:
Delphi-Quelltext 1:
| pagecontrol1.activepage.free; |
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
|