16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"TCollectionを使ったコンポ例"
この発言に対し以下のコメントが寄せられています
#00634 謎の全知師 さん RE:TCollectionを使ったコンポ例
#00637 凛 さん RE:TCollectionを使ったコンポ例
試しに作ってみた最もシンプルと思われるTCollectionを使ったコンポ例
Q なんでTCollectionを使うか
A 例えばStatusBarのpanelsの様に設計時に数を変更できるオブジェクトを
プロパティとして持ちたいときはこうするのが多分一番簡単
Q このユニットでは使ってないのに、なんでGetOwnerというfunctionがあるのか
A どうもディフォルトのプロパティエディタがこの関数を
必要としているようです。
Q Moonというプロパティなんか変、何これ?
A まず、名前は 'むーん'と唸りながら考えたのでmoonにしました(他意無し)
で目的はプロパティエディタの世話にならずにオブジェクトプロパティである
cellを追加する手段を作りたかった、、というもので、普通は不要
まぁうまくいかないときに試行錯誤した痕です。(^^;
この数字を設定する度にcellが増えていきます。
Q showitって何?
A これも本来は不要。moonでcellは作るけど即 Linesにaddされちゃうと
プロパティとして保存されたかわかりにくくなるので実行時にだけ見れる
ように、、という関数です。
結構苦労したのでちょっとでも参考になれば幸いです。
変なところありましたらどんどんご指摘願います。m(_ _)m
unit CMemo;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TCell=Class(TCollectionItem)
private
FText:string;
public
procedure assign(source:TPersistent);OverRide;
published
property text:String read Ftext write FText;
end;
TCList=Class(TCollection)
private
FOwner:TPersistent;
procedure _setItem(index:integer;value:TCollectionItem);
function _getItem(index:integer):TCollectionItem;
public
constructor create(Aowner:TPersistent);
function GetOwner: TPersistent; override;
published
property items[index:integer]:TCollectionItem read _getItem write
_setItem;default;
end;
TCMemo = class(TMemo)
private
{ Private 宣言 }
FList:TCList;
Fmoon:integer;
protected
{ Protected 宣言 }
public
{ Public 宣言 }
procedure addCell;//セルを追加する
constructor create(AOwner:TComponent);overRide;
destructor destroy;overRide;
procedure setMoon(value:integer);
procedure showit;
function get(index:integer):TCell;
procedure put(index:integer;value:TCell);
published
{ Published 宣言 }
property List:TCList read FList write FList;
property cells[index:integer]:TCell read get write put;
property moon:integer read FMoon write setMoon;
end;
procedure Register;
implementation
constructor TCList.create;
begin
inherited Create(TCell);
FOwner:=AOwner;
end;
function TCList.getOwner:TPersistent;
begin
result:=FOwner;
end;
procedure TCList._setItem(index:integer;value:TCollectionItem);
begin
inherited SetItem(Index, Value);
end;
function TCList._getItem(index:integer):TCollectionItem;
begin
Result := inherited GetItem(Index);
end;
procedure TCell.assign;
begin
Ftext:=TCell(source).text;
end;
procedure TCMemo.showit;
var
i:integer;
begin
for i:=0 to FList.count-1 do
begin
Lines.add(TCell(FList.getItem(i)).text);
end;
update;
end;
procedure TCMemo.put;
var
i:integer;
cell:TCell;
begin
if FList.count<Index then
begin
for i:=FList.count to index do
begin
FList.add;
end;
end;
TCell(FList[index]).assign(value);
end;
function TCMemo.get(index:integer):TCell;
begin
result:=TCell(FList[index]);
end;
procedure TCMemo.setMoon(value:integer);
begin
addCell;
TCell(FList[FList.count-1]).text:=inttostr(value);
text:=inttostr(FList.count);
Fmoon:=value;
end;
constructor TCMemo.create;
begin
inherited;
FList:=TCList.create(self);
end;
destructor TCMemo.destroy;
var
i:integer;
begin
FList.clear;
inherited;
end;
procedure TCMemo.addCell;
var
cell:TCell;
begin
FList.add;
end;
procedure Register;
begin
RegisterComponents('Samples', [TCMemo]);
end;
end.
98/08/23(日) 20:17 凛(MXB01744)
Original document by 凛 氏 ID:(MXB01744)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|