AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi funktion liest den wert zu früh
Thema durchsuchen
Ansicht
Themen-Optionen

funktion liest den wert zu früh

Ein Thema von CTV · begonnen am 25. Mai 2005 · letzter Beitrag vom 27. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#1

funktion liest den wert zu früh

  Alt 25. Mai 2005, 07:24
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
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 07:31
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;
Thomas
  Mit Zitat antworten Zitat
marabu

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

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 07:47
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 07:57
@marabu: aber auch selbst dann wird nach

wb2.Navigate(extractfilepath(application.ExeName)+'rechne.htm'); sofort

result:=GR; ausgefuehrt
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#5

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 08:01
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
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
marabu

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

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 08:01
natürlich muss die Zuweisung hinter dem Navigate() weg - dafür habe ich doch extra die neue Prozedur ExtractGR geschaffen.

marabu
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 08:08
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;
Thomas
  Mit Zitat antworten Zitat
marabu

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

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 08:10
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
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#9

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 08:40
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.
Wer glaub er ist, hört auf zu werden!
Delphi Rulez!!!
  Mit Zitat antworten Zitat
marabu

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

Re: funktion liest den wert zu früh

  Alt 25. Mai 2005, 09:33
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:37 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