Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebBrowser auf Formular -> Formular wird nicht angezeigt (https://www.delphipraxis.net/102090-twebbrowser-auf-formular-formular-wird-nicht-angezeigt.html)

BOH 23. Okt 2007 11:33


TWebBrowser auf Formular -> Formular wird nicht angezeigt
 
Hallo Leute,

ich wende mich mit einem in meinen Augen mysteriösen Problem an Euch. Da es mit dem TWebBrowser zu tun hat, schreibe ich es in dieser Sparte. Sollte sich dies als nicht so passend herausstellen, bitte ich die Moderatoren um Verschiebung...

Ich pflege eine relativ umfangreiche Anwendung in Delphi 5 Professional (deutsch) mit Update. Betriebssystem ist Windows XP Professional (SP2). Diese Anwendung habe ich übernommen. Soll heissen, ich bin nicht der ursprüngliche Autor. Knapp 500.000 Codezeilen, über 350 Formulare.

Neueste Anforderung ist ein Webbrowser. Und genau hier taucht das Problem auf:

Zunächst habe ich ein neues Formular erstellt, Button drauf, TWebBrowser drauf, fertig. Doch beim Aufruf des Formulares wird nur noch der WebBrowser samt Inhalt, nicht aber das Forumlar angezeigt. Der Button also auch nicht.

Dann habe ich testweise ein bereits bestehendes Formular genommen, dort einen TWebBrowser platziert, mit gleichem Ergebnis. Dieses Phänomen konnte ich bisher bei allen bestehenden Formularen feststellen, die ich stichprobenartig ausgewählt habe.

Nehme ich eine andere bestehende Anwendung oder erstelle eine neue Anwendung, funktioniert es ohne Probleme...

Was kann das nun sein, daß ein TWebBrowser bei gerade dieser einen Anwendung ein solches Verhalten auslöst? :gruebel:

Ich zähle auf Euch :thumb:

stahli 23. Okt 2007 11:56

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Und wenn Du ausdrücklich Form.Refresh aufrufst?
Wírd OnActivate behandelt?

BOH 23. Okt 2007 12:05

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Danke Stahli,

aber ein Refresh bewirkt nichts. OnActivate wird allerdings nicht ausgelöst... :|

EDIT:
Nehme ich den TWebBrowswer wieder weg, wird auch OnActivate ausgelöst... :?

stahli 23. Okt 2007 12:28

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Ist vielleicht so eine SUPER Unit wie die VCLFlickerReduce von jbg eingebunden?
Die funktioniert zwar i.d.R. perfekt, kann aber auch mal Nebenwirkungen haben...

stahli

BOH 23. Okt 2007 12:34

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Nein, nichts dergleichen... :cry:

stahli 23. Okt 2007 14:39

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
setz doch mal testweise den Webbrowser auf ein Panel...

BOH 23. Okt 2007 14:45

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Gesagt, getan. Leider gleiches Ergebnis. Der WebBrowser wird angezeigt, sonst nichts. Panel auch nicht. Hab es auch grad noch mit nem PageControl versucht: auch nichts... :cry:

Ich versteh das absolut nicht. Es ist nur in dem einen Projekt so. Sonst klappt es wie es soll. Kann man ja auch (eigentlich) nichts falsch dran machen... :|

stahli 23. Okt 2007 16:10

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Standard-Webbrowser mit Standard-Einstellungen ohne geladenes Dokument - dann auch?
Lade doch mal ein Screencopy hoch...

Ich würde mal noch die anderen Formularereignisse durchtesten, incl. MouseOver etc.
Vielleicht ergibt sich daraus etwas.

stahli

shmia 23. Okt 2007 17:23

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Versuche folgendes:
1.) das Formular in den Projektoptionen automatisch erzeugen lassen und ganz nach vorne schieben
Dann sieht die Projektdatei ungefähr so aus:
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.CreateForm(TBrowserTestform, BrowserTestform); // das Testformular ist jetzt das 1. das erzeugt wird
  BrowserTestform.ShowModal;  // von Hand dazu
  Application.CreateForm(TForm0815, Form0815);
  ....
  Application.run;
2.) Testen
die weitere Vorgehensweise hängt davon ab, ob der WebBrowser auf TBrowserTestform jetzt korrekt dargestellt wird.
Falls nein: Weitersuchen in allen initialization-Abschnitten
Falls ja: Den Aufruf von BrowserTestform.ShowModal suksessive nach hinten verschieben, bis Problem wieder auftaucht

stahli 23. Okt 2007 17:30

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Ich weiß nicht, was es heißt...
http://support.microsoft.com/kb/306719/de
...aber etwas wird es schon sein :gruebel:

such mal im Forum nach "AlphaBlend", ob Dir da was weiterhilft!?


stahli

