Q&A

  • Component를 이용하여 파일 저장을 하려고 하는데요...
여덕수님이 쓰신 가변데이터 저장 기법을 읽고 참 좋은 방법 같아서 구현해 보려구 했는데요...
비트맵파일을 읽어서 이름과 나이를 추가하여 새로운 파일을 만들려구 했어요...
근데 스트링은 TComponent를 이용하여 파일로 저장되고 읽혀지는데... 비트맵을 저장하고 읽을려고 하면 proprety경로 에러 메세지가 뜨네요...
비트맵을 메모리 스트림으로 쓴 후 넣어도 안되고...
TImage 타입으로는 아무 에러없이 실행은되는데...비트맵이 파일에 저장이 안되더라고요...불러와지지도 않고...T.T
델파이 초보가 5일째 헤메는데...쩝...답이 안나오네요...^^;;
아래 코드가 맞는지 고수님들의 귀하신 조언을 바랍니다...^^

//데이터를 저장할 컴포넌트 정의
type
  TMyData = class( TComponent )
  private
    fStrName : string;
    fStrAge : string;
    fBitmap : TBitmap;
    //fImage : TImage;
  published
    property StrName : string read fStrName write fStrName;
    property StrAge : string read fStrAge write fStrAge;
    property bitmapSet : TBitmap read fBitmap write fBitmap;
    //property ImageSet : TImage read fImage write fImage;
end;

procedure TForm1.btnOpenNewClick(Sender: TObject);
var openDlg : TOpenDialog;
    bmp : TBitmap;
begin
  openDlg := TOpenDialog.Create(Application);
  openDlg.Filter := '비트맵(bmp)|*.bmp';

  if openDlg.Execute then
  begin
    bmp := TBitmap.Create;
    imgOpenNew.Picture.Bitmap.LoadFromFile(openDlg.FileName);
    bmp.Free;
    openDlg.Free;
  end
  else
    openDlg.Free;
end;

procedure TForm1.btnSaveToFileClick(Sender: TObject);
var fileStream : TFileStream; memoryStream : TMemoryStream;
    saveDlg : TSaveDialog;
    temp : TMyData;
begin
  saveDlg := TSaveDialog.Create(Application);
  saveDlg.Filter := 'dat | *.dat';
  saveDlg.DefaultExt := 'dat';
  if saveDlg.Execute then
  begin
    temp := TMyData.Create(self);
    temp.StrName := editSaveName.Text;
    temp.StrAge := editSaveAge.Text;
    temp.bitmapSet := imgOpenNew.Picture.Bitmap;
    //temp.ImageSet := imgOpenNew;

    fileStream := TFileStream.Create(saveDlg.FileName, fmOpenWrite or fmCreate);
    fileStream.WriteComponent(temp);

    editFileName.Text := saveDlg.FileName;

    imgOpenNew.Free;
    fileStream.Free;
    temp.Free;
    saveDlg.Free;
  end
  else
    saveDlg.Free;
end;

procedure TForm1.btnOpenFromSaveFileClick(Sender: TObject);
var fileStream : TFileStream;
    temp : TMyData;
    openDlg : TOpenDialog;
begin
  openDlg := TOpenDialog.Create(Application);
  openDlg.Filter := 'dat| *.dat';

  if openDlg.Execute then
  begin
    fileStream := TFileStream.Create(openDlg.FileName, fmOpenRead);
    temp := TMyData(fileStream.ReadComponent(nil));
    InsertComponent(temp);

    editOpenName.Text := temp.StrName;
    editOpenAge.Text := temp.StrAge;
    imgOpenFromSaveFile.Picture.Bitmap.Assign(temp.bitmapSet);
    //imgOpenFromSaveFile := temp.ImageSet;

    fileStream.Free;
    temp.Free;
  end;
end;

initialization
  RegisterClasses( [TMyData] );
0  COMMENTS