PDA

View Full Version : چگونه Left وTop را کنترل کرد در تولید یک آبجکت(component)



mehdirayaneh
شنبه 26 اسفند 1385, 18:02 عصر
چگونه Left ,Top کنترل کرد در تولید یک آبجکت(component)
من دستور برای تولید component Button را دارم که داخل یک for قرار دادم و nتا Button تولید می کنه وقت وقتی تولید می کنه Left ,Top آن بصورت زیر کد

for I := 1 to ADOTable1.RecordCount do
begin
RuntimeBtn:=TsButton.Create(Self);
RuntimeBtn.Name:='d'+inttostr(ADOTable1.FieldValue s['ID_FOOD']);
RuntimeBtn.BiDiMode:=bdRightToLeft;
RuntimeBtn.Caption:='ff';
RuntimeBtn.Enabled:=True;
RuntimeBtn.Height:=33;
RuntimeBtn.Width:=81;
/////////
RuntimeBtn.Left:=5;
RuntimeBtn.Top:=iTop;
Inc(iTop,35);
///////////////
RuntimeBtn.Font.Name:='B Titr';
RuntimeBtn.Tag:=0;
RuntimeBtn.OnClick:=Button6.OnClick;
ADOTable1.Next;
end
این کد دکمه تولید می کنه اما دکمه ها(Button ) بصورت ستونی به سمت پایین می رود اگر باید 50 دکمه داشته باشیم 30 تا نمایش داده مشود و بقیه از فرم برنامه خارج می شه راهی وجود داره که از فرم خارج نشود 2- اگر 50 تا دکمه داریم بصورت 2 تا 25 تایی کنار هم نمایش داده شود

mehdirayaneh
شنبه 26 اسفند 1385, 18:23 عصر
البته بکم از این روش استفاده کردم

if i<=15 then
begin
RuntimeBtn.Left:=100;
RuntimeBtn.Top:=iTop-40;
end;
اما این روش تولید دکمه ها(Button) را محدود کرده است
و باید برای هر تعداد(Button) یک شرط بنویسم و خود هم یک مشکل و خواستم اگر کسی در این رابطه راه حل مناسب داره من را راهنمایی کند

Sohrab_Tapar
شنبه 26 اسفند 1385, 20:56 عصر
میتونی هم دکمه ها در یکTScrollbar قرار بدی

ghabil
شنبه 26 اسفند 1385, 21:58 عصر
اگر 50 تا دکمه داریم بصورت 2 تا 25 تایی کنار هم نمایش داده شود



var
Aleft, i : Integer;
begin
ALeft := 5;
for I := 1 to ADOTable1.RecordCount do
begin
RuntimeBtn:=TsButton.Create(Self);
with RuntimeBtn do
begin
if (I mod 26) = 0 then ALeft := ALeft + 100;
Name:='d'+inttostr(ADOTable1.FieldValues['ID_FOOD']);
BiDiMode:=bdRightToLeft;
Caption:='ff';
Enabled:=True;
Height:=33;
Width:=81;
/////////
Left:=ALeft;
Top:=iTop;
Inc(iTop,35);
///////////////
Font.Name:='B Titr';
Tag:=0;
OnClick:=Button6.OnClick;
end;
ADOTable1.Next;
end
end;



جدای از کد ببین یک with بزاری چقدر بهتر میشه کدت.

mehdirayaneh
یک شنبه 27 اسفند 1385, 10:04 صبح
راستش ما داخل یک TScrollbar گذاشتم اما بصورت ستونی به سمت پایین می رود من می خواستم اگر 50 تا دکمه را بصورت 2 تا 25 تایی این عدد را نسبت به اندازهTScrollbar که ما تعیین کردیم

mehdirayaneh
یک شنبه 27 اسفند 1385, 10:05 صبح
راستش ما داخل یک TScrollbar گذاشتم اما بصورت ستونی به سمت پایین می رود من می خواستم اگر 50 تا دکمه را بصورت 2 تا 25 تایی کنار هم بگذارد این عدد را نسبت به اندازهTScrollbar که ما تعیین کردیم

mehdirayaneh
یک شنبه 27 اسفند 1385, 10:19 صبح
با کمک اقای کوشا این کد را نوشتم

iTop:=35;
ALeft := 5;
for I := 1 to ADOTable1.RecordCount do
begin
RuntimeBtn:=TsButton.Create(Self);
with RuntimeBtn do
begin
////////////
if (I mod 26) = 0 then iTop := 35;
if (I mod 26) = 0 then ALeft := ALeft + 100;
/////////////
Name:='d'+inttostr(ADOTable1.FieldValues['ID_FOOD']);
BiDiMode:=bdRightToLeft;
Caption:='ff';
Enabled:=True;
Height:=33;
Width:=81;
/////////
Left:=ALeft;
Top:=iTop;
Inc(iTop,35);
///////////////
Font.Name:='B Titr';
Tag:=0;
OnClick:=Button6.OnClick;
RuntimeBtn.Parent:=sScrollBox1;
end;
ADOTable1.Next;
end

mehdirayaneh
یک شنبه 27 اسفند 1385, 10:55 صبح
اما این کد که نوشتم یک مشکل داره مشکل این که وقتی 40 تا دکمه داری و عددی که تقسیم می کنی آن عدد دکمه آن هم نمی یاد مثلا if (I mod 26) = 0 then iTop := 35 عدد تقسیم ما 26 هست و دکمه 26 را نمایش نمی دهد

Sohrab_Tapar
یک شنبه 27 اسفند 1385, 22:52 عصر
کدت رو به این صورت تغییر بده:


for I := 0 to ADOTable1.RecordCount-1 do

ghabil
یک شنبه 27 اسفند 1385, 23:02 عصر
کدت رو به این صورت تغییر بده:


for I := 0 to ADOTable1.RecordCount-1 do


چه ربطی داره؟!

مطمئنی که دکمه 26 نمیاد؟! یکبار کپشن دکمهات رو بزار IntToStr(i) ببین واقعا نمیاد؟ ممکنه آخرین دکه رو نمیبنی اگر اینطوره بجای 26 بکنش 27

Sohrab_Tapar
یک شنبه 27 اسفند 1385, 23:41 عصر
چه ربطی داره؟!


درسته هیچ ربطی نداشت اشتباه شد



ممکنه آخرین دکه رو نمیبنی اگر اینطوره بجای 26 بکنش 27

این کار 2 ردیف 26 تایی برات میسازه

mehdirayaneh
سه شنبه 29 اسفند 1385, 01:58 صبح
نمایش داده می شود اما باید دو ردیف 26 تایی نمایش بده سه ردیف اولی 25 دومی 26 وسومی 1 رانمایش می دهد وردیف اول را که دکمه 26 باشه را به ردیف دوم می بره

ghabil
سه شنبه 29 اسفند 1385, 13:31 عصر
گفتم که اینطوریش کن :


if (i mod 27) = 0 then
iTop:= 35;
ALeft := Aleft + 100;
end;