2016-08-03 36 views
5

Natknąłem się na interesującą funkcję podczas używania Delhpi 10 Seattle. W Firedac, konkretnie w komponencie TFDConnection, właściwość Params ma pewną magię voodoo, która może dynamicznie pokazywać i ukrywać właściwości w IDE w locie, w zależności od wartości innej konkretnej właściwości. (Nie mam pojęcia, jak długo to trwa, odkąd zacząłem od Firedaca). Po zmianie właściwości DriverID w TFDConnection.Params, pozostałe właściwości w Params pojawiają się w Inspektorze obiektów IDE, aby móc określić właściwości specyficzne dla sterownika.Dynamicznie wyświetlać/ukrywać właściwości w Inspektorze obiektów IDE?

Teraz zbadałem, jak to działa, i jest to garść definicji interfejsu, zakorzenienia z IFDStanDefinition. Nie mogę zrozumieć, jak to faktycznie działa w IDE, poza tym, że jest zaangażowany TStringList przy użyciu pary funkcji Nazwa/Wartość.

Chciałbym wprowadzić to samo w moim własnym komponencie, w szczególności TCollectionItem ma właściwość ActionType, która jest typu Enum. Chciałbym dynamicznie pokazać/ukryć właściwości w zależności od wybranej wartości dla tej właściwości.

Jak mogę uzyskać tę samą możliwość pokazywania/ukrywania właściwości w Inspektorze obiektów IDE w elemencie kolekcji mojego elementu?

Na marginesie, obawiam się, że część odpowiedzi jest taka, że ​​oczekuje ona wszystkich wartości ciągu, sądząc po tym, jak wchodzisz w interakcję z tą właściwością Params za pośrednictwem kodu.

Odpowiedz

1

Właściwość Params jest typu TFDConnectionDefParams (co jest nieco więcej niż listą ciągów znaków), a FireDAC ma potomków dla określonych dostawców DBMS, np. TFDPhysMSSQLConnectionDefParams dla SQL Server, TFDPhysIBConnectionDefParams dla Interbase itp

Reszta jest dość oczywista. Jeśli utworzysz określoną instancję klasy z opublikowanymi właściwościami, możesz ją edytować w Inspektorze obiektów.

myślę o tej sprawie (wziąć go jako Pseudokod, gdzie TMySettingsConsumer.Selector powinien zastąpić DriverName, ale nie metaklasa użyto tutaj, tak jak nie chrupiące kurczak został zraniony):

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; 

Z ciekawości można uzyskać dostęp do ustawień określonych przez dostawcę z kodu, np .:

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

Wszelkie postępy w tej sprawie? Nie mogę niczego przetestować, ponieważ jestem na wakacjach z tabletem (mogę teraz tylko czytać kod źródłowy starszej wersji FireDAC). Czy możesz zgłosić jakieś uwagi? Powyższy kod powinien być łatwo zarejestrowany jako składnik, aby spróbować ... – Victoria