![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz