Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.
Seite 1 von 2  1 2      

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