AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Name der geladenen Datei in einem Frame herausbekommen
Thema durchsuchen
Ansicht
Themen-Optionen

Name der geladenen Datei in einem Frame herausbekommen

Ein Thema von torud · begonnen am 20. Mai 2006 · letzter Beitrag vom 21. Okt 2006
Antwort Antwort
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Name der geladenen Datei in einem Frame herausbekommen

  Alt 20. Mai 2006, 18:24
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...
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Name der geladenen Datei in einem Frame herausbekommen

  Alt 20. Mai 2006, 19:07
Hallo Tom,

wie du an das Dokument in einem verschachtelten Frame heran kommst, weißt du ja schon:

Delphi-Quellcode:
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;
Die Funktion GetFrameDoc() findet man sicher über die Suche in der DP. Den URL der im Frame geladenen Datei erhältst du dann so:

Delphi-Quellcode:
function DocumentUrl(doc: IHTMLDocument2): String;
begin
  if Assigned(doc)
    then Result := doc.parentWindow.location.href
    else Result := '';
end;
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Name der geladenen Datei in einem Frame herausbekommen

  Alt 20. Okt 2006, 16:35
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:
    //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;
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.

Also habe ich im Webbrowser folgendes gemacht:

Delphi-Quellcode:
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;
Hast Du vielleicht noch einen Tipp???
Danke
Tom
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Name der geladenen Datei in einem Frame herausbekommen

  Alt 20. Okt 2006, 21:52
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
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Name der geladenen Datei in einem Frame herausbekommen

  Alt 21. Okt 2006, 09:58
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:
  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);
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.

Delphi-Quellcode:
    if XML_List.CommaText <> XML_File_Is.CommaText then
       if FirstRunOver and PageLoaded then
         if StatusBar1.Panels[1].Text='lscore_left.xmlthen
           begin
             UpdateNavyXML(MatchID,XML_List.text);
             CreateHistoryMainXML;
           end;
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.

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?
Danke
Tom
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Name der geladenen Datei in einem Frame herausbekommen

  Alt 21. Okt 2006, 17:15
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:
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;
Nun zu meiner Frage:
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???
Danke
Tom
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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