Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OleVariant auf Null prüfen? (https://www.delphipraxis.net/114189-olevariant-auf-null-pruefen.html)

Angel4585 21. Mai 2008 07:26


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:

DeddyH 21. Mai 2008 07:38

Re: OleVariant auf Null prüfen?
 
Hab jetzt nicht nachgesehen, aber AFAIR geht das mit VarIsNull (ohne Gewähr).

mkinzler 21. Mai 2008 07:43

Re: OleVariant auf Null prüfen?
 
Hast du Variants eingebunden?

PfWSkip 26. Okt 2010 15:00

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:
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 ...

...
ich bekomme entweder eine Zugriffsverletzung, Inkompatible Typen oder ungültige Typumwandlung...
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 :(

shmia 26. Okt 2010 16:09

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:
aNode := WebBrowser1.OleObject.Document.all.tags('table').Item(0);
Wenn kein Document geladen ist, dann ist Document = nil und die Zugriffsverletzung vorprogrammiert!
Daher:
Delphi-Quellcode:
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);
Dann gehts aber noch weiter.
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];

PfWSkip 27. Okt 2010 09:17

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 :(

shmia 27. Okt 2010 13:14

AW: OleVariant auf Null prüfen?
 
Zitat:

Zitat von PfWSkip;1058059Allerdings liefert deine Funktion "VarIsDispatchObject" [B
immer[/B] True zurück, egal ob 'table' jetzt existiert oder nicht

Das ist aber nicht schlimm.
Anscheinend wird hier eine leere Collection vom Typ IHTMLElementCollection zurückgeliefert.
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];

PfWSkip 29. Okt 2010 07:42

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 04:12 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