View Full Version : مشكيل با دستور for
ali guard
جمعه 18 دی 1394, 19:35 عصر
سلام دوستان من اين FOR نويشتم ميخواهم با هر بار تكرار شودن متخير VAL توى EDIT نيشون بدة كدش ك نويشتم ولى تا ثايان حلقة نيشون نميدو
For i:=1 to 100 dobegin
Sleep(50);
Edit1.Text:= FloatToStr(val);
val := StrToInt(code);
val:= val * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 * 3.14* 3.14* 3.14* 3.14* 3.14* 3.14+val;
if val < 1462843 THen
val:= val + 777 ;
Edit1.Text:= FloatToStr(val - i);
ProgressBar1.Position:=i;
end
developing
شنبه 19 دی 1394, 08:12 صبح
باسلام
کدی که نوشتید به درد نمیخوره. یعنی کار خاصی انجام نمیده.
اینکه یک عدد ثابت رو 100 بار منهای متغیر حلقه کنی، چه کاربردی داره؟
بعدش هم حلقه for خیلی سریع اجرا میشه، اگر عددی رو توی اینجور حلقه ها بنویسی، حتی نمی تونید اعداد رو تشخیص بدید. مگر بخواید روند اجرا رو به کاربر نشون بدید، که بدونه الان داره کاری توسط نرم افزار انجام میشه.
اما به هر حال راه حل شما به صورت زیر است:
هر جا بخوای یک کامپوننت (از جمله Label, Edit, ComboBox, Memo, RichEdit, ...) مقدار خودش رو برای شما نشون بده. باید نوسازیش کنی (Refresh)
یعنی در مثال شما، کافیه هر جا میخوای مقدار Edit نمایش داده بشه کد زیر رو به کار ببر:
Edit1.Refresh;
امیدوارم سودمند بوده باشد.
golbafan
شنبه 19 دی 1394, 23:28 عصر
سلام
For i := 1 to 100 do
begin
Sleep(50);
Edit1.Text := FloatToStr(val);
val := StrToInt(code);
val := val * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 * 3.14 *
3.14 * 3.14 + val;
if val < 1462843 THen
val := val + 777;
Edit1.Text := FloatToStr(val - i);
ProgressBar1.Position := i;
Application.ProcessMessages;
end;
ali guard
یک شنبه 20 دی 1394, 09:15 صبح
سلام خيلى ممنون از جوابتون همون كدى كة خودم نويشتم با اضافة كر دنى edit1.refresh حل شود ولى ميشة بكيد ان خط يانى ضى Application.ProcessMessages;
golbafan
یک شنبه 20 دی 1394, 09:32 صبح
سلام
Application.ProcessMessages یک مسیج از برنامه به سمت سیستم عامل ارسال میکنه تا thread مربوط به نرم افزار شما رو رفرش کنه
این روش بهتر از edit1.refresh هست چون باعث رفرش شدن واقعی کل برنامه شما میشه و برای مثال میتونید هنگام انجام procedure تون فرم پنجره رو با موس تغییر سایز بدید :لبخندساده:
یوسف زالی
یک شنبه 20 دی 1394, 10:01 صبح
این روش بهتر از edit1.refresh هست چون باعث رفرش شدن واقعی کل برنامه شما میشه
دقیقا دلیل فاجعه بودن این روش همینیه که گفتید.
در این روش ممکنه روی دکمه دیگری وسط پروسس کلیک بشه یا این که پروسه های رویداد های مختلف ناخواسته اجرا بشن.
در بهترین شرایط باعث کندی برنامه خواهد شد.
اگر هیچ کدوم از اینها مهم نیست استفاده کنید.
استفاده از این دستور باعث می شه تمام صف پیغام های برنامه از اول تا آخر پردازش بشوند.
ali guard
یک شنبه 20 دی 1394, 11:26 صبح
باسلام
کدی که نوشتید به درد نمیخوره. یعنی کار خاصی انجام نمیده.
اینکه یک عدد ثابت رو 100 بار منهای متغیر حلقه کنی، چه کاربردی داره؟
بعدش هم حلقه for خیلی سریع اجرا میشه، اگر عددی رو توی اینجور حلقه ها بنویسی، حتی نمی تونید اعداد رو تشخیص بدید. مگر بخواید روند اجرا رو به کاربر نشون بدید، که بدونه الان داره کاری توسط نرم افزار انجام میشه.
اما به هر حال راه حل شما به صورت زیر است:
هر جا بخوای یک کامپوننت (از جمله Label, Edit, ComboBox, Memo, RichEdit, ...) مقدار خودش رو برای شما نشون بده. باید نوسازیش کنی (Refresh)
یعنی در مثال شما، کافیه هر جا میخوای مقدار Edit نمایش داده بشه کد زیر رو به کار ببر:
Edit1.Refresh;
امیدوارم سودمند بوده باشد.
عدد ثابت نيست از يك جاى ديكة با edit مياد باد edit رو كاربر ميتونة بينة و نتيجةى ان در ديتابيس جيك ميشود
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.