配列型変数をプロパティーにするには?

解決


へっぽこサンデー  2008-08-23 07:41:59  No: 31637

コンポーネント内の配列型変数をプロパティに指定する方法がわかりません。
オブジェクトインスペクタのプロパティーに[+]が付いている項目みたいにしたいのです。
unit uTest;
interface
uses  Windows, SysUtils, Classes, ExtCtrls , StdCtrls;
type
  _TestItem = (tsA,tsB,tsC,tsD,tsE,tsF,tsG);
type
  TTest = class(TObject)
  private
    FTag:array[_TestItem] of integer;
  protected
    procedure TestCallback(item:Integer);
  public
    constructor Create;
    destructor Destroy;override;
    function Start():boolean;
    property Tag        : integer   read FTag write FTag; <----ここをどのように宣言したらいいの??
  published
  end;

連続の質問になってしまいました。(汗)
コンポーネント作成はあまり携わったことがなくてわからないことばかりです。どうかよろしくお願いします。


ARRAY型はダメ  2008-08-23 17:09:16  No: 31638

プロパティには配列型は使えないよ。
プロパティーに[+]が付いている項目は配列型ではないし、
>_TestItem = (tsA,tsB,tsC,tsD,tsE,tsF,tsG);
↑この書き方では集合型になる。


ofZ  2008-08-23 17:43:38  No: 31639

集合型ではないなら、こんな感じか?

TPersistent以下から継承したクラスをプロパティにしたら、そのクラスの
published型のプロパティは自動的に[+]になる。

type
  _TestItem = (tsA,tsB,tsC,tsD,tsE,tsF,tsG);

  TTestTag=class(TPersistent)
  protected
    FTag: array[_TestItem] of Integer;

  public
    procedure Assign(Source: TPersistent); override;

  protected
    function GetTag(Index: _TestItem): Integer;
    procedure SetTag(Index: _TestItem; Value: Integer);

  published
    property TagA: Integer index tsA read GetTag write SetTag;
    property TagB: Integer index tsB read GetTag write SetTag;
    property TagC: Integer index tsC read GetTag write SetTag;
    property TagD: Integer index tsD read GetTag write SetTag;
    property TagE: Integer index tsE read GetTag write SetTag;
    property TagF: Integer index tsF read GetTag write SetTag;
    property TagG: Integer index tsG read GetTag write SetTag;

  end;

  TTest = class(TComponent)
  private
    FTag: TTestTag;

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  protected
    procedure SetTag(TestTag: TTestTag);

  published
    property Tag: TTestTag read FTag write SetTag;
  end;

implementation

procedure TTestTag.Assign(Source: TPersistent);
var
  i: _TestItem;
begin
  inherited Assign(Source);
  if Source is TTestTag then begin
    for i := Low(_TestItem) to high(_TestItem) do begin
      FTag[i] := TTestTag(Source).FTag[i];
    end;
  end;
end;

function TTestTag.GetTag(Index: _TestItem): Integer;
begin
  Result := FTag[Index];
end;
procedure TTestTag.SetTag(Index: _TestItem; Value: Integer);
begin
  FTag[Index] := Value;
end;

constructor TTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTag := TTestTag.Create;
end;
destructor TTest.Destroy;
begin
  FTag.Free;
  inherited Destroy;
end;

procedure TTest.SetTag(TestTag: TTestTag);
begin
  FTag.Assign(TestTag);
end;


へっぽこサンデー  2008-08-23 18:47:08  No: 31640

考えも及びませんでした。
乗せていただいたソースを参考にこれから組んでみます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加