PDA

View Full Version : افزایش سرعت در ساخت اشیای VCL



sajioo
چهارشنبه 03 اردیبهشت 1393, 11:48 صبح
دوستان عزیزم سلام و وقت بخیر یک سوال داشتم که فکر کنم افرادی که تجربه ی این کارو داشته باشن بتونن جواب بدن.
بنده در یک حلقه ی for یک panel می سازم و درون این پنل 5 تا label میسازم.
مثلا اگر این حلقه ی for قرار باشه 100 بار اجرا بشه 6 7 ثانیه زمان میبره.
راهی نیست این کاهش پیدا کنه؟
موازی کاری بکنم یا چیز دیگه؟:متفکر:

یوسف زالی
چهارشنبه 03 اردیبهشت 1393, 12:13 عصر
سلام.
اگر فقط دارید می سازید نباید این قدر طول بکشه.
یکی از روشهایی که تاثیر مثبتی داره، اینه که تمام اشیایی که دارند ساخته می شوند رو بصورت مخفی بسازید و پس از پایان کار اونها رو شو کنید. این کار از رفرش های بیهوده جلوگیری می کنه. از روشهای دیگه ای که می تونه موثر باشه استفاده از توابعی مثل BeginUpdate هست، مثلا برای گرید ها خیلی موثره: DBGrid1.Columns.BeginUpdate

اما برای ست کردن مقادیر ممکنه اشتباهاتی داشته باشید. مثلا به جای ست کردن top, left, width, height بصورت تک تک، می تونید از SetBounds استفاده کنید و از این دست توابع.

sajioo
چهارشنبه 03 اردیبهشت 1393, 13:16 عصر
تشکر از you see از بابت راهنمایی امروز و دیروزش
این کد رو توجه کن لطفا




function Cdesck(panel:TsPanel;parentp:TsScrollBox;name:stri ng;cont:Integer; img:TImage;pic:TImage;lab:TTntLabel;caption:string ) :Boolean;
var
k:Integer;
begin
panel:=TsPanel.Create(panel);
with panel do
begin
Parent:=Parentp;
Height:=80;
Width:=200;
k:=(Floor(cont/3))%3;
top:=k*80+20;
k:=Floor(cont%3);
Left:=k*200+20;
Name:=name;
Caption:='';
end;
img:=TImage.Create(img);
with img do
begin
Parent:=panel;
Picture:=pic.Picture;
Height:=80;
Width:=80;
Left:=120;
top:=0;
Stretch:=True;
end;
lab:=TTntLabel.Create(lab);
with lab do
begin
Parent:=panel;
BiDiMode:=bdRightToLeftNoAlign;
Left:=10;
top:=20;
Name:='lab'+IntToStr(cont);
Caption:=Caption;
end;
lab:=TTntLabel.Create(lab);
with lab do
begin
Parent:=panel;
BiDiMode:=bdRightToLeftNoAlign;
Left:=10;
top:=40;
Name:='lab'+IntToStr(cont+1);
Caption:=Caption;
end;

end;







while i<j do
begin
Cdesck(panel,form3.sScrollBox2,command[i],i,img,form2.Image1,lab,command[i]) ;
inc(i,2);
end;




اگه لطفا راهی برای بهینه سازیش هست لطفا بمن بگو. تشکر

یوسف زالی
چهارشنبه 03 اردیبهشت 1393, 13:29 عصر
گفته های پست قبلیم رو به کار نبردید پس چرا؟
تابع شما ایراد داره،
مثلا چرا پارامتر ورودی فرستادید بعد اون رو دوباره ساختید؟


panel := TsPanel.Create(panel);

در مورد img و lbl هم همینطوره.
تابع رو از سر بنویسید و گفته های پست قبل رو هم اعمال کنید، دوباره تست کنید.

sajioo
چهارشنبه 03 اردیبهشت 1393, 13:43 عصر
اما برای ست کردن مقادیر ممکنه اشتباهاتی داشته باشید. مثلا به جای ست کردن top, left, width, height بصورت تک تک، می تونید از SetBounds استفاده کنید و از این دست توابع.



