안녕하신지요.
먼저 예를 갖추어야 하나 워낙 경황이 없는지라
본론을 말씀 드리겠습니다.
Tcollection, Tcollectionitem의 테스트하고 있는데...
실은 요걸 사용해서 제가 맡은 일을 처리하고자 하는데...
string과 integer는 파일에 저장(writecomponent)해서 불러오면(readcomponent)
제대로 되는데 Tjpegimage를 저장해서 불러오면 다음과 같은 에러메세지가 나옵니다.
error reading TMyComponent.Items : Error reading TMyCollection.img.Data :
Invalid property path.
기본이 부족함을 인정합니다. 그러나 지금 시간이 시간인지라...
좀 봐 주세요...
unit test_Tcollectioin;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ExtDlgs, jpeg;
type
TMyComponent = class;
TMyCollectionItem = class( TCollectionItem )
private
Fimg : TJPEGImage;
FName : String;
FAge : Integer;
function GetDisplayName: String; override;
procedure Setimg ( const value : TJPEGImage);
procedure SetName( const Value : String );
procedure SetAge ( const Value : Integer );
public
published
property img : TJPEGImage read Fimg write Setimg;
property Name : String read FName write SetName;
property Age : Integer read FAge write SetAge;
end;
TMyCollection = class( TCollection )
private
FMyComponent : TMyComponent;
function GetItem( Index : Integer ) : TMyCollectionItem;
procedure SetItem( Index : Integer; Value : TMyCollectionItem );
protected
public
constructor Create( MyComponent : TMyComponent );
function Add : TMyCollectionItem;
property Items[Index: Integer] : TMyCollectionItem read GetItem write
SetItem; default;
end;
TMyComponent = class( TComponent )
private
FItems : TMyCollection;
procedure SetItems( Value : TMyCollection );
public
constructor Create( AOwner : TComponent ); override;
destructor Destroy; override;
published
property Items : TMyCollection read FItems write SetItems;
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
namelabel: TLabel;
agelabel: TLabel;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Button2: TButton;
Image1: TImage;
Image2: TImage;
Button3: TButton;
opd1: TOpenDialog;
Button4: TButton;
opd2: TOpenDialog;
Button5: TButton;
svd1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
fname : Tfilename;
dfname : Tfilename;
FMyComponent : TMyComponent;
implementation
{$R *.DFM}
////////////////////////////////////////////////////////////////////////////////
// TMyCollectionItem
////////////////////////////////////////////////////////////////////////////////
function TMyCollectionItem.GetDisplayName : String;
begin
Result := Name;
if Result = '' then
Result := inherited GetDisplayName;
end;
procedure TMyCollectionItem.Setimg( const Value : TJPEGImage);
begin
if Fimg <> Value then
Fimg := Value;
end;
procedure TMyCollectionItem.SetName( const Value : String );
begin
if FName <> Value then
FName := Value;
end;
procedure TMyCollectionItem.SetAge( const Value : Integer );
begin
if FAge <> Value then
FAge := Value;
end;
////////////////////////////////////////////////////////////////////////////////
// TMyCollection
////////////////////////////////////////////////////////////////////////////////
constructor TMyCollection.Create( MyComponent : TMyComponent );
begin
inherited Create( TMyCollectionItem );
FMyComponent := MyComponent;
end;
function TMyCollection.Add : TMyCollectionItem;
begin
Result := TMyCollectionItem( inherited Add );
end;
function TMyCollection.GetItem( Index : Integer ) : TMyCollectionItem;
begin
Result := TMyCollectionItem( inherited GetItem( Index ) );
end;
procedure TMyCollection.SetItem( Index : Integer; Value : TMyCollectionItem );
begin
inherited SetItem( Index, Value );
end;
////////////////////////////////////////////////////////////////////////////////
//TMyComponent
////////////////////////////////////////////////////////////////////////////////
constructor TMyComponent.Create( AOwner : TComponent );
begin
inherited Create( AOwner );
FItems := TMyCollection.Create( Self );
end;
destructor TMyComponent.Destroy;
begin
FItems.Free;
inherited Destroy;
end;
procedure TMyComponent.SetItems( Value : TMyCollection );
begin
FItems.Assign( Value );
end;
////////////////////////////////////////////////////////////////////////////////
procedure AddData( img : TJPEGImage; Name : String; Age : Integer );
var
Soo : TMyCollectionItem;
begin
Soo := FMyComponent.Items.Add;
Soo.img := img;
Soo.Name := Name;
Soo.Age := Age;
end;
procedure LoadDataFromFile;
var
Soo : TFileStream;
begin
soo := TFileStream.Create( dfname , fmOpenRead );
try
FMyComponent := TMyComponent( Soo.ReadComponent( nil ) );
form1.InsertComponent( FMyComponent );
finally
Soo.Free;
end;
end;
procedure SaveDataToFile;
var
Soo : TFileStream;
begin
Soo := TFileStream.Create( dfname , fmOpenWrite or fmCreate );
try
Soo.WriteComponent( FMyComponent );
finally
Soo.Free;
end;
end;
////////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyComponent := TMyComponent.Create( Self );
end;
procedure TForm1.Button1Click(Sender: TObject);
var img : TJPEGImage; name : string; age : integer;
begin
img := TJPEGImage.Create;
img.LoadFromFile(fname);
name := edit1.text;
age := strtoint(edit2.text);
adddata(img,name,age);
end;
procedure TForm1.Button2Click(Sender: TObject);
var index:integer;
begin
index := strtoint(trim(edit3.text));
image2.picture.Assign(FMyComponent.Items[index].img);
NameLabel.Caption := FMyComponent.Items[index].Name;
AgeLabel.Caption := inttostr(FMyComponent.Items[index].Age);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
opd1.Execute;
fname:=opd1.FileName;
image1.Picture.LoadFromFile(fname);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
opd2.Execute;
dfname := opd2.FileName;
LoadDataFromFile;
//
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
svd1.Execute;
dfname := svd1.FileName;
SaveDataToFile;
//
end;
initialization
RegisterClasses( [TMyComponent] );
end.