Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen ob ein OleVariant verfügbar ist? (https://www.delphipraxis.net/198635-pruefen-ob-ein-olevariant-verfuegbar-ist.html)

SearchBot 20. Nov 2018 15:40

Delphi-Version: 10.1 Berlin

Prüfen ob ein OleVariant verfügbar ist?
 
Hallo,

ich mache gerade mit dem TWebbrowser herum. :oops:

Ich möchte auf einer Webseite die Werte bestimmter IDs abfragen. Diese stehen nicht immer in in der Tag-Eigenschaft 'value', sondern auch mal im Text selbst.
Um die richtige Auswahl zu treffen, sage ich der Function, von wo ich den Wert haben möchte.
Ich taste mich langsam vor, ob es einen Bezug auch wirklich gibt - oder muss ich mir keine Gedanken machen?

Jetzt knallt mir der Debugger aber so "EVariantInvalidOpError" um die Ohren (ungültige Variantenoperation) - das Konzept mit den Varianten oder OleVarianten ist mir nur vage geläufig :roll:

Letzter Stand von meines Try'n'Error: :pale:

Delphi-Quellcode:
 function GetById(id:string; by:shortstring):string;
 var V:Variant; O:OleVariant;
 begin
  result:='';
  V:=Form1.Webbrowser1.OleObject; //will zunächst wissen, ob nachfolgende Abfragen Sinn machen
  if V<>NULL then begin //geht nicht mit NULL, auch nicht mit NIL, auch nicht mit 0 - ja wie denn dann?
     O:=V.Document;     //Document überhaupt da?
     if O<>Null then O:=V.Document.GetElementById(id); // dann nach der Id sehen
     if (O<>Null) then begin
      if by='innerText' then result:=O.innerText;
      if by='value'    then result:=O.value;
      if by='innerHTML' then result:=O.innerHTML;
     end;
  end;
 end;
Gibt es nebenbei auch eine elegantere Möglichkeit auf die HTML-Objekteigenschaften zuzugreifen anstelle meiner "if by=.. then.."-Abfragen? Irgendwie so O.object['value']?

KodeZwerg 20. Nov 2018 15:45

AW: Prüfen ob ein OleVariant verfügbar ist?
 
Ich empfehle Dir mal Dir das hier anzuschauen.

Eine Antwort auf Deine Frage habe ich erstmal nicht, tut mir leid.

Uwe Raabe 20. Nov 2018 16:40

AW: Prüfen ob ein OleVariant verfügbar ist?
 
Zitat:

Zitat von SearchBot (Beitrag 1418548)
Delphi-Quellcode:
 
  if V<>NULL then begin //geht nicht mit NULL, auch nicht mit NIL, auch nicht mit 0 - ja wie denn dann?

Vielleicht sind Abfragen mit VarIsNull, VarIsEmpty oder VarIsClear hier zielführender.

Der schöne Günther 20. Nov 2018 17:18

AW: Prüfen ob ein OleVariant verfügbar ist?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1418549)
Ich empfehle Dir mal Dir das hier anzuschauen.

Egal ob das wirklich 100%ig zur Frage passt oder nicht, da gibt es ja viel interessanten Stoff. Danke für den Tipp 👍

KodeZwerg 20. Nov 2018 17:33

AW: Prüfen ob ein OleVariant verfügbar ist?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1418553)
Zitat:

Zitat von KodeZwerg (Beitrag 1418549)
Ich empfehle Dir mal Dir das hier anzuschauen.

Egal ob das wirklich 100%ig zur Frage passt oder nicht, da gibt es ja viel interessanten Stoff. Danke für den Tipp 👍

Ja okay, ich hab vergessen zu notieren das sich dahinter eine Seite verbirgt die einem Rund ums Thema WebBrowser glücklich machen könnte und gern geschehen :)

SearchBot 21. Nov 2018 10:09

AW: Prüfen ob ein OleVariant verfügbar ist?
 
Hey :thumb:

Aus der Kombination der Möglichkeiten habe ich meine Function jetzt zum Laufen bekommen:
Delphi-Quellcode:
 function GetById(id:string; by:shortstring):string;
 var V:Variant; O:OleVariant;
  D: IHTMLDocument2;
 begin
  result:='';
  D := Form1.WebBrowser1.Document as IHTMLDocument2;
  if D<>nil then
  if D.readyState='complete' then begin
    V:=Form1.Webbrowser1.OleObject;
    if not VarIsEmpty(V) then begin
     O:=V.Document;
     if not VarIsNull(O) then begin
      O:=O.GetElementById(id);
      if (not VarIsEmpty(O)) and (by<>'') then begin
        if by='innerText' then result:=O.innerText;
        if by='value'    then result:=O.value;
        if by='innerHTML' then result:=O.innerHTML;
      end else result:='true'; //für die Abfrage, ob es die gewünschte ID überhaupt gibt
      //Ergebnis also ''=nicht da, 'true'=ID da, oder der Wert der ID (ich weiß, wie die Seite aufgebaut ist)
     end;
    end;
  end;
 end;
Sieht zwar immer noch etwas gemurkst aus, aber läuft :stupid:

Danke für Eure Hilfe!


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