PDA

View Full Version : چگونگی انجام دادن یک عمل یکسان روی تعداد بالا از یک آبجکت در فرم



vahid64
شنبه 21 آذر 1388, 01:26 صبح
فرض کنید من 40 تا تایمر توی یک فرم دارم
حالا می خوام با تایمر 41 ام این 40 تا تایمر رو تو مثلاً بازه های 10 ثانیه ای enable/disable کنم
و همه تایمر ها هم اسامی ترتیبی دارن
چطوری میشه این کار رو انجام داد ؟
منظورم یه همچین چیزی هست

for i:= 1 to 40 do
begin
timer[i] := enable;
end;

البته من الان دارم از این روش استفاده می کنم :بامزه:

for i:= 0 to ComponentCount-1 do
begin
if Components[i] is TTimer then
begin
if ((Components[i] as TTimer).name = 'Timer'+IntToStr(i)) then
(Components[i] as TTimer).Enable:= True;
end;
end;
اما چون آبجکت های روی فرمم خیلی زیاد هست این حلقه زیادی برنامه منو کند کرده
اگه راه بهتری سراغ دارید راهنمایی کنید!

Felony
شنبه 21 آذر 1388, 06:34 صبح
این کدی که نوشتم بهینه تره ، ولی در کل کار درستی نیست 40 تا تایمر رو اینطوری فعال و غیر فعال کنی کنی !
بگو میخوای چی کار کنی ، شاید راه بهتری هم باشه .


var
i:Byte;
begin
for i:=0 to Form1.ComponentCount-1 do
if TTimer(Components[i]).Name = 'Timer'+IntToStr(i) then
TTimer(Components[i]).Enabled:=True

مصطفی ساتکی
شنبه 21 آذر 1388, 07:46 صبح
ین کدی که نوشتم بهینه تره ، ولی در کل کار درستی نیست 40 تا تایمر رو اینطوری فعال و غیر فعال کنی کنی !
بگو میخوای چی کار کنی ، شاید راه بهتری هم باشه .
جناب silversoft بین کد شما و کدی که vahid64 (http://barnamenevis.org/forum/member.php?u=29066) نوشته بود چه فرقی وجود داره.
شما می تونی از SetTimer , KillTimer به طور مستقیم استفاده کنی

Felony
شنبه 21 آذر 1388, 11:41 صبح
ین کدی که نوشتم بهینه تره ، ولی در کل کار درستی نیست 40 تا تایمر رو اینطوری فعال و غیر فعال کنی کنی !
بگو میخوای چی کار کنی ، شاید راه بهتری هم باشه .
جناب silversoft بین کد شما و کدی که vahid64 (http://barnamenevis.org/forum/member.php?u=29066) نوشته بود چه فرقی وجود داره.
شما می تونی از SetTimer , KillTimer به طور مستقیم استفاده کنی


یعنی به نظر شما فرقی نداره ؟!
به نظر شما کدوم کد بهینه تره ؟
ایشون تو کدشون یک بار چک کردن که شئ تایمر هست ، اگر بود اسمش = اسم مورد نظر هست و اگر بود فعالش کنن .

به نظرتون بین 2 تا شرط با 1 شرط تفاوتی نیست ؟

Hamid.Kad
شنبه 21 آذر 1388, 12:37 عصر
به نظر شما کدوم کد بهینه تره ؟
البته لغت "بهینه تر" یک لغت اشتباهه که امروزه خیلی رایج شده! چون بهینه صفت عالی هست:لبخندساده:


بگو میخوای چی کار کنی ، شاید راه بهتری هم باشه .
منم موافقم.
ولی اگر راه دیگری نداره بنظرم اگه تایمرها رو آرایه در نظر بگبرید و با آرایه کار کنید سرعت بیشتر میشه. مثل کد اولی که خودتون نوشتید.

tdkhakpur
شنبه 21 آذر 1388, 13:38 عصر
من جای شماها بودم 40 آرایه از نوع bool می ساختم و ture یا false بودن را داخل همه تایمرها بررسی میکردم و با true بودن اجازه عملیات را به پروسه های تایمر میدادم.(و این سریعترین و بهترین کاری هست که میشه کرد)


var
IsEnable : arrya[1..40] of boolean;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IsEnable[1] = true then
begin
// کدهای برنامه تایمر اول
end;
end;
.
.
.
procedure TForm1.Timer40Timer(Sender: TObject);
begin
if IsEnable[40] = true then
begin
// کدهای برنامه تایمر چهلم
end;
end;


procedure TForm1.Timer41Timer(Sender: TObject);
begin
IsEnable[40] := not IsEnable[40] ; // فعال و غیر فعال سازی
end;

vahid64
شنبه 21 آذر 1388, 20:44 عصر
من که گفتم می خوام چی کار کنم!حالا تایمر نه یه آبجکت دیگه!
در مجموع منظورم اینه که فرضاً توی یه فرم 1000 تا آبجکت باشه 200 تاش مثل هم باشن من می خوام یه پروپرتی اون 200 تا رو تغیر بدم!
اگه قرار استفاده از این کد باشه میره 1000 تا آبجکت رو هم بررسی می کنه که این زمان می بره و کار منو مختل می کنه!

zidane
شنبه 21 آذر 1388, 21:15 عصر
همان طور که دوستان گفتند بايد براي اين تعداد زياد، آرايه بسازيد