2006. június 19., hétfő
Add controls to a form at runtime and stream the result to a file
Problem/Question/Abstract:
Is it possible to add controls to a form at runtime, then stream the result to single file, thus preserving all changes for next application run?
Answer:
Yes, with some caveats. You need to register all control classes that are used on the form plus all that the user may add at runtime. Here is a little example:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
formdata = 'formdata.bin';
procedure TForm1.Button1Click(Sender: TObject);
begin
with TEdit.Create(self) do
begin
left := button1.Left + button1.width + 10;
top := button1.top;
Name := 'NewEdit';
parent := self;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
fs: TFileStream;
begin
fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + formdata, fmCreate);
try
fs.WriteComponent(self);
finally
fs.free
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
filename: string;
fs: TFileStream;
i: integer;
begin
filename := ExtractFilePath(ParamStr(0)) + formdata;
if fileExists(filename) then
begin
for i := ComponentCount - 1 downto 0 do
Components[i].Free;
fs := Tfilestream.create(filename, fmOpenRead or fmShareDenyWrite);
try
fs.ReadComponent(self);
button1.enabled := false;
finally
fs.free
end;
end;
end;
initialization
RegisterClasses([TButton, TEdit]);
end.
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése