Конференция "Corba" » TWebBrowser -> OleObject - проверить является ли элемент NULL [Delphi, Windows]
 
  • Edgar_Wine (01.10.12 05:56) [20]
    А вы пробовали? Ну и что же здесь неправильно?:

    procedure TForm1.Button8Click(Sender: TObject);
    var Element: OleVariant;
    begin
    if Element<>nil then ShowMessage('OK');
    end;




    >> [Error] Incompatible types
  • sniknik © (01.10.12 09:43) [21]
    > nil соместим с любым ссылочным типом.
    вариант не ссылка, он структура 16 байт длинной, а ссылка только 4 байта (в 32 разрядной оси).

    +
    nil <> null
    см.прям тут
    sniknik ©   (29.09.12 11:54) [14]
    varEmpty    = $0000; { vt_empty        0 }
    varNull     = $0001; { vt_null         1 }


    будет портить последовательность.
  • sniknik © (01.10.12 10:12) [22]
    для наглядности, не значение, а структура (иногда включает и значение)
    procedure TForm1.Button1Click(Sender: TObject);
    var
     v, iv, id: Variant;
     i: IUnknown;
     d: IDispatch;

     function VarStrucToStr(v: Variant): string;
     begin
       result:= StringOfChar('@', 32);
       BinToHex(@v, @result[1], 16);
     end;

    begin
     iv:= i;
     id:= d;
     ShowMessage('Empty - '+VarStrucToStr(v)+' Null - '+VarStrucToStr(Null)+' IUnknown - '+VarStrucToStr(iv)+' IDispatch - '+VarStrucToStr(id)+#13#10+
                 'Byte - '+VarStrucToStr(5)+' ShortInt - '+VarStrucToStr(-5)+' ...');
    end;

  • Edgar_Wine (01.10.12 21:40) [23]
    Спасибо! =)
    В общем через VarIsClear() работает как часы.
  • sniknik © (01.10.12 22:02) [24]
    непонятно только почему
    > Пытался проверить на NULL этими функциями: VarIsEmpty(), VarIsNull() - без результатов. =(
    "без результатов". т.к.
    > Показывает $00000000, а толку?
    это оно и есть. а VarIsClear просто "более расширенная" вариация проверки нулевого значения для дополнительных типов... диспатч например, судя по
    > "EVariantTypeCastError -> Could not convert variant of type (Dispatch) into type (String)".
    должно быть оно... т.е типа $09000000
  • sniknik © (01.10.12 22:09) [25]
    а... отладчик показывает "чисто значение", если не взять по дампу памяти.
  • Edgar_Wine (02.10.12 01:49) [26]
    Ваш пример показал что id == $09000000000000000000000000000000
    А отладчик показывает id == $00000000 - он видимо откуда-то из "середины" кусок показывает. Может надо настроить где-то чтоб целиком показывал 16 байт?
  • Edgar_Wine (02.10.12 02:19) [27]
    Для моей поделки на TWebBrowser в принципе хватило условия на VarIsClear(Element), а есть ли смысл подобного (в общем случае)?:

    if (VarIsClear(Element) or VarIsEmpty(Element) or VarIsNull(Element)) then
         ShowMessage('Error with "Element" #0011001')
    else
         ShowMessage(Element.innerText);
  • sniknik © (02.10.12 07:49) [28]
    > а есть ли смысл подобного (в общем случае)?:
    в общем это вред без смысла, т.к. твое сообщение вообще не информативно, в отличие от ошибки полученной от обращения без проверки...

    вон там смори
    sniknik ©   (29.09.12 11:54) [14]
    в VarIsClear есть
    Result := (VType = varEmpty) or
    то же что в VarIsEmpty, т.е дополнительная его проверка бессмысленна. это в частном.
  • Edgar_Wine (03.10.12 16:09) [29]
    Сообщение? Про "#0011001" чтоль? Так это я просто, для примеру, обработка отсутствия так сказать. =)
    А с VarIsEmpty это да, оплошал.. Будет думать ещё, спасибо вам огромное!
 
Конференция "Corba" » TWebBrowser -> OleObject - проверить является ли элемент NULL [Delphi, Windows]
Есть новые Нет новых   [118410   +31][b:0][p:0.001]