Я хочу знать, как правильно получить доступ к свойству или методу с поздней привязкой из Delphi, когда свойство для доступа вложено в другое свойство. Позволь мне объяснить.
Проверьте этот пример приложения, чтобы проверить, активен ли брандмауэр, 3 объявленные функции используют COM-объект HNetCfg.FwMgr
и возвращают одно и то же значение.
{$APPTYPE CONSOLE}
uses
Variants,
ActiveX,
Comobj,
SysUtils;
//in this function i don't use any "helper" property to hold the temp value of the properties.
function FirewallIsActive1 : Boolean;
var
Firewall : OleVariant;
begin
Firewall := CreateOleObject('HNetCfg.FwMgr');
Result := Firewall.LocalPolicy.CurrentProfile.FirewallEnabled;
end;
//here i hold the value of the LocalPolicy property
function FirewallIsActive2 : Boolean;
var
Firewall : OleVariant;
Policy : OleVariant;
begin
Firewall := CreateOleObject('HNetCfg.FwMgr');
Policy := Firewall.LocalPolicy;
Result := Policy.CurrentProfile.FirewallEnabled;
end;
//Here i use a "helper" variable for each property
function FirewallIsActive3 : Boolean;
var
Firewall : OleVariant;
Policy : OleVariant;
Profile : OleVariant;
begin
Firewall := CreateOleObject('HNetCfg.FwMgr');
Policy := Firewall.LocalPolicy;
Profile := Policy.CurrentProfile;
Result := Profile.FirewallEnabled;
end;
var
i : Integer;
begin
try
CoInitialize(nil);
try
Writeln(BoolToStr(FirewallIsActive1,True));
Writeln(BoolToStr(FirewallIsActive2,True));
Writeln(BoolToStr(FirewallIsActive3,True));
Readln;
finally
CoUninitialize;
end;
except
on E:Exception do
begin
Writeln(E.Classname, ':', E.Message);
Readln;
end;
end;
end.
Я задаю этот вопрос, потому что хочу знать, способен ли компилятор Delphi генерировать код для размещения олевариантов в любом случае из трех функций?