View Full Version : درباره ساخت کنترل run time
iamehsan56
دوشنبه 30 شهریور 1388, 19:36 عصر
سلام
من یه برنامه نوشتم که به user اجازه می ده که هر تعداد کنترل مثل buttom روی یه فرم بسازه . در واقع این کنترل ها به شکل run time ساخته می شن .
و من در نهایت اونها رو به فرم یه ini در فایل ذخیره می کنم .
مشکل من اینه که وقتی اطلاعات کنترل هارو تو یه فایل ذخیره می کنم هنگام load کردن اون فایل تو یه حلقه باید از فایل بخونم و در نهایت اونارو بسازم و وقتی تعداد کنترل ها زیاد باشه که واسه منظور من معمولا خیلی زیاده ، ساخته شدن ترتیبی کنترل ها زمان می بره که بایدم اینطور باشه .
می خوام ببینم را دیگه ای واسه اینکار وجود داره . چون مثلا نرم افزارای دیگه ای که محیط طراحی این شکلی دارن خیلی سریع load می شن . می خوام بدونم از چه تکنیکی استفاده می شه ؟
لطفا راهنماییم کنید
ممنون
AliReza Vafakhah
دوشنبه 30 شهریور 1388, 23:09 عصر
به نظر من اگه از therad استفاده کنی هم باعث میشه برنامه ات هنگ نکنه و هم اینکه کنترل ها رو متناوب load کنی و کارهای دیگه ای هم انجام بدی
حالا باز ببینیم بقیه دوستان چه نظری دارن
iamehsan56
سه شنبه 31 شهریور 1388, 07:12 صبح
من اتفاقا از thread استفاده می کنم و مشکل hang شدن ندارم . می خوام بدونم برنامه های دیگه که اینقدر به سرعت object هاشونو load می کنن از چه تکنیکی استفاده می کنن
ممنون باز هم
iamehsan56
سه شنبه 31 شهریور 1388, 15:04 عصر
مثلا corel و photo shop یا از این قبیل چطور اینقدر سریعن .
AliReza Vafakhah
سه شنبه 31 شهریور 1388, 18:18 عصر
من اتفاقا از thread استفاده می کنم و مشکل hang شدن ندارم . می خوام بدونم برنامه های دیگه که اینقدر به سرعت object هاشونو load می کنن از چه تکنیکی استفاده می کنن
ممنون باز هم
این طور نرم افزارها بیشتر از کنترل هایی که خودشون می سازند استفاده میکنن و یا شاید الگوریتم بهتری برای ساخت اجزار در حافظه استفاده میکنن
مثلا Button را ایجاد میکنند که خصوصیاتی که آنها نیاز دارند را دارا باشد
iamehsan56
چهارشنبه 01 مهر 1388, 07:47 صبح
تو زو خدا کسی نیست که یک کم تکنیکی تر بتونه کمک کنه . می خوام برنامه ام رو بر این اساس بنویسم
Felony
چهارشنبه 01 مهر 1388, 09:01 صبح
این کار شما به هیچ وجه علمی و منطقی نیست با این کار اگه برنامه شما 1000 تا شئ داشته باشه باید کاربر 5 دقیقه وایسه تا اشیاء بارگزاری بشن .
از توابع ReadComponentRes و WriteComponentRes استفاده کنید .
لینک (http://barnamenevis.org/forum/showthread.php?t=171230) یه تاپیک در همین مورد .
iamehsan56
چهارشنبه 01 مهر 1388, 15:32 عصر
ممنون دوست عزیز .لینک مفید بود
من این code رو ساده اینطوری نوشتم
procedure TForm1.Button1Click(Sender: TObject);
var
but:TButton;
begin
but:=TButton.Create(self);;
but.Top:=0;
but.Left:=0;
but.Width:=120;
but.Height:=120;
but.Parent:=form1;
but.Name:='but';
showmessage('1 button created run time');
WriteComponentResFile('C:\but.bin',but);
but.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
b,c,but:tbutton;
begin
b:=ReadComponentResFile('c:\but.bin', b) as tbutton;
end;
اما همونطوری که خودتونم گفته بودین و قتی رو button ی که عمل read کردن رو داره انجام می ده کلیک می کنی ، اون button از بین می ره.
کسی می دونه چرا ؟
ممنون می شم راهنمایی بفرمایید .
iamehsan56
چهارشنبه 01 مهر 1388, 15:42 عصر
بازم سلام
من یه راه حلی واسه ناپدید شدنش پیدا کردم .
اما دلیل ناپدید شدن رو هنوز نفهمیدم
procedure TForm1.Button1Click(Sender: TObject);
var
but:TButton;
begin
but:=TButton.Create(self);;
but.Top:=0;
but.Left:=0;
but.Width:=120;
but.Height:=120;
but.Parent:=form1;
but.Name:='but';
showmessage('1 button created run time');
WriteComponentResFile('C:\but.bin',but);
but.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
b:tbutton;
begin
b:=TButton.Create(nil);
b.Parent:=form1;
ReadComponentResFile('c:\but.bin', b);
showmessage('remember free it ');
FreeAndNil(b);
end;
اینم خود برنامه که ضمیمه کردم
iamehsan56
چهارشنبه 01 مهر 1388, 16:45 عصر
اما حالا یه مساله هست . اونم این که چطور کل محتوای یه فرم رو تو فایل ذخیره و بازیابی کنم . در واقع باید یه فابل dfm بسازم و ازش بخونم . کسی می تونه کمک کنه
ممنون می شم
Saeed_m_Farid
چهارشنبه 01 مهر 1388, 17:07 عصر
اما حالا یه مساله هست . اونم این که چطور کل محتوای یه فرم رو تو فایل ذخیره و بازیابی کنم . در واقع باید یه فابل dfm بسازم و ازش بخونم . کسی می تونه کمک کنه
ممنون می شم
اگه یه جستجو می کردین پیدا می کردید :
برای ذخیره یه فرم با سه تا عنصر :
unit object_to_text_u;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
m : TMemoryStream;
f : TFileStream;
begin
//events are a bit Problematic
//therefore, left out this event
Button1.OnClick := nil;
m := TMemoryStream.Create;
f := TFileStream.Create('d:\testdfm.txt',fmCreate);
try
m.WriteComponent(self);
m.Position := 0;
ObjectBinaryToText(m,f);
finally
m.Free;
f.Free;
Button1.OnClick := Button1Click;
end;
end;
end.
برای بازیابی همون فرم تو یه پروژه جدید :
unit text_to_object_u;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure Button1Click(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
m : TMemoryStream;
f : TFileStream;
begin
f := TFileStream.Create('d:\testdfm.txt',fmOpenRead);
m := TMemoryStream.Create;
try
ObjectTextToBinary(f,m);
m.Position := 0;
m.ReadComponent(self);
finally
m.Free;
f.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('DummyButtonClick');
end;
initialization
RegisterClasses([TEdit,TMemo,TButton]);
end.
موفق باشید.
iamehsan56
چهارشنبه 01 مهر 1388, 17:12 عصر
خوب فکر می کنم یه چیز خوب پیدا کردم
می ذارمش اینجا
فکر می کنم کامل باشه
باید نگاش کنم
این آدرسشه
http://www.delphisources.ru/pages/faq/base/stream_comp.html
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.