2016-08-03 62 views
5

我在使用Delhpi 10 Seattle时遇到了一个有趣的功能。在Firedac中,特别是TFDConnection组件,Params属性具有一些巫术魔法,可以动态显示和隐藏IDE中的属性,具体取决于另一个特定属性的值。 (自从我刚开始使用Firedac以来,我不知道这种情况有多长时间)。当更改TFDConnection.Params中的DriverID属性时,Params中的其余属性显示在IDE对象检查器中,以便能够指定驱动程序特定的属性。动态显示/隐藏IDE对象检查器中的属性?

现在我已经研究了它是如何工作的,它是一组接口定义,根源于IFDStanDefinition。我无法弄清楚它是如何在IDE中执行此操作的,除了涉及使用名称/值对功能的TStringList

我很想来实现同样的事情在我自己的组件,尤其是TCollectionItem有一个属性ActionType这是一个枚举类型。我想动态显示/隐藏属性取决于为该属性选择了什么值。

如何才能完成在我自己的组件集合项中的IDE对象检查器中显示/隐藏属性的相同功能?

在附注中,恐怕部分答案是它期望所有字符串值,这取决于您如何通过代码与此Params属性进行交互。

回答

1

Params属性是TFDConnectionDefParams类型(它比字符串列表多一点),并且FireDAC具有用于特定DBMS提供者的后代,例如, TFDPhysMSSQLConnectionDefParams为SQL Server,TFDPhysIBConnectionDefParams Interbase的等

其余部分是相当明显的。如果您使用已发布的属性创建特定的类实例,则可以在对象检查器中对其进行编辑。

我想这种情况下(将其视为伪代码,其中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