2016-08-03 12 views
5

Я столкнулся с интересной особенностью, используя Delphi 10 Seattle. В Firedac, в частности компонент TFDConnection, свойство Params обладает некоторой магией вуду, которая может динамически отображать и скрывать свойства в IDE на лету, в зависимости от значения другого конкретного свойства. (Я не знаю, как долго это было доступно, так как я только начал с Firedac). Когда вы изменяете свойство DriverID в TFDConnection.Params, остальные объекты в Params отображаются в инспекторе объектов IDE, чтобы иметь возможность указывать свойства, специфичные для драйвера.Динамически показывать/скрывать свойства в IDE Object Inspector?

Теперь я исследовал, как это работает, и это множество определений интерфейсов, укореняющихся с IFDStanDefinition. Я не могу понять, как это на самом деле выполняется в среде IDE, кроме того, что есть TStringList, в котором задействованы функциональные возможности Name/Value.

Я хотел бы реализовать то же самое в своем собственном компоненте, в частности, TCollectionItem имеет свойство ActionType, которое является типом Enum. Я хотел бы динамически показывать/скрывать свойства в зависимости от того, какое значение выбрано для этого свойства.

Как я могу реализовать ту же способность отображения/скрытия свойств в инспекторе объектов IDE в элементе коллекции моего собственного компонента?

На стороне примечания, я боюсь, что часть ответа состоит в том, что он ожидает все строковые значения, судя по тому, как вы взаимодействуете с этим свойством Params через код.

ответ

1

Свойство Params имеет тип TFDConnectionDefParams (что немного больше, чем список строк), а FireDAC имеет потомки для конкретных поставщиков СУБД, например. TFDPhysMSSQLConnectionDefParams для SQL Server, TFDPhysIBConnectionDefParams для Interbase и т.д.

Остальное вполне очевидна. Если вы создадите конкретный экземпляр класса с опубликованными свойствами, его можно отредактировать в Object Inspector.

Я думаю об этом случае (взять его в псевдокоде, где TMySettingsConsumer.Selector должен заменить DriverName, но не метаклассом был здесь использован, так как ни один хрустящий цыпленок не пострадал):

type 
    TCommonSettings = class(TStringList) 
    private 
    FCommon: string; 
    published 
    property Common: string read FCommon write FCommon; 
    end; 

    TMyFirstSettings = class(TCommonSettings) 
    private 
    FFirstSpecific: Boolean; 
    published 
    property FirstSpecific: Boolean read FFirstSpecific write FFirstSpecific; 
    end; 

    TMySecondSettings = class(TCommonSettings) 
    private 
    FSecondSpecific: Integer; 
    published 
    property SecondSpecific: Integer read FSecondSpecific write FSecondSpecific; 
    end; 

    TMySettingsConsumer = class(TComponent) 
    private 
    FSelector: string; 
    FSettings: TCommonSettings; 
    procedure SetSelector(const AValue: string); 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Selector: string read FSelector write SetSelector; 
    property Settings: TCommonSettings read FSettings; 
    end; 

implementation 

constructor TMySettingsConsumer.Create(AOwner: TComponent); 
begin 
    inherited; 
    FSettings := TCommonSettings.Create; 
end; 

destructor TMySettingsConsumer.Destroy; 
begin 
    FSettings.Free; 
    inherited; 
end; 

procedure TMySettingsConsumer.SetSelector(const AValue: string); 
begin 
    if FSelector <> AValue then 
    begin 
    FSettings.Free; 

    if SameText(AValue, 'First') then 
     FSettings := TMyFirstSettings.Create 
    else 
    if SameText(AValue, 'Second') then 
     FSettings := TMySecondSettings.Create 
    else 
     FSettings := TCommonSettings.Create; 
    end; 
end; 

из любопытства, вы можете получить доступ к определенной настройке провайдера из кода, например:

uses 
    FireDAC.Phys.MSSQLDef; 

var 
    Params: TFDPhysMSSQLConnectionDefParams; 
begin 
    { setup driver } 
    FDConnection1.DriverName := 'MSSQL'; 
    { access the specific parameters after setting driver } 
    Params := FDConnection1.Params as TFDPhysMSSQLConnectionDefParams; 
    { common for all providers from TFDConnectionDefParams } 
    Params.Database := 'Database'; 
    Params.UserName := 'UserName'; 
    Params.Password := 'Password'; 
    { specific for SQL Server provider from TFDPhysMSSQLConnectionDefParams } 
    Params.MARS := False; 
    Params.OSAuthent := False; 
    { connect } 
    FDConnection1.Connected := True; 
end; 
+1

Прогресс по этому вопросу? Я ничего не могу проверить, так как я нахожусь в отпуске с планшетом (я могу читать исходный код старой версии FireDAC в это время). Не могли бы вы сообщить о некоторых отзывах, пожалуйста? Вышеприведенный код должен быть легко зарегистрирован как компонент для проверки ... – Victoria