Q&A

  • 컴포넌트 동적생성과 화면저장
파라독스db에서 레코드수를 읽어서 컴포넌트를 동적생생했습니다. 그런데 매번 폼이 실행될 때마다 이렇게 생성하려고 하니 비효율적인 것 같아 동적생성된 컴포넌트들만 모양 그대로 저장해서 다시 불러오고 싶습니다.

컴포넌트들을 저장하는 방법과 다시 그대로 불러오는 방법을 알고 싶습니다.

그리고 동적생성시 배열을 쓰고 있습니다.(델파이3을 쓰고 있음.)

var

MyPanel: array[0..300] of TPanel



위처럼 전역변수로 쓰고 있습니다. 그런데 db의 레코드수가 100개밖에 안된다면 메모리 낭비를 하는 것 같은데요. 이 때 다른 대안이 있을런지요? (TList같은 것을 써야 하나요?)

1  COMMENTS
  • Profile
    구창민 1999.12.07 06:22
    박성훈 wrote:

    > 파라독스db에서 레코드수를 읽어서 컴포넌트를 동적생생했습니다. 그런데 매번 폼이 실행될 때마다 이렇게 생성하려고 하니 비효율적인 것 같아 동적생성된 컴포넌트들만 모양 그대로 저장해서 다시 불러오고 싶습니다.

    > 컴포넌트들을 저장하는 방법과 다시 그대로 불러오는 방법을 알고 싶습니다.

    > 그리고 동적생성시 배열을 쓰고 있습니다.(델파이3을 쓰고 있음.)

    > var

    > MyPanel: array[0..300] of TPanel

    >

    > 위처럼 전역변수로 쓰고 있습니다. 그런데 db의 레코드수가 100개밖에 안된다면 메모리 낭비를 하는 것 같은데요. 이 때 다른 대안이 있을런지요? (TList같은 것을 써야 하나요?)





    안녕하세요? 구창민입니다.



    아래 내용은 매크로 칸튜님이 쓰신 Inside Secrets Delphi3에

    담겨져 있는 컴포넌트의 동적생성 및 가변저장기법과

    저장된 컴포넌트들을 불러오는 예제소스입니다.



    테스트 해보니 멋지게 동작하더군요.

    찬찬히 살펴보시면 저장하고, 로드하는 기법을 보실수 있을 것입니다.

    TFileStream 을 사용하는 곳을 눈여겨 보세요.

    ReadComponent 와 WriteComponent메소드를 사용하는 것을 볼수 있습니다.



    그럼.. 즐거운 프로그래밍 되시길~~



    unit Cref_f;



    interface



    uses

    SysUtils, WinTypes, WinProcs, Messages, Classes,

    Graphics, Controls, Forms, Dialogs, StdCtrls,

    ExtCtrls, Menus;



    type

    CRefType = class of TControl;

    TForm1 = class(TForm)

    MainMenu1: TMainMenu;

    File1: TMenuItem;

    Exit1: TMenuItem;

    N1: TMenuItem;

    SaveAs1: TMenuItem;

    Open1: TMenuItem;

    New1: TMenuItem;

    Help1: TMenuItem;

    About1: TMenuItem;

    Panel1: TPanel;

    RadioRadioButton: TRadioButton;

    ButtonRadioButton: TRadioButton;

    EditRadioButton: TRadioButton;

    OpenDialog1: TOpenDialog;

    SaveDialog1: TSaveDialog;

    procedure RadioButtonRadioClick(Sender: TObject);

    procedure RadioButtonButtonClick(Sender: TObject);

    procedure RadioButtonEditClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure FormMouseDown(Sender: TObject;

    Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    procedure New1Click(Sender: TObject);

    procedure Open1Click(Sender: TObject);

    procedure SaveAs1Click(Sender: TObject);

    procedure About1Click(Sender: TObject);

    procedure Exit1Click(Sender: TObject);

    private

    ClassRef: CRefType;

    Counter: Integer;

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    procedure TForm1.RadioButtonRadioClick(Sender: TObject);

    begin

    ClassRef := TRadioButton;

    end;



    procedure TForm1.RadioButtonButtonClick(Sender: TObject);

    begin

    ClassRef := TButton;

    end;



    procedure TForm1.RadioButtonEditClick(Sender: TObject);

    begin

    ClassRef := TEdit;

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    ClassRef := TRadioButton;

    Counter := 0;

    end;



    procedure TForm1.FormMouseDown(Sender: TObject;

    Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    var

    MyObj: TControl;

    MyName: String;

    begin

    {create an object using the current class reference}

    MyObj := ClassRef.Create (self);

    MyObj.Parent := self;

    MyObj.Left := X;

    MyObj.Top := Y;

    Inc (Counter);

    {define the name using the class name, without the

    initial T, and the number of the Counter}

    MyName := ClassRef.ClassName + IntToStr (Counter);

    Delete (MyName, 1, 1);

    MyObj.Name := MyName;

    MyObj.Visible := True;

    end;



    procedure TForm1.New1Click(Sender: TObject);

    var

    I: Integer;

    begin

    {delete all existing components, except the panel}

    for I := ControlCount - 1 downto 0 do

    if Controls[I].ClassName <> 'TPanel' then

    Controls[I].Free;

    Counter := 0;

    end;



    procedure TForm1.Open1Click(Sender: TObject);

    var

    S: TFileStream;

    New: TComponent;

    begin

    if OpenDialog1.Execute then

    begin

    {remove existing controls}

    New1Click (self);



    {open the stream}

    S := TFileStream.Create (OpenDialog1.FileName,

    fmOpenRead);

    try

    while S.Position < S.Size do

    begin

    {read a component and add it to the form}

    New := S.ReadComponent (nil);

    InsertControl (New as TControl);

    Inc (Counter);

    end;

    finally

    S.Free;

    end;

    end;

    end;



    procedure TForm1.SaveAs1Click(Sender: TObject);

    var

    S: TFileStream;

    I: Integer;

    begin

    if SaveDialog1.Execute then

    begin

    {open or create the stream file}

    S := TFileStream.Create (SaveDialog1.FileName,

    fmOpenWrite or fmCreate);

    try

    {save each component except the panel}

    for I := 0 to ControlCount - 1 do

    if Controls[I].ClassName <> 'TPanel' then

    S.WriteComponent (Controls[I]);

    finally

    S.Free;

    end;

    end;

    end;



    procedure TForm1.About1Click(Sender: TObject);

    begin

    MessageDlg ('CREF2 Example: Save components to file' +

    Chr(13) + 'From "Mastering Delphi", by Marco Cant?,

    mtInformation, [mbOk], 0);

    end;



    procedure TForm1.Exit1Click(Sender: TObject);

    begin

    Close;

    end;



    initialization

    {register the classes of the components; this code is

    required by the stream loader}

    RegisterClasses ([TRadioButton, TEdit, TButton]);

    end.