2012-07-02 4 views
5

コンポーネントのいくつかのプロパティを更新しています。プロパティの不足を避けるために、私はDefinePropertiesを使ってストリームから古いプロパティを読み込みます。ほとんどのプロパティは正常に動作します。 整数、私はプロパティが動作するようにTPersistentはに基づいて取得することはできません。 踏むReadProperty(TPersistentは)手順は、保護された公共ないし、それをアクセスするためのハックを必要としています。それでも、ReadFontPropertyプロシージャは呼び出されず、不足しているプロパティの例外が発生します。DefinePropertiesを使用してTP固有のプロパティを置き換えます。 TFont

にはどうすればのTFontプロパティを読みますか。

ここに私がそれをやろうとしている方法のサンプルコードがあります。 1

... 

type 
    TMyComponent = class(TComponent) 
    strict private 
    // Removed 
    //FIntegerProperty: Integer; 
    //FFontProperty: TFont; 

    // New 
    FNewIntegerProperty: Integer; 
    FNewFontProperty: TFont; 

    procedure ReadIntegerProperty(Reader: TReader); 
    procedure ReadFontProperty(Reader: TReader); 
    protected 
    procedure DefineProperties(Filer: TFiler); override; 
    published 
    // Removed properties 
    //property IntegerProperty: Integer read FIntegerProperty write FIntegerProperty; 
    //property FontProperty: TFont read FFontProperty write SetFontProperty; 

    // New properties 
    property NewIntegerProperty: Integer read FNewIntegerProperty write FNewIntegerProperty; 
    property NewFontProperty: TFont read FNewFontProperty write SetNewFontProperty; 
    end; 

implementation 

procedure TMyComponent.DefineProperties(Filer: TFiler); 
begin 
    inherited; 

    // This works 
    Filer.DefineProperty('IntegerProperty', ReadIntegerProperty, nil, FALSE); 

    // This doesn't 
    Filer.DefineProperty('FontProperty', ReadFontProperty, nil, FALSE); 
end; 

procedure TMyComponent.ReadIntegerProperty(Reader: TReader); 
begin 
    FNewIntegerProperty:= Reader.ReadInteger; 
end; 

type 
    THackReader = class(TReader); 

procedure TMyComponent.ReadFontProperty(Reader: TReader); 
begin 
    { TODO : This doesn't work. How do we read fonts? } 
    THackReader(Reader).ReadProperty(FNewFontProperty); 
end; 

... 

アップデートは、次のコードを使用して、Davidの提案をしようとしました:

Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False); 

...

procedure TMyComponent.ReadFontCharSet(Reader: TReader); 
begin 
    Reader.ReadInteger; 
end; 

は私がプロパティの値が不正ですエラーが発生します。私はそれがTFontCharset(= System.UITypes.TFontCharset = 0 255)タイプ文字セットビーイングとは何かだと思います。このタイプの物件を読むにはどうすればいいですか?あなたがTFontの個々の公表プロパティで作業する必要があり、完全修飾名を使用する必要がありますこれを行うために

答えて

4

Filer.DefineProperty('FontProperty.Name', ReadFontName, nil, False); 
Filer.DefineProperty('FontProperty.Height', ReadFontHeight, nil, False); 
Filer.DefineProperty('FontProperty.Size', ReadFontSize, nil, False); 
// and so on for all the other published properties of TFont 

ReadFontNameReadFontHeightなど新しい名前のコンポーネントに古いプロパティ値をお読みください。

procedure TMyComponent.ReadFontName(Reader: TReader); 
begin 
    FNewFontProperty.Name := Reader.ReadString; 
end; 

// etc. etc. 

更新

あなたはCharsetプロパティを読み取る方法を尋ねます。これは、テキスト識別子(Graphics.pasのFontCharsets定数を参照)として、または単純な整数値として書くことができるため、複雑です。ここであなたのCharsetを読み込むいくつかの素早くハッキングされたコードがあります。

procedure TMyComponent.ReadFontCharset(Reader: TReader); 

    function ReadIdent: string; 
    var 
    L: Byte; 
    LResult: AnsiString; 
    begin 
    Reader.Read(L, SizeOf(Byte)); 
    SetString(LResult, PAnsiChar(nil), L); 
    Reader.Read(LResult[1], L); 
    Result := UTF8ToString(LResult); 
    end; 

    function ReadInt8: Shortint; 
    begin 
    Reader.Read(Result, SizeOf(Result)); 
    end; 

    function ReadInt16: Smallint; 
    begin 
    Reader.Read(Result, SizeOf(Result)); 
    end; 

var 
    Ident: string; 
    CharsetOrdinal: Integer; 

begin 
    Beep; 
    case Reader.ReadValue of 
    vaIdent: 
    begin 
     Ident := ReadIdent; 
     if not IdentToCharset(Ident, CharsetOrdinal) then begin 
     raise EReadError.Create('Could not read MyFont.Charset'); 
     end; 
     FNewFontProperty.Charset := CharsetOrdinal; 
    end; 
    vaInt8: 
    FNewFontProperty.Charset := ReadInt8; 
    vaInt16: 
    FNewFontProperty.Charset := ReadInt16; 
    else 
    raise EReadError.Create('Could not read FontProperty.Charset'); 
    end; 
end; 
+0

@norgepaulどのようにこれで乗り越えましたか?私はそれがあなたの質問に対する答えだと確信しています。 –

+0

こんにちはDavid。答えをありがとう。私はそれが正しいと確信していますが、私はまだそれをテストする機会がありませんでした。私はすぐにそれに着手しようとします。 – norgepaul

+0

ええ、私はちょうどあなたが問題に遭遇し、好奇心が強いかどうか疑問に思った。 –

関連する問題