![]() |
OleVariant auf Null prüfen?
Hallo,
kann mir jemand sagen wir ich ein OleVariant auf Null prüfe? Mit nil geht das nicht, inkompatible Typen :? Danke schonmal :angel: |
Re: OleVariant auf Null prüfen?
Hab jetzt nicht nachgesehen, aber AFAIR geht das mit VarIsNull (ohne Gewähr).
|
Re: OleVariant auf Null prüfen?
Hast du Variants eingebunden?
|
AW: OleVariant auf Null prüfen?
moin,
ich habe dasselbe problem seit 2st! einem olevariant wird etwas zugewiesen, von dem man nicht sicher sein kann, dass es existiert. also muss ich den olevariant darauf überprüfen, ob er nun gesetzt wurde oder nicht. @mkinzler: die unit variants ist definitiv eingebunden! probiert habe ich folgende möglichkeiten:
Delphi-Quellcode:
ich bekomme entweder eine Zugriffsverletzung, Inkompatible Typen oder ungültige Typumwandlung...
aNode := WebBrowser1.OleObject.Document.all.tags('table').Item(0);
if aNode <> nil then ... if aNode <> null then ... if Assigned(aNode) then ... if string(aNode) <> '' then ... if str(aNode) <> '' then ... if VarToStr(aNode) <> '' then ... tmpstr := aNode; if tmpstr <> '' then ... if not VarIsNull(aNode) then ... if not VarIsEmpty(aNode) then ... if VarType(aNode) = varDispatch then ... ... warum nicht gleich alle 3 fehler gleichzeitig? die ganze familie beisammen... hab ja sonst nichts worüber man sich ärgern könnte... :evil: Bin am verzweifeln, hoffe auf hilfe :( |
AW: OleVariant auf Null prüfen?
Also um zu Prüfen ob ein Variant = Null ist verwendet man die Funktion VarIsNull() aus der Unit Variants.
Du hast aber noch ein ganz anderes Problem. Du greifst ohne Prüfung auf Document zu:
Delphi-Quellcode:
Wenn kein Document geladen ist, dann ist Document = nil und die Zugriffsverletzung vorprogrammiert!
aNode := WebBrowser1.OleObject.Document.all.tags('table').Item(0);
Daher:
Delphi-Quellcode:
Dann gehts aber noch weiter.
var
document : OleVariant; begin if not Assigned(WebBrowser1.Document) then raise Exception.Create('kein HTML-Dokument geladen'); document := WebBrowser1.Document; aNode := document.all.tags('table').Item(0); Du greifst mit Gottvertrauen auf ein Element zu, dass mit 'table' getagged ist. Und wenn es das nicht gibt? Dann macht's auch "Platsch".
Delphi-Quellcode:
function VarIsDispatchObject(const v : Variant): Boolean; // Hilfsfunktion
var vt : Integer; begin vt := VarType(v) and not varByRef; Result := (vt = varDispatch); end; ..... var document, table : OleVariant; begin if not Assigned(WebBrowser1.Document) then raise Exception.Create('kein HTML-Dokument geladen'); document := WebBrowser1.Document; table := document.all.tags('table'); if not VarIsDispatchObject(table) then raise Exception.Create('kein "table"-Element im Dokument enthalten'); aNode := table.Item[0]; |
AW: OleVariant auf Null prüfen?
*kopfklatsch*
Erstmal danke für die Antwort und die Mühe :-D :thumb: Stimmt natürlich, ich muss die Objekte erstmal abfragen, bevor ich weitermache. Ich beschäftige mich mit dem TWebBrowser und dem ganzen Krams auch erst seit gestern. Allerdings liefert deine Funktion "VarIsDispatchObject" immer True zurück, egal ob 'table' jetzt existiert oder nicht. Somit kann ich alle weiteren Abfragen innerhalb von document wieder knicken. Das assign auf webbrowser1.document funktioniert ist ja klar, ist ja auch kein olevariant :wink: Das Problem (olevariant = nil ?!?) besteht also weiterhin :( |
AW: OleVariant auf Null prüfen?
Zitat:
Anscheinend wird hier eine leere Collection vom Typ ![]() Anstatt zu prüfen, ob ein Objekt (genauer gesagt ein Dispatch-Interfacezeiger) zurückkommt, prüft man ob die Collection leer ist:
Delphi-Quellcode:
table := document.all.tags('table');
if table.length = 0 then raise Exception.Create('kein "table"-Element im Dokument enthalten'); aNode := table.Item[0]; |
AW: OleVariant auf Null prüfen?
super danke!
mit der prüfung auf .length = 0 funktioniert das super :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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