PDA

View Full Version : حرفه ای ها کمک کنن: ایجاد فرم به همراه چند کامپوننت مختلف در ران تایم و ذخیره آن



golbafan
جمعه 27 شهریور 1394, 23:00 عصر
سلام
من برنامه ای نوشتم که یک فرم خالی رو (بصورت MDI) کاربر بتونه ایجاد کنه و هر نوع کنترلی که خواست (انواع محدودند به button و edit و combobox) روی فرم بزاره و اونها رو به یک سری متدهایی دلخواه متصل کنه مثلا button رو که ایجاد میکنه به متد onButtonClick که قبلا موجود بوده وصل کنه و ...

تا اینجا رو مشکل ندارم و پیاده سازی کردم. :لبخند:

مشکل من اینه که نمیتونم این فرم رو دخیره کنم تا هر وقت خواست بتونه کلش رو بارگیری کنه و لازم نباشه هر دفعه از اول کنترل ها رو روی فرم بزاره
مشکل با memorystream.writecomponent هم درست نشد

کد ایجاد فرم خالی:
var
x: TForm6;
begin
Application.CreateForm(TForm6, x);
end;

کد ایجاد کامپوننت:

procedure TForm6.Button1Click(Sender: TObject);
var
b:TButton;
begin
b:=TButton.create(self);
b.onclick:=btnclick;
end;

حالا میخوام وقتی لازم شد، کاربر بتونه براحتی تمام کنترل هایی که قبلا روی فرم گزاشته بود رو لود کنه (به همراه مشخصات و متدهاشون)

golbafan
جمعه 27 شهریور 1394, 23:20 عصر
الان با دخیره شدن مشکلی ندارم
موقع لود کردنش خطا میده:
خطایی که میده: class Tbutton not found

کد من:

procedure TForm1.Button4Click(Sender: TObject);
var
FStream, SStream: TStream;
FileName: string;
begin
FileName := ExtractFilePath(Application.ExeName) + '\Form6.txt';
if not FileExists(FileName) then
exit;
FStream := TFileStream.Create(FileName, fmOpenRead);
SStream := TMemoryStream.Create;
try
ObjectTextToBinary(FStream, SStream);
SStream.Position := 0;
TForm6(ActiveMDIChild).DestroyComponents;
SStream.ReadComponent(TForm6(ActiveMDIChild));
finally
SStream.free;
FStream.free;
end;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
FStream, SStream: TStream;
FileName: string;
begin
FileName := ExtractFilePath(Application.ExeName) + '\Form6.txt';
FStream := TMemoryStream.Create;
SStream := TFileStream.Create(FileName, fmCreate);
try
FStream.WriteComponent(TForm6(ActiveMDIChild));
FStream.Position := 0;
ObjectBinaryToText(FStream, SStream);
finally
SStream.free;
FStream.free;
end;
end;

golbafan
شنبه 28 شهریور 1394, 13:42 عصر
خدا رو شکر مشکلم حل شد.

حرفه ای ها لطفاً زحمت نـکـشـن....

باید بعد از DestroyComponents از دستور registerclass استفاده میکردم

به این شکل:

TForm6(ActiveMDIChild).DestroyComponents;
TForm6(ActiveMDIChild).registerclass(tbutton);
SStream.ReadComponent(TForm6(ActiveMDIChild));