Q&A

  • Tcollection을 Tfilestream에 writecomponent 했는데...
안녕하신지요.

먼저 예를 갖추어야 하나 워낙 경황이 없는지라

본론을 말씀 드리겠습니다.

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.



0  COMMENTS