![]() |
Name der geladenen Datei in einem Frame herausbekommen
Hallo Wissende!
Ich stehe vor dem Problem, dass ich unbedingt herausfinden muss, in welchem Frame eines Webbrowsers sich welche geladene Datei befindet. Ich habe schon einiges versucht, komme aber einfach nicht auf den richtigen Trichter. Das Problem schaint auch zu sein, dass ich mit verschachtelten Frames arbeite. Ich würde mich über Ideen und Anregunden freuen... |
Re: Name der geladenen Datei in einem Frame herausbekommen
Hallo Tom,
wie du an das Dokument in einem verschachtelten Frame heran kommst, weißt du ja schon:
Delphi-Quellcode:
Die Funktion GetFrameDoc() findet man sicher über die Suche in der DP. Den URL der im Frame geladenen Datei erhältst du dann so:
function GetDeepFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var win: IHTMLWindow2; u: IUnknown; i, lb, ub: Integer; begin if VarType(v) and varArray <> 0 then begin lb := VarArrayLowBound(v, 1); ub := VarArrayHighBound(v, 1); for i := lb to ub do begin Result := GetFrameDoc(doc, v[i]); doc := Result; end end else Result := GetFrameDoc(doc, v) end;
Delphi-Quellcode:
Freundliche Grüße vom marabu
function DocumentUrl(doc: IHTMLDocument2): String;
begin if Assigned(doc) then Result := doc.parentWindow.location.href else Result := ''; end; |
Re: Name der geladenen Datei in einem Frame herausbekommen
Hallo Marabu und Ihr anderen Wissenden,
ich habe nun einige Wochen versucht das Problem, welches ich immer noch damit habe, vor mir herzuschieben, oder einfach irgendwie zu umgehen, aber es fällt mir leider immer wieder auf die Füsse. Wenn ich meine Applikation starte, werden aus Externen Dateien XML-Dateien generiert. Eigentlich soll das Programm schon beim Createn Seiten laden und dann bei OnShow die neu Creierten Seiten anzeigen. Ich habe eine Routine, die mir für ein Frame eine bestimmte XML-Datei erzeugt. Wenn diese Datei sich in dem Frame befindet und neu erstellt wurde, möchte ich dies natürlich Updaten. Folgendes mache ich beim Erzeugen dieser Datei:
Delphi-Quellcode:
Das Problem ist, dass ich immer wieder die Fehlermeldung erhalte, dass dieses Member nicht gefunden wurde. Das rührt sicher daher, dass diese Prüfung schon passiert, wenn der Webbrowser noch gar nicht fertig ist mit dem Laden der Datei.
//listenvergleich = bei unterschiedlichen listen, soll die linkliste im ON geupdatet werden
if XML_List.CommaText <> XML_File_Is.CommaText then //webbrowser war schon einmal fertig mit dem anzeigen der kompletten seite if FirstRunOver then //hier scheint das problem zu sein....denn dort geht er nicht rein //oder er findet den member nicht if (GetDeepDocURL('main_left')='lscore_left.xml') then //navy_live geladen begin //ShowMessage('links wurd lscore_left.xml gefunden'); UpdateNavyXML(MatchID,XML_List.text); CreateHistoryMainXML; end; Also habe ich im Webbrowser folgendes gemacht:
Delphi-Quellcode:
Hast Du vielleicht noch einen Tipp???
procedure TForm1.web_cisDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant); begin if pDisp = web_cis.DefaultInterface then begin LockWindowUpdate(0); LogFile.Add(DateTimeToStr(now)+ ' - file was loaded : ' + URL); FirstRunOver:=True; //boolsche variable, die von der anderen routine ausgelesen wird end; end; |
Re: Name der geladenen Datei in einem Frame herausbekommen
Hallo Tom,
deinen Verdacht kannst du bestimmt per Debugger erhärten. Bei Zugriffen auf das DOM musst du allerdings immer (und nicht nur beim ersten Mal) das vollständige Laden abwarten. Insofern würde ich eine private Form-Variable "PageLoaded: Boolean" deklarieren und diese im OnBeforeNavigate2() auf False setzen, im OnDocumentComplete() auf True. Du schreibst, dass die Bedingung FirstRunOver nicht erfüllt war. Dein Code muss dann halt solange warten, bis die Bedingung erfüllt ist, sonst hat er ja erst bei der nächsten (zeitgesteuerten?) Datenaktualisierung wieder eine Chance ausgeführt zu werden. Bei deinem CommaText-Vergleich sollten die Inhalte normiert sein, sonst geht der schief - aber das nur am Rande. Gute Nacht marabu |
Re: Name der geladenen Datei in einem Frame herausbekommen
Hallo Achim,
danke für Deinen Tipp. Ich habe mich nun an das Ereignis OnBeforeNavigate der Webbrowser-Kompo gehangen und dabei folgendes gemacht, um einigermassen sicherzustellen, dass ich herausbekommen kann, auf welcher Seite ich gerade bin:
Delphi-Quellcode:
Damit habe ich in der Statusbar im ersten Panel die TopSeite stehen, im zweiten den Namen des im linken Frame geladenen Files usw. Damit komme ich schon mal klar. Folgendes werde ich nun noch machen, um es sauber hinzubekommen. PageLoaded so hinzufügen wie von Dir angeregt.
if (TargetFrameName = 'main') then
StatusBar1.Panels[0].Text:=ExtractFileName(url); if (TargetFrameName = 'main_left') then StatusBar1.Panels[1].Text:=ExtractFileName(url); if (TargetFrameName = 'main_right') then StatusBar1.Panels[2].Text:=ExtractFileName(url);
Delphi-Quellcode:
Darf ich noch fragen wie Du das mit dem Commatextvergleich gemeint hast? Die Listen sind einmal Privat und dann noch lokal und werden einfach verglichen, da sie sich nur ändern, wenn ein Livespiel beendet wird und der Navigationslink für eines der Spiele nicht mehr benötigt wird. Daher sollte dieser einfache Vergleich völlig ausreichen, danke ich.
if XML_List.CommaText <> XML_File_Is.CommaText then
if FirstRunOver and PageLoaded then if StatusBar1.Panels[1].Text='lscore_left.xml' then begin UpdateNavyXML(MatchID,XML_List.text); CreateHistoryMainXML; end; Ich habe aber leider noch ein viel grösseres Problem, was nur inderekt was mit diesem Thread zu tun hat. Ich lese jede Sekunde alle bestimmten Dateien aus einem Ordner ein und schreibe diese in eine Globale Liste, wenn sich da was ändert wird eine Lokale Liste erstellt. Die Listen werden verglichen und so bekomme ich heraus, welche Datei sich verändert hat. Diese wird dann geparst und intern in ein XML-FIle umgewandelt. Dieser Vorgang dauert ca. 200ms, also nicht so lange. Allerdings muss ich aus all diesen Dateien auch noch eine LiveSpiel-Navigation erstellen, was zur Folge hat, dass ich nochmals alle Dateien parsen muss und desweiteren muss ich Archivseiten erstellen, die Tagebasierte Archiveseiten hat, Tagesbasierte Navigationsseiten und alle historischen Spiele. Das Erstellen all dieser Seiten habe ich derzeit immer mit drin, sobald sich auch nur eine einzige Datei ändert. Wenn ich 2-6 Dateien habe, geht das noch, aber aber 8 Dateien dauert es dann doch schon mal mehr als eine Minute, bis ich einen Punkt im Webbrowser aktualisiert bekomme, da er nur noch am rödeln ist und alle Dateien einliest, parst und den ganzen XML-Kram erstellt und dass immerzu. Also habe ich mal die Archivseitenerstellung abgeklemmt und es bleibt flüssig. Wir haben heute mit dem Turnier angefangen und werden am Tagesende 16 Dateien haben. Also mal schauen. Nun meine Frage: Wie kann ich es anstellen, dass ich trotzdem "des öfteren" die Historischen Archidateien erstellen lassen kann, ohne dass die Aktualisierung davon allzusehr eingeschränkt ist? Vielleicht sollte ich das vom DatenManager, der zur Zeit nur die Rohdaten an alle Empfänger verschickt schon im Vorfeld tun lassen, damit die Clients nur noch die fertigen Inhalte erhalten und nichts mehr selbst parsen müssen?! Oder lieber in Threads auslagern? Damit habe ich allerdings noch gar keine Erfahrungen machen dürfen. Hast Du / Habt Ihr noch Tipps? |
Re: Name der geladenen Datei in einem Frame herausbekommen
Sorry, dass ich schon wieder poste, aber mir drängt sich derweil noch eine Frage auf, die mit dem automatisierten Updaten innerhalb des Webbrowsers zu tun hat.
Erledigen tue ich das mit folgender Routine:
Delphi-Quellcode:
Nun zu meiner Frage:
procedure TForm1.UpdateXML(ID,Content:String);
var doc, fdoc: IHTMLDocument2; e: IHTMLElement; va: OleVariant; markup: String; begin doc := web_cis.Document as IHTMLDocument2; va := VarArrayCreate([0, 1], varVariant); va[0] := 1; va[1] := 'main_right'; if doc <> nil then begin fdoc := GetDeepFrameDoc(doc, va); e := fdoc.all.item(ID, 0) as IHTMLElement; if Transform(Content, markup) then fdoc.body.innerHTML := markup else ; end; end; Kann es sein, dass es zu Problemen kommen kann, wenn diese Routine gerade zum Updaten aufgerufen wurde, man aber gleichzeitig im Webbrowser auf einen Link klickt, um auf eine andere Seite zu gelangen??? Ich könnte mir das vorstellen, da ich glaube, dass diese Routine doch zum Updaten alle XML-Elemente benötigt, die mit ID's versehen sind. Falls das so ist. Wie kann ich das Problem beseitigen? Ich kann doch dem User nicht vorschreiben, wann er einen Link zu einer anderen Page anklicken darf und wann nicht. Und wenn es nicht der vermutete Grund ist, woran kann es dann liegen??? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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