PDA

View Full Version : سوال: سوال در مورد اجرای Timer



fire.angle
چهارشنبه 31 فروردین 1390, 18:24 عصر
سلام
من یه Case نوشتم و حالت های مختلف اون Timer هام رو Enable کردم اما مشکل اینه که Case بدون توجه با اینکه Timer هنوز در حال اجراست Case های بعدی رو اجرا میکنه

procedure TForm1.Button1Click(Sender: TObject);
begin
k:=0;
i:=1;
while StrToInt(Dirty)<>0 do
begin
case Dirty[i] of
'0' :
begin
TimerRight.Enabled:=true;
end;
'1' :
begin
timerLeft.Enabled:=true;
end;
'2' :
begin
timerUp.Enabled:=true;
end;
i:=i+1;
end; //End While
end;


در اینجا پشت سر هم هر سه تایمر رو فعال میکنه
من میخوام تا زمانی که کار تایمیر اول تمام نشده Case بعدی بررسی نشه
چیکار کنم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Felony
چهارشنبه 31 فروردین 1390, 19:56 عصر
این کد قراراه چی کار بکنه ؟ سر تا پاش مشکله ! اصلا چه طور کامپایلش کردی که فهمیدی مشکل داره ؟!

این خط برای چی هست : while StrToInt(Dirty)<>0 do ؟ قراره کارکتر ها رو جدا کنه و تو Case بررسی کنه ؟ الان با این کدی که نوشتی تو یک حلقه بینهایت میافتی چون اگر مقدار Dirty برابر با 012 باشه با تبدیل به عدد میشه 12 و عدد 12 هیچ وقت مساوی 0 نیست !!! کد باید به صورت زیر نوشته بشه :
while i <= Length(Dirty) do

این خط : i:= i+1 چرا داخل بلوک Case هست ؟! باید بیرون از بلوک Case و داخل While نوشته بشه ؛ کدتون به صورت زیر باید در بیاد تا تازه کامپایل بشه و درست کار کنه :

procedure TForm1.Button1Click(Sender: TObject);
begin
while i <= Length(Dirty) do
begin
case Dirty[i] of
'0' :
begin
TimerRight.Enabled:=true;
end;
'1' :
begin
TimerLeft.Enabled:=true;
end;
'2' :
begin
TimerUp.Enabled:=true;
end;
end; //End While
i:= i+1;
end;
end;


در اینجا پشت سر هم هر سه تایمر رو فعال میکنه
من میخوام تا زمانی که کار تایمیر اول تمام نشده Case بعدی بررسی نشه
اگر متن رشته Dirty برابر با 012 هست باید هم هر 3 تایمر رو فعال کنه !
این کد رو برای چه کاری نوشتی ؟ رفع کردن اون مشکل کار سختی نیست ولی هر چی فکر میکنم دلیلی برای این شیوه کدنویسی پیدا نمیکنم .

SAASTN
چهارشنبه 31 فروردین 1390, 20:41 عصر
این خط : i:= i+1 چرا داخل بلوک Case هست ؟! باید بیرون از بلوک Case و داخل While نوشته بشه ؛
درواقع به نظر میاد که i:= i+1 داخل بلوک while هست و در واقع این End بلوک case هست که پاک شده.
ولی جدا از این بحث سینتکسی تصور می کنم که منظور دوستمون چیزی شبیه به این هست:
procedure TForm1.Button1Click(Sender: TObject);
begin
k := 0;
i := 1;
while StrToInt(Dirty) <> 0 do
begin
case Dirty[i] of
'0':
begin
if not (TimerRight.Enabled or TimerLeft.Enabled or Timerup.Enabled) then
TimerRight.Enabled := true;
end;
'1':
begin
if not (TimerRight.Enabled or TimerLeft.Enabled or Timerup.Enabled) then
TimerLeft.Enabled := true;
end;
'2':
begin
if not (TimerRight.Enabled or TimerLeft.Enabled or Timerup.Enabled) then
Timerup.Enabled := true;
end;
end;
i := i + 1;
end; // End While
end;

fire.angle
پنج شنبه 01 اردیبهشت 1390, 10:23 صبح
سلام دستتون درد نکنه...
من برای راحتی کار شما در پاسخگویی قسمت هایی از کد اصلی رو قرار دادم . که ظاهرا یه قسمت های مهمی رو جا انداختم و گرنه کد بدرستی اجرا میشه فقط همون مشکلی رو که گفتم دارم که اونم حل شد
متشکرم