Это зависит от вашего типа Item.SomeProperty. Если это вариант или если перед ним есть вариант, который будет оценен, он будет оценен и вызовет AV.
Редактировать: забыть упомянуть обходной путь:
Если SomeProperty имеет тип Variant, вы можете использовать
if Assigned(Item) and StrToBool(Item.SomeProperty) then
Это действительно потратить некоторое время на преобразование переменной в String, а затем обратно в булево значение, но на практике это может удовлетворить все случаи истинности / ложности / небытия.
Ниже приведен тестовый пример для вас:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Generics.Collections;
type
TTestObj = class
public
V : Variant;
I : Integer;
end;
TForm4 = class(TForm)
btn1: TButton;
btn2: TButton;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
TOV : TTestObj;
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.btn1Click(Sender: TObject);
begin
if Assigned(TOV) and (TOV.I = 10) then
ShowMessage('You will never see this though no AV!');
end;
procedure TForm4.btn2Click(Sender: TObject);
begin
if Assigned(TOV) and StrToBool(TOV.V) then
ShowMessage('You will not see AV with StrToBool!');
if Assigned(TOV) and TOV.V then
ShowMessage('You will never see this but AVed!');
end;
procedure TForm4.btn3Click(Sender: TObject);
var
V : Variant;
begin
V := False;
if Assigned(TOV) and V and (TOV.I = 10) then
ShowMessage('You will see AV!');
end;
end.