you see جان لطفا درباره این خط توضیح کوچیکی بمن بده. من با setbounds کار نکردم آخه تاحالا:اشتباه:

sajioo
چهارشنبه 03 اردیبهشت 1393, 13:46 عصر
مثلا چرا پارامتر ورودی فرستادید بعد اون رو دوباره ساختید؟

خوب این پرامتر ورودی یک متغییر از نوع Tspanel هستش.
چه راهی پیشنهاد میدی؟

یوسف زالی
چهارشنبه 03 اردیبهشت 1393, 13:50 عصر
بدون اون پارامتر، مثلا اگر در var تعریفش می کردید چه فرقی می کرد؟
setbounds رو بنویسید، تو پارامترهاش shift + ctrl + space بزنید ببینید چیا داره. معلومه. مثلا panel.setbounds

sajioo
چهارشنبه 03 اردیبهشت 1393, 14:36 عصر
function Cdesck(parentp:TsScrollBox;name:string;cont:Intege r;pic:TImage;caption:string) :Boolean;
var
k,j:Integer;
panel:TsPanel;
img:TImage;
lab:TTntLabel;
begin
panel:=TsPanel.Create(parentp);
with panel do
begin
Parent:=Parentp;
SetBounds(20,cont*80,200,80);
Name:=name;
Caption:='';
end;
img:=TImage.Create(parentp);
with img do
begin
Parent:=panel;
Picture:=pic.Picture;
SetBounds(120,0,80,80);
Stretch:=True;
end;
lab:=TTntLabel.Create(parentp);
with lab do
begin
Parent:=panel;
BiDiMode:=bdRightToLeftNoAlign;

SetBounds(10,20,10,10);
Name:='lab'+IntToStr(cont);
Caption:=Caption;
end;
lab:=TTntLabel.Create(parentp);
with lab do
begin
Parent:=panel;
BiDiMode:=bdRightToLeftNoAlign;

SetBounds(10,40,10,10);
Name:='lab'+IntToStr(cont+1);
Caption:=Caption;
end;

end;



you see جان باز هم وقتی 100 بار تابع رو اجرا میکنم خیلی طول میکشه.
یک چیز متوجه شدم اگر همه عناصر تولیدی left و top یکسان داشته باشند زمانش خیلی پایین میاد اما اگر یکسان نباشه 7 8 ثانیه طول میکشه.
عجیبه واقعا

یوسف زالی
چهارشنبه 03 اردیبهشت 1393, 16:12 عصر
مطالب بالا رو درست اجرا نمی کنید. با کمی دقت متوجه می شدید:



function CDesk(ParentCtrl: TWinControl; ID: Integer; Pic: TImage; ACaption: string): Boolean;
var
Panel: TPanel;
begin
Panel := TPanel.Create(ParentCtrl);
with Panel do
begin
Parent := ParentCtrl;
SetBounds(20, ID * 80, 200, 80);
Name := 'pnl_' + IntToStr(ID);
Caption := '';
end;


with TImage.Create(Panel) do
begin
Parent := Panel;
Picture.Assign(Pic.Picture);
SetBounds(120, 0, 80, 80);
Stretch := True;
end;


with TLabel.Create(Panel) do
begin
Parent := Panel;
BiDiMode := bdRightToLeftNoAlign;
SetBounds(10, 20, 10, 10);
Name := 'lbl1_' + IntToStr(ID);
Caption := ACaption;
end;


with TLabel.Create(Panel) do
begin
Parent := Panel;
BiDiMode := bdRightToLeftNoAlign;
SetBounds(10, 40, 10, 10);
Name:='lbl2_' + IntToStr(ID);
Caption := ACaption;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
ScrollBox1.Hide;


for i := 0 to 100 do
CDesk(ScrollBox1, i, Image1, 'Cap');


ScrollBox1.Show;
end;