コンポーネント内の配列型変数をプロパティに指定する方法がわかりません。
オブジェクトインスペクタのプロパティーに[+]が付いている項目みたいにしたいのです。
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;
連続の質問になってしまいました。(汗)
コンポーネント作成はあまり携わったことがなくてわからないことばかりです。どうかよろしくお願いします。
プロパティには配列型は使えないよ。
プロパティーに[+]が付いている項目は配列型ではないし、
>_TestItem = (tsA,tsB,tsC,tsD,tsE,tsF,tsG);
↑この書き方では集合型になる。
集合型ではないなら、こんな感じか?
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;
考えも及びませんでした。
乗せていただいたソースを参考にこれから組んでみます。
ありがとうございました。
ツイート | ![]() |