파라독스db에서 레코드수를 읽어서 컴포넌트를 동적생생했습니다. 그런데 매번 폼이 실행될 때마다 이렇게 생성하려고 하니 비효율적인 것 같아 동적생성된 컴포넌트들만 모양 그대로 저장해서 다시 불러오고 싶습니다.
컴포넌트들을 저장하는 방법과 다시 그대로 불러오는 방법을 알고 싶습니다.
그리고 동적생성시 배열을 쓰고 있습니다.(델파이3을 쓰고 있음.)
var
MyPanel: array[0..300] of TPanel
위처럼 전역변수로 쓰고 있습니다. 그런데 db의 레코드수가 100개밖에 안된다면 메모리 낭비를 하는 것 같은데요. 이 때 다른 대안이 있을런지요? (TList같은 것을 써야 하나요?)
> 파라독스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.