Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi funktion liest den wert zu früh (https://www.delphipraxis.net/46453-funktion-liest-den-wert-zu-frueh.html)

CTV 25. Mai 2005 07:24


funktion liest den wert zu früh
 
Moin

ich have eine funktion welche eine webseite über den twebbrowser aufruft beim ereignis onDocumentcomplet über gebe ich einen wert welcher von der webseite ist an einer globaler variabel.

in der funktion übergebe ich an result diese globale variabel. jedoch ist die funktion schon fertig bis das onDocumentcomplete über haupt durch is. ich habs versuch mit einem sleep bevor ich die globale variabel am funktions resultat übergebe geht auch ned dann schläft das ganze prog auch das ereigniss onDocumentcomplete. has auch mit while und until versucht und zwar als abbruch bedingung war dass die globale variabel den wert ändert. das kommt aber einem sleep gleich da die ganze reicheleistung sich auf dise schlaufe klausel konsentriet. ich bräuchte eine art sleep funktion die nur eine funktion anhält bis der wert der globalen variabel verfügbar ist. Ich habs ma mit nem thread versucht klappt auch ned ganz. wie kann ich das problem lösen

Delphi-Quellcode:
private
  GR:double;
  getDis(start:string):double;
//...

function tformMain.getDis(start:string):double;
begin
  //....
  wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
  result:=GR;
end;

procedure TFormMain.wb2DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var s,s2,:string;
    i1,i2:integer;
begin
  if pos('s=',url)>0 then
  begin
    WB_GetHTMLCode(wb2,dis);
    s:=dis.Text;
    i1:=pos('edl',s)+12;
    i2:=pos('//',s)-1;
    s2:=copy(s,i1,i2-i1);
        try
      GR:=strtofloat(s2);
    except
      GR:=0;  
    end;
  end;
end;
danke für eure hilfe

greetz cy

toms 25. Mai 2005 07:31

Re: funktion liest den wert zu früh
 
Hallo,

Probier's mal so:

Delphi-Quellcode:
procedure WaitForBrowser(WB: TWebbrowser);
begin
  while (WB.ReadyState <> READYSTATE_COMPLETE)
    and not (Application.Terminated) do
  begin
    Application.ProcessMessages;
    Sleep(0);
  end;
end;

function tformMain.getDis(start:string):double;
begin
  //....
  wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
  WaitForBrowser(wb2);
   result:=GR;
end;

marabu 25. Mai 2005 07:47

Re: funktion liest den wert zu früh
 
Zitat:

Zitat von CTV
beim ereignis onDocumentcomplet über gebe ich einen wert welcher von der webseite ist an einer globaler variabel.

Das Ereignis wird mehrfach aufgerufen, du musst schon den richtigen Augenblick abwarten:

Delphi-Quellcode:
function tformMain.getDis(start:string):double;
begin
  //....
  wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
  // result:=GR;
end;

procedure TFormMain.ExtractGR(url: OleVariant);
var
  s, s2: string;
  i1, i2: integer;
begin
  if pos('s=', url) > 0 then begin
    WB_GetHTMLCode(wb2, dis);
    s := dis.Text;
    i1 := pos('edl', s) + 12;
    i2 := pos('//', s) - 1;
    s2 := copy(s, i1, i2 - i1);
    try
      GR := strtofloat(s2);
    except
      GR := 0;  
    end;
  end;
end;

procedure TFormMain.wb2DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if pDisp = wb2.DefaultInterface then
    ExtractGR(url);
end;
Grüße vom marabu

toms 25. Mai 2005 07:57

Re: funktion liest den wert zu früh
 
@marabu: aber auch selbst dann wird nach

Delphi-Quellcode:
wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
sofort

Delphi-Quellcode:
result:=GR;
ausgefuehrt

CTV 25. Mai 2005 08:01

Re: funktion liest den wert zu früh
 
danke für die hilfe
aber so gehts noch ned. ich hab grad gesehen das beim ersten OnDocumentcomplete noch auf einen button geklickt wird auf der form das heist die funktion müsste nun auf 2 mal das OnDocumentcomplete warten

1.es mal wenn rechne.htm geladen ist
2.nach dem der button of rechne.htm gdrückt worden ist

ich habs ma so versucht:
Delphi-Quellcode:
  wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
  WaitForBrowser(wb2);
  berechnenclick; // klickt einen button auf der geladen seite 'rechne.htm'
  WaitForBrowser(wb2);
  result:=GR;
geht aber irgend wie doch ned was kann ich noch versuchen?


Ich hab auch das andere versucht mit

ExtractGR(url: OleVariant);

geht auch ned weil die seite ja nocheinma neu geladen wird

greetz cy

marabu 25. Mai 2005 08:01

Re: funktion liest den wert zu früh
 
natürlich muss die Zuweisung hinter dem Navigate() weg - dafür habe ich doch extra die neue Prozedur ExtractGR geschaffen.

marabu

toms 25. Mai 2005 08:08

Re: funktion liest den wert zu früh
 
Delphi-Quellcode:
private
  GR:double;
  getDis(start:string):double;


function tformMain.getDis(start:string): Double;
begin
  //....
  wb2.Navigate(ExtractFilePath(application.ExeName)+'rechne.htm');
  WaitForBrowser(wb2);
  berechnenclick; // klickt einen button auf der geladen seite 'rechne.htm'
  WaitForBrowser(wb2);
  Result := ExtractGR(wb2.LocationURL);
end;

function TFormMain.ExtractGR(url: OleVariant): Double;
var
  s, s2: string;
  i1, i2: integer;
begin
  if pos('s=', url) > 0 then
  begin
    WB_GetHTMLCode(wb2, dis);
    s := dis.Text;
    i1 := pos('edl', s) + 12;
    i2 := pos('//', s) - 1;
    s2 := copy(s, i1, i2 - i1);
    try
      GR := strtofloat(s2);
    except
      GR := 0;  
    end;
  end;
end;

marabu 25. Mai 2005 08:10

Re: funktion liest den wert zu früh
 
Hallo CTV,

du bist ein Schelm - änderst mitten im Rennen die Regeln.

Dein Submit-Button steuert doch den Action-URL - da kannst du dir doch selbst mitteilen, wann das Ergebnis abgegriffen werden kann und wann nicht - oder?

marabu

CTV 25. Mai 2005 08:40

Re: funktion liest den wert zu früh
 
ich habs nu so:

Delphi-Quellcode:
function TFormMain.ExtractGR(url: OleVariant): Double;
var
  s, s2: string;
  i1, i2: integer;
begin
  if pos('s=', url) > 0 then begin
    WB_GetHTMLCode(wb2,dis);
    s := dis.Text;
    i1 := pos('edl', s) + 12;
    i2 := pos('//', s) - 1;
    s2 := copy(s, i1, i2 - i1);
    try
      result:=strtofloat(s3);
    except
      result:=0;
    end;
  end;
end;


function tformMain.getDis(start:string): Double;
begin
  //....
  wb2.Navigate(ExtractFilePath(application.ExeName)+'rechne.htm');
  WaitForBrowser(wb2);
  berechnenclick; // klickt einen button auf der geladen seite 'rechne.htm'
  WaitForBrowser(wb2);
  Result := ExtractGR(wb2.LocationURL);
end;

procedure TFormMain.wb2DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if pDisp = wb2.DefaultInterface then
    ExtractGR(url);
end;


procedure TformMain.berechnenclick;
var
  ovElements: OleVariant;
  i: Integer;
begin
    ovElements := wb2.OleObject.Document.forms.item(0).elements;
    for i := 0 to (ovElements.Length - 1) do
    begin
      if
      (ovElements.item(i).type = 'submit')then
      ovElements.item(i).Click;
    end;
end;
ist immer noch das selbe prob der wert kommt zu spät. ich hab mal ein showmessage bei
Delphi-Quellcode:
    try
      result:=strtofloat(s3);
      showmessage(floattostr(result));
    except
      result:=0;
    end;

hier ist der aufruf.
Delphi-Quellcode:
procedure TFormMain.Button1Click(Sender: TObject);
begin
  showmessage('Sollwert:'+floattostr(getdis('(14:91:12)')));
end;
Es kommen 2 showmessages zu erst eins mit "Sollwert: 0"
Das zweite dann mit dem richtigen wert.

Was soviel bedeuetet dass die funktion wieder zu schnell durchläuft da das 2te showmessage erst später kommt. Was kann ich noch probieren ?

@marabu
hab ich versucht die action.php?mit parametern auszufüren.
das ganze mit idhttp.get(acctionurl mit parameter)... währe das einfachste nur funktioniert das ganze nur wenn ich eine normale form nehme und dann so submit drücke. evtl werden da auch de werte von submit übertragen auf jedenfall gings ned hab da lange dran getestet.

marabu 25. Mai 2005 09:33

Re: funktion liest den wert zu früh
 
Zitat:

Zitat von CTV
Es kommen 2 showmessages zu erst eins mit "Sollwert: 0"
Das zweite dann mit dem richtigen wert.

Also zuerst mal musst du dich entscheiden, ob du mit OnDocumentComplete() arbeiten willst oder mit WaitForWebBrowser - beides zusammen macht keinen Sinn.

Dann wird immer unklarer, was du mit der Seite eigentlich bewerkstelligen willst. Ist da ein Web-GUI drauf für eine Art parametrierter Berechnung und der Benutzer kann die Parameter eingeben und dann die Berechnung anstoßen? Der Aufruf "berechneClick()" in deinem Code ist dann wohl nur als Hinweis darauf zu verstehen, dass der Benutzer an dieser Stelle den Submit-Button klickt - richtig?

Unabhängig von der verwendeten Methode muss dir klar sein, dass dein Formular dann immer zweimal gerendert wird - einmal um das Web-GUI aufzubauen und dann nochmal um das berechnete Ergebnis darzustellen.

Wenn du das Ergebnis beim ersten mal kunstvoll aus dem Quellcode der Seite herausfieselst (warum machst du das eigentlich nicht über das HTMLDocument-Interface?), dann merkst du doch, dass der Wert noch leer bzw. 0 ist. Nimm halt den zweiten Wert. Übersehe ich da ein Problem?

marabu

CTV 25. Mai 2005 19:33

Re: funktion liest den wert zu früh
 
@marabu
du siehst das richtig. Die gui wird in den webbrowser geladen, danach werden werte in den die web gui eingefüllt und anschliessend wir der submit button geklickt auf der webgui. Ich brauch die auswertung nach dem der button auf der webgui geklickt wird. dann erhalte ich einen wert auf der webgui welchen ich dann rauslese und der eigentlichen funktion übergebe.

Das problem daran ist, das die funktion den wert schon liest bevor das resulat auf der webseite (nach buttonclick) überhaupt geladen ist.

was kann ich mit mit HTMLDocument-Interface alles machen hab ich noch nie verwendet. Ich werds mir nu gleich ma anschauen

danke für deine hilfe

greetz cy

Jens Schumann 25. Mai 2005 20:38

Re: funktion liest den wert zu früh
 
Hallo,
das richtige Event ist nicht OnDocumentComplete sondern OnNavigate2Complete.

marabu 25. Mai 2005 21:12

Re: funktion liest den wert zu früh
 
Hallo Jens,

bitte begründe doch deine Aussage. Laut Microsoft ist der Unterschied zwischen den beiden Events folgender:

- DocumentComplete:
The WebBrowser Control fires the DocumentComplete event when the document has completely loaded

- Navigate2Complete:
The document might still be downloading

Der von mir vorgestellte Code funktioniert offensichtlich, genau wie die Alternative von toms. Ich glaube, momentan ist da nur ein Verständigungsproblem mit CTV. Vielleicht findet sich ja ein Dolmetscher.

marabu

CTV 27. Mai 2005 02:18

Re: funktion liest den wert zu früh
 
ich habs nur komplett anderst gelöst und zwar ohne den twebbrowser

mit idhttp.post();

das macht im prinzip genau das was ich versucht habe nachzubauen mit dem twebbrowser hab ned gewusst dass man das kann mit dem idhttp weil mit idhttp.get() gings eben ned aber das problem is nu gelöst

danke an alle für die hilfe!

greetz cy

Jens Schumann 27. Mai 2005 07:47

Re: funktion liest den wert zu früh
 
Zitat:

Zitat von marabu
Hallo Jens,

bitte begründe doch deine Aussage. Laut Microsoft ist der Unterschied zwischen den beiden Events folgender:

- DocumentComplete:
The WebBrowser Control fires the DocumentComplete event when the document has completely loaded

- Navigate2Complete:
The document might still be downloading

Der von mir vorgestellte Code funktioniert offensichtlich, genau wie die Alternative von toms. Ich glaube, momentan ist da nur ein Verständigungsproblem mit CTV. Vielleicht findet sich ja ein Dolmetscher.

marabu

Weil ich festgestellt habe das OnDocumentComplete während eine Seite geladen wird öfter ausgelöst werden kann. OnNavigate2Complete hingegen wird nur dann ausgelöst wenn die Seite vollständig geladen ist.

marabu 27. Mai 2005 14:59

Re: funktion liest den wert zu früh
 
Hallo Jens,

die beiden Ereignisse werden grundsätzlich gleich häufig ausgelöst. Der Unterschied besteht darin, dass OnDocumentComplete() erst ausgelöst wird, wenn der Client das document object model vollständig fertig gestellt hat, während OnNavigateComplete2() so früh wie möglich ausgelöst wird. Es kann dabei vorkommen, dass Teile des Dokumentes (z.B. Bilder) erst noch vom Server geladen werden. So ist meine Erfahrung und so ist es im MS PSDK dokumentiert. Vielleicht möchtest du deine Feststellung noch einmal überprüfen.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 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