BOH 24. Okt 2007 10:40

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Sorry, hat etwas länger gedauert, bis ich mich dem Problem wieder widmen konnte...

Zitat:

Zitat von stahli
Standard-Webbrowser mit Standard-Einstellungen ohne geladenes Dokument - dann auch?
Lade doch mal ein Screencopy hoch...

Ich würde mal noch die anderen Formularereignisse durchtesten, incl. MouseOver etc.
Vielleicht ergibt sich daraus etwas.

stahli

@stahli
Wenn Du mit Standard-Webbrowser meinst, daß ich ihn einfach unverändert aufs Formular lege, dann ist es Standard, ja. Und es passiert dann auch. Neues Formular ohne Veränderungen, neuen Webbrowswer ohne Veränderungen, auch wenn keine Seite geladen wird: boing... Und ein Screenshot bringt nicht wirklich etwas. Es zeigt lediglich ein weißes Rechteck in der eingestellten Größe 150*300 :|

Das mit dem "AlphaBlend" versuch ich auch mal...


Zitat:

Zitat von shmia
Versuche folgendes:
1.) das Formular in den Projektoptionen automatisch erzeugen lassen und ganz nach vorne schieben
Dann sieht die Projektdatei ungefähr so aus:
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.CreateForm(TBrowserTestform, BrowserTestform); // das Testformular ist jetzt das 1. das erzeugt wird
  BrowserTestform.ShowModal;  // von Hand dazu
  Application.CreateForm(TForm0815, Form0815);
  ....
  Application.run;

@shmia
Sobald ich das mache, erhalte ich einen EOleError. Schiebe ich das Create weiter nach hinten, kommt noch ein RuntimeError hinzu. :?

stahli 24. Okt 2007 10:52

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Hast Du den Webbrowser auch mal testweise auf das MainForm gesetzt?
Versuchsweise kannst Du auch mal alle anderen Formulare nicht automatisch erzeugen lassen (aus Projektoptionen entfernen)...
Gibt es ein Splash-Formular, das vielleicht irgendwelche Transparent-Funktionen nutzt?

BOH 24. Okt 2007 10:57

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Ja, hab ich: EOleError und RunTimeError. Splashscreen gibt es keinen und Transparentfunktionen werden nciht genutzt. Ehrlich gesagt, hab ich das auch mit Delphi 5 noch nie ausprobiert.

BOH 24. Okt 2007 11:45

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Dies ist kein Pushen, ich hab nur eine Lösung gefunden: :dancer:

Angeregt durch shmias Vorschlag, mit Verschieben des CreateForm zu experimentieren, gemischt mit einem Ohnmachtsgefühl und dem Wissen, daß nichts in der EDV so blöd sein kann, daß man es nicht einfach mal ausprobieren sollte :zwinker: , habe ich das Formular in der Uses-Klausel des Projektes mal testweise ganz nach oben gestellt:

Delphi-Quellcode:
program Anwendungsname;

uses
  BrowserTestform in 'BrowserTestform.pas', //<= an erster Stelle eingefügt
.
.
.
 
begin
  Application.Initialize;
.
.
.
  Application.Run;
end.
Und obwohl ich nicht gedacht hätte, daß das Erfolg haben könnte (da ich mir das nicht erklären kann), hat es funktioniert... :mrgreen:

Vielen dank an stahli und shmia, ihr habt mir gute Tipps gegeben, wie ich weiter testen kann, um den Fehler zu finden :dp:


Kann mir das denn einer erklären, woran es liegen kann, daß es eine Rolle spielt, an welcher Stelle das Formular in der Uses-Klausel steht...?! :gruebel:


Nachtrag:
Zu früh gefreut :cry:

Es funktioniert auch nur wenn ich das Formular an erster Stelle einfüge, ansonsten nicht. Dann allerdings bekomme ich beim Beenden der Anwendung regelmäßig einen Runtime-Error... :wall:

stahli 24. Okt 2007 12:12

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Ich würde in der Programmunit nicht unbedingt von Hand etwas ändern. Ich habe das nur mal wegen einem Spashscreen gemacht.

Hast Du Dir mal die Projektoptionen angesehen (automatisch erzeugte / verfügbare Formulare)?

Vielleicht bindet doch eine von Dir benutzte Unit wiederum eine Unit ein, die so einen Effekt mit sich bringt (ähnlich der FlickerReduce...)?

BOH 24. Okt 2007 12:28

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Es werden drei Datenmodule und das Mainform automatisch erzeugt. Wenn ich das nicht so lasse, startet garnichts mehr.

So eine Unit hab ich bisher noch nicht finden können... :|


Noch'n Nachtrag:

Nun hab ich, trotz anderer Empfehlung von stahli :zwinker: , die ganzen (laut Icarus "Modules that are referenced in the Delphi project file, but not used:") unnützen Einträge in der Programmunit auskommentiert. Scheint nun tatsächlich zu funktionieren. Auch ohne Runtimeerror 217 am Ende. *aufholzklopf*.

Vielleicht wurde das doch einfach mal zuviel, daß dort über 350 automatische Einträge enthalten waren...?! :?

stahli 24. Okt 2007 13:09

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Hallo BOH,

freut mich für Dich :-D

Allerdings hast Du vielleicht den von mir gewünschten Original-Zustand der Programmunit wieder hergestellt...!?
Delphi erzeugt die ja normalerweise selbst und unnütze Einträge sollten dort eigentlich nicht drin stehen. :zwinker:
Ich würde die wirklich nur in Ausnahmefällen mal manipulieren (und ganz vorsichtig).

stahli

BOH 24. Okt 2007 13:20

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Danke stahli :thumb:

Delphi erzeugt ja für jedes Formular solch einen Eintrag

Delphi-Quellcode:
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
..., scheint diese aber nicht wirklich zu benötigen. Außer für die automatisch erzeugten Formulare. Nun hab ich alle Einträge, bis auf die vier autom. erzeugten, gelöscht und es scheint auf den ersten Blick alles wie gewünscht zu laufen.

Laut Icarus werden diese nicht benutzt. Das hatte mich dazu veranlaßt, sie mal auszukommentieren. Bisher haben sie ja auch nicht gestört. Nur beim TWebBrowser halt. Möglicherweise wirklich zuviele Einträge. Warum auch immer... :|

Besten Dank, an Euch beide, für die geduldige Hilfe :thumb:

Kevin 24. Okt 2007 18:07

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Schön und gut, aber Du wirst dann kein Formular mehr so einfach zum Bearbeiten aufrufen können, da es dem Projekt nicht mehr zugeordnet ist. :???:

BOH 25. Okt 2007 12:32

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Danke Kevin, mittlerweile bin ich nochmals einen großen Schritt weiter.

Es gibt eine Unit, die als erste in der Projektdatei steht. Sobald diese aktiviert ist, kann ich den TWebbrowser vergessen und mein o.g. Problem taucht wieder auf. Deaktiviere ich sie, hab ich das Problem nicht.

Es handelt sich um folgende Unit:

Delphi-Quellcode:
unit _ComInit;

interface

uses
  ActiveX;

implementation

initialization
  CoInitializeEx(nil,COINIT_MULTITHREADED);
finalization
  CoUninitialize;
end.
Kann mir jemand sagen wofür diese gebraucht werden könnte, damit ich gezielt nachschauen kann, ob sie auch wirklich noch benötigt wird..?!

Kevin 26. Okt 2007 10:05

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
Hallo BOH,

ich hab über die Suche folgenden Thread gefunden: ComInit

Vielleicht hilft Dir das weiter. Es wird behauptet, daß diese Unit bei VCL-Anwendungen nicht benötigt wird. Kann das hier jemand bestätigen?

BOH 30. Okt 2007 09:36

Re: TWebBrowser auf Formular -> Formular wird nicht angez
 
So, da bin mal wieder :wink:

Ich denke, ich hab das Problem nun eingegrenzt und wohl auch gelöst. Dank an alle, die geholfen haben :thumb:

Der Übeltäter war tatsächlich die o.a. Unit "ComInit". Wenn ich sie aus dem Projekt entferne, kann ich den TWebBrowser ohne Probleme einsetzen. Sobald sie wieder eingefügt wird, treten o.g. Probleme auf.

Ohne ComInit wurden aber Threads, in denen Winword genutzt wurde, nicht richtig oder garnicht ausgeführt. Wenn ich Winword nicht innerhalb eines Threads anspreche, gibt es keine Probleme.

Eine Suche im Forum brachte folgenden Vorschlag hervor:

Einfügen von
Delphi-Quellcode:
initialization
  CoInitializeEx(nil,COINIT_MULTITHREADED);
finalization
  CoUninitialize;
Brachte mich leider nicht weiter. Hab's versucht im MainForm unterzubringen oder auch im Formular, wo der Thread untergebracht war. Auch im Constructor/Destructor. Keine Besserung. Vielleicht hab ich es auch nicht richtig verstanden. Bin für Hilfe weiterhin dankbar.

Erst als ich "CoInitializeEx" am Anfang und "CoUninitialize" am Ende von Thread.Execute eingefügt habe, klappte alles soweit problemlos.

Werde nun erstmal die Funktionen umschreiben und hoffe, daß nun wieder alles einwandfrei läuft.


Falls jemand noch Anmerkungen zu CoInitializeEx und Konsorten hat, auch wo sie am besten platziert werden sollten, immer her damit. Denn so wirklich verstanden hab ich das noch nicht :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:01 Uhr.

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