2012-01-02 14 views
10

Mam komponent niestandardowy z niektórymi opublikowanymi właściwościami, które były używane przez pewien czas w wielu projektach. Chcę wprowadzić pewne szczególne zmiany w tym komponencie, które wymagają usunięcia tych starych właściwości i zastąpienia ich nowymi. Lub w inny sposób, niekoniecznie usuwam właściwości, ale załóżmy, że po prostu zmieniam nazwę nieruchomości z PropName na MyPropName zamiast tego. Przy następnym uruchomieniu dowolnego projektu używającego tego komponentu nie będzie można znaleźć PropName.Zachowują właściwości mojego komponentu, gdy są zmieniane?

Czy istnieje sposób automatyzacji konwersji tego? Czy jest to coś, co ludzie będą musieli zrobić ręcznie? Jaki byłby właściwy sposób zachowania wartości właściwości komponentu po zmianie nazw tych właściwości?

Mam na myśli tylko kod DFM, niekoniecznie w kodzie źródłowym.

+2

Ktoś jest wściekły w dół ... –

Odpowiedz

14

Możesz użyć punktu rozszerzenia DefineProperties, aby ułatwić migrację plików .dfm.

type 
    TMyComponent = class(...) 
    private 
    procedure ReadPropName(Reader: TReader); 
    protected 
    procedure DefineProperties(Filer: TFiler); override; 
    published 
    property MyPropName: string read ... write ...; 
    end; 

procedure TMyComponent.DefineProperties(Filer: TFiler); 
begin 
    inherited; 
    Filer.DefineProperty('PropName', ReadPropName, nil, False); 
end; 

procedure TMyComponent.ReadPropName(Reader: TReader); 
begin 
    MyPropName := Reader.ReadString; 
end; 

Umożliwi to odczytanie nowego składnika w starych plikach .dfm ze starą nazwą właściwości. Po ponownym zapisaniu pliku .dfm zostanie użyta nowa nazwa właściwości.

Należy pamiętać, że taka technika powoduje, że składnik może odczytać pliki .dfm zawierające starą nazwę właściwości lub nową nazwę właściwości, aby można było migrować stopniowo, jeśli chcesz. Po migracji wszystkich plików .dfm warto usunąć taki kod ze względu na czystość.

Dokumentacja Delphi obejmuje ten temat, choć z nieco innej perspektywy, w sekcji Storing and Loading Unpublished Properties z Component Writer's Guide.

+3

Teraz jest genialny! –

+4

@David, Myślę, że w odpowiedzi zmieniłeś PropName i MyPropName, ponieważ OP chce zastąpić starą właściwość PropName nową właściwością MyPropName. W każdym razie, doskonała odpowiedź, ponieważ pomógł mi również rozwiązać problem, który może pojawić się w przyszłości. – iamjoosy