2016-08-03 6 views
5

Delhpi 10 Seattleを使用しているときに面白い機能を見つけました。 Firedacでは、具体的にはTFDConnectionコンポーネントで、Paramsプロパティには、別の特定のプロパティの値に応じて、動的にIDEのプロパティを動的に表示および非表示にできるブードーマジックがいくつかあります。 (私がFiredacで始まって以来、これがどれくらいの期間利用可能であったかはわかりません)。 TFDConnection.ParamsDriverIDプロパティを変更すると、Paramsの残りのプロパティがIDEオブジェクトインスペクタに表示され、ドライバ固有のプロパティを指定できます。IDE Object Inspectorのプロパティを動的に表示/非表示しますか?

これはどのように動作するのかを調査しました。これはIFDStanDefinitionからの一連のインターフェイス定義です。実際にIDEでこれをどのように実行しているのか分かりませんが、名前/値のペア機能を利用しているのはTStringListです。

私は自分自身のコンポーネントで同じことを実装したいと思っています。特に、TCollectionItemにはEnumタイプのActionTypeというプロパティがあります。私は、そのプロパティに対してどの値が選択されているかに応じてプロパティを動的に表示/非表示したいと思います。

自分のコンポーネントのコレクションアイテムのIDEオブジェクトインスペクタでプロパティを表示/非表示するのと同じ機能をどのように達成できますか?

私は、このParamsプロパティとコードでやりとりする方法で判断すると、すべての文字列値を期待していることに注意してください。

答えて

1

ParamsのタイプはTFDConnectionDefParamsタイプ(文字列リストよりも多少です)で、FireDACは特定のDBMSプロバイダの子孫を持っています。 TFDPhysMSSQLConnectionDefParams SQL ServerのTFDPhysIBConnectionDefParams Interbaseのためのなど

残りの部分は非常に明白です。パブリッシュされたプロパティで特定のクラスインスタンスを作成する場合は、オブジェクトインスペクタで編集できます。私はこのような場合を考えている

TMySettingsConsumer.SelectorDriverNameに置き換えてください擬似コード、としてそれを取るが、ないクリスピーチキンが傷つけられていないように、何のメタクラスは、ここで使用されなかった):

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

関連する問題