PDA

View Full Version : سوال: کند شدن برنامه



Hassan2500
یک شنبه 12 شهریور 1391, 20:52 عصر
سلام

من در برنامه ام از کد زیر استفاده کردم ولی بشدت سرعت برنامه کم شده آیا از دوستان کسی میدونه چطوری باید این کد ویرایش بشه که سرعت برنامه بالا بره

Dim i
For i = 100 To 1000
If Val(VSFlexGrid1.TextMatrix(1, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
If Val(VSFlexGrid1.TextMatrix(2, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
Next

محسن واژدی
یک شنبه 12 شهریور 1391, 21:08 عصر
سلام علیکم
کد را در چه رویدادی قرار داده اید؟، چرا که اگر در رویداد ,KeyPress,Change و نظیر اینها قرار داده باشید طبیعتا از آنجایی که رویدادهای اینچنینی بیشتر از سایر رویدادها اجرا میشوند در صورت قرار دادن حلقه هایی نظیر کد فوق در آنها سرعت عملکرد برنامه کاهش میابد
میتوانید کد را در رویدادهایی نظیر LostFocus و ... قرار دهید

موفق باشید

Hassan2500
یک شنبه 12 شهریور 1391, 21:21 عصر
کدها رو از Text1_Change به Text1_LostFocus منتقل کردم ولی در اینصورت دیگه کدها اجرا نمیشن چکار باید کنم

aleas2
یک شنبه 12 شهریور 1391, 21:38 عصر
اینو یه چک بکن اگر لازمه از 100تا 1000 همش تکرار بشه این کد تست کن

Dim i as integer
For i = 100 To 1000
text1.text=VSFlexGrid1.TextMatrix(1, i)
text2.text=VSFlexGrid1.TextMatrix(2, i)
If Val(text1.text) > 99 Then
VSFlexGrid1.ColWidth(i) = 600
elseif Val(text2.text) > 99 Then
VSFlexGrid1.ColWidth(i) = 600
end if
Next i

یا اگر لازمه یکی از این دوتا شرط برقرار شد بعد از حلقه خارج بشه این کد تست کن



Dim i as integer
For i = 100 To 1000
text1.text=VSFlexGrid1.TextMatrix(1, i)
text2.text=VSFlexGrid1.TextMatrix(2, i)
If Val(text1.text) > 99 Then
VSFlexGrid1.ColWidth(i) = 600
exit for
elseif Val(text2.text) > 99 Then
VSFlexGrid1.ColWidth(i) = 600
exit for
end if
Next i

Hassan2500
یک شنبه 12 شهریور 1391, 22:11 عصر
بازم برنامه کنده فکر کنم حلقه باید در رویدادی غیر از LostFocus قرار داده بشه چون در LostFocus کدها اجرا نمیشن کسی میدونه باید در چه رویدادی نوشته بشه یا اصلاً میشه بجای این حلقه یه چیز دیگه استفاده کرد

محسن واژدی
یک شنبه 12 شهریور 1391, 22:27 عصر
کدها را در رویداد Load فرم قرار دهید تا تنها یکبار در زمان بارگذاری فرم اجرا شوند (البته اگر به اجرای مکرر نیست)، یا در دکمه ای با عنوان Refresh تا کاربر در صورت تمایل با فشردن آن ستونهای لیست را ست کند

البته همه اینها بر پایه حدس و گمان هست، در صورت امکان بخشی از سورس که در آن به مشکل برخورد کرده اید را ضمیمه پست کنید تا مشکل سریعتر برطرف شود

موفق باشید

Hassan2500
یک شنبه 12 شهریور 1391, 22:47 عصر
جناب واژدی حالا اگه بخوام مکرر اجرا بشه و سرعت برنامه هم کم نشه باید چکار کنم

m.4.r.m
یک شنبه 12 شهریور 1391, 23:07 عصر
از دستور while استفاده کن یا بزار تو تایمر

Hassan2500
یک شنبه 12 شهریور 1391, 23:10 عصر
اگه میشه جناب m.4.r.m کد دستور while رو برام بنویسید طبق اون چیزی که در پست1 میخوام راستش در برنامه نویسی زیاد قوی نیستم

mohammadriano
یک شنبه 12 شهریور 1391, 23:22 عصر
سلام
من در برنامه ام از کد زیر استفاده کردم ولی بشدت سرعت برنامه کم شده آیا از دوستان کسی میدونه چطوری باید این کد ویرایش بشه که سرعت برنامه بالا بره
Dim i
For i = 100 To 1000
If Val(VSFlexGrid1.TextMatrix(1, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
If Val(VSFlexGrid1.TextMatrix(2, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
Next
سلام
هدف شما از این کار چیه؟

Hassan2500
یک شنبه 12 شهریور 1391, 23:27 عصر
نگاه کن وقتی ارقام عدد داخل سلولهای VSFlexGrid زیاد میشه دیگه عدد کامل نمایش داده نمیشه و باید اون سلول بزرگتر بشه این کد رو واسه این میخوام

SlowCode
یک شنبه 12 شهریور 1391, 23:30 عصر
بفرما اینم حلقه while:

i=100
While i <> 1000
If Val(VSFlexGrid1.TextMatrix(1, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
If Val(VSFlexGrid1.TextMatrix(2, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
i=i+1

محسن واژدی
دوشنبه 13 شهریور 1391, 08:19 صبح
جناب واژدی حالا اگه بخوام مکرر اجرا بشه و سرعت برنامه هم کم نشه باید چکار کنم سلام علیکم

از تایمر استفاده کنین، در هر صورت While هم مانند For یک حلقه محسوب میشود منتها شرطی است
یک تایمر با نام Timer1 با Interval=1 بر روی فرم قرار دهید سپس کد زیر را در ماژول فرم کپی کنید: Private i%
Private Sub Timer1_Timer()
On Error Resume Next
If i < 100 Then i = 100
If Val(VSFlexGrid1.TextMatrix(1, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
If Val(VSFlexGrid1.TextMatrix(2, i)) > 99 Then VSFlexGrid1.ColWidth(i) = 600
i = i + 1
If i >= 1000 Then i = 100: Timer1 = False
End Sub


برای استفاده کد زیر را در رویداد Change شی Text1 قرار دهید: Timer1 = False: i% = 0: Timer1 = True

که در اینصورت میشود: Private Sub Text1_Change()
Timer1 = False: i% = 0: Timer1 = True
End Sub


موفق باشید

Hassan2500
دوشنبه 13 شهریور 1391, 21:01 عصر
آقای واژدی وقتی از کد پست 13 استفاده میکنم برنامه از قسمت i% ایراد میگیره

محسن واژدی
دوشنبه 13 شهریور 1391, 21:17 عصر
آقای واژدی وقتی از کد پست 13 استفاده میکنم برنامه از قسمت i% ایراد میگیره
چه خطایی میده؟ (منظورم متن خطا هست) شاید خطا بخاطر اعلان "Private i" است چون بایستی این اعلان را در بالای ماژول فرم قرار بدیم

Hassan2500
دوشنبه 13 شهریور 1391, 21:49 عصر
مشکل از "Private i" بود که در بالای فرم قرارش نداده بودم و سپاس از شما که بدون هیچ منتی پاسخ میدی