DELPHI FAQ: Работа с коллекциями - сохранение и загрузка


Работа с коллекциями - сохранение и загрузка
Previous  Home  Next



unit
 DelphiPt;

interface


uses

  Classes, Graphics;

type

  TDDHPoint = class
 (TCollectionItem)
  private

    fX, fY: Integer;
  public

    Text: string
;
    procedure
 WriteText (Writer: TWriter);
    procedure
 ReadText (Reader: TReader);
    procedure
 DefineProperties (Filer: TFiler); override;
    procedure
 Paint (Canvas: TCanvas);
    procedure
 Assign (Pt: TPersistent); override;
  published

    property
 X: Integer read fX write fX;
    property
 Y: Integer read fY write fY;
  end
;

  TWrapper = class
 (TComponent)
  private

    FColl: TCollection;
  published

    property
 MyColl: TCollection read FColl write FColl;
  public

    constructor
 Create (Owner: TComponent); override;
    destructor
 Destroy; override;
  end
;

implementation


// TWrapper constructor and destructor


constructor
 TWrapper.Create (Owner: TComponent);
begin

  inherited
 Create (Owner);
  FColl := TCollection.Create (TDDHPoint);
end
;

destructor
 TWrapper.Destroy;
begin

  FColl.Clear;
  FColl.Free;
  inherited
 Destroy;
end
;


// class TDDHPoint methods


procedure
 TDDHPoint.WriteText (Writer: TWriter);
begin

  Writer.WriteString (Text);
end
;

procedure
 TDDHPoint.ReadText (Reader: TReader);
begin

  Text := Reader.ReadString;
end
;

procedure
 TDDHPoint.DefineProperties (Filer: TFiler);
begin

  Filer.DefineProperty (
    'Text'
, ReadText, WriteText, (Text <> ''));
end
;

procedure
 TDDHPoint.Paint (Canvas: TCanvas);
begin

  Canvas.Ellipse (fX - 3
, fY - 3, fX + 3, fY + 3);
  Canvas.TextOut (fX + 5
, fY + 5, Text);
end
;

procedure
 TDDHPoint.Assign (Pt: TPersistent);
begin

  if
 Pt is TDDHPoint then
  begin

    fx := TDDHPoint (Pt).fX;
    fY := TDDHPoint (Pt).fY;
    Text := TDDHPoint (Pt).Text;
  end

  else

    // raise an exception

    inherited
 Assign (pt);
end
;

//initialization

//RegisterClass (TWrapper);

end
.
 



unit
 PersForm;

interface


uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls, ExtCtrls;

type

  TForm1 = class
(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    SpeedButtonLoad: TSpeedButton;
    SpeedButtonSave: TSpeedButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure
 FormCreate(Sender: TObject);
    procedure
 SpeedButtonSaveClick(Sender: TObject);
    procedure
 SpeedButtonLoadClick(Sender: TObject);
    procedure
 FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure
 FormDestroy(Sender: TObject);
    procedure
 FormPaint(Sender: TObject);
  private

    PtList: TCollection;
  end
;

var

  Form1: TForm1;

implementation


{$R *.DFM}


uses

  DelphiPt;

procedure
 TForm1.FormCreate(Sender: TObject);
begin

  PtList := TCollection.Create (TDDHPoint);
end
;

procedure
 TForm1.SpeedButtonSaveClick(Sender: TObject);
var

  Str1: TFileStream;
  Wrap: TWrapper;
begin

  if
 SaveDialog1.Execute then
  begin

    Str1 := TFileStream.Create (SaveDialog1.FileName,
      fmOpenWrite or
 fmCreate);
    try

      Wrap := TWrapper.Create (self);
      try

        Wrap.MyColl.Assign (ptList);
        Str1.WriteComponent (Wrap);
      finally

        Wrap.Free;
      end
;
    finally

      Str1.Free;
    end
;
  end
;
end
;

procedure
 TForm1.SpeedButtonLoadClick(Sender: TObject);
var

  Str1: TFileStream;
  Wrap: TWrapper;
begin

  if
 OpenDialog1.Execute then
  begin

    Str1 := TFileStream.Create (
      OpenDialog1.Filename, fmOpenRead);
    try

      Wrap := TWrapper.Create (self);
      try

        Wrap := Str1.ReadComponent (Wrap) as
 TWrapper;
        ptList.Assign (Wrap.MyColl);
      finally

        Wrap.Free;
      end
;
    finally

      Str1.Free;
      Invalidate;
      Edit1.Text := 'Point '
 + IntToStr (PtList.Count + 1);
    end
;
  end
;
end
;

procedure
 TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var

  Pt: TDDHPoint;
begin

  Pt := PtList.Add as
 TDDHPoint;
  Pt.X := X;
  Pt.Y := Y;
  Pt.Text := Edit1.Text;
  Edit1.Text := 'Point '
 + IntToStr (PtList.Count + 1);
  Invalidate;
end
;

procedure
 TForm1.FormDestroy(Sender: TObject);
begin

  // empty and destroy the list

  PtList.Clear;
  PtList.Free;
end
;

procedure
 TForm1.FormPaint(Sender: TObject);
var

  I: Integer;
begin

  for
 I := 0 to PtList.Count - 1 do
    TDDHPoint (PtList.Items [I]).Paint (Canvas);
end
;

end
.


Взято с www.delphiworld.narod.ru





DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100