![]() |
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:
danke für eure hilfe
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; greetz cy |
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; |
Re: funktion liest den wert zu früh
Zitat:
Delphi-Quellcode:
Grüße vom marabu
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; |
Re: funktion liest den wert zu früh
@marabu: aber auch selbst dann wird nach
Delphi-Quellcode:
sofort
wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
Delphi-Quellcode:
ausgefuehrt
result:=GR;
|
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:
geht aber irgend wie doch ned was kann ich noch versuchen?
wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm');
WaitForBrowser(wb2); berechnenclick; // klickt einen button auf der geladen seite 'rechne.htm' WaitForBrowser(wb2); result:=GR; Ich hab auch das andere versucht mit ExtractGR(url: OleVariant); geht auch ned weil die seite ja nocheinma neu geladen wird greetz cy |
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 |
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; |
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 |
Re: funktion liest den wert zu früh
ich habs nu so:
Delphi-Quellcode:
ist immer noch das selbe prob der wert kommt zu spät. ich hab mal ein showmessage bei
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;
Delphi-Quellcode:
try
result:=strtofloat(s3); showmessage(floattostr(result)); except result:=0; end; hier ist der aufruf.
Delphi-Quellcode:
Es kommen 2 showmessages zu erst eins mit "Sollwert: 0"
procedure TFormMain.Button1Click(Sender: TObject);
begin showmessage('Sollwert:'+floattostr(getdis('(14:91:12)'))); end; 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. |
Re: funktion liest den wert zu früh
Zitat:
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 |
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 |
Re: funktion liest den wert zu früh
Hallo,
das richtige Event ist nicht OnDocumentComplete sondern OnNavigate2Complete. |
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 |
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 |
Re: funktion liest den wert zu früh
Zitat:
|
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