PDA

View Full Version : استفاده از فرمهای متعدد در برنامه؟؟



drhadi_20
سه شنبه 26 تیر 1386, 15:30 عصر
آیا استفاده از فرمهای زیاد در یک پروژه معایب یا مزایایی دارد؟ مثلا اگر در یک پروژه از 20 فرم استفاده شود ممکن مشکلاتی داشته باشد؟

با سپاس

کیوان معینی
سه شنبه 26 تیر 1386, 22:38 عصر
اگه واقعا به یه تعداد فرم خاص نیاز دارید ، فکر نمیکنم مشکلی داشته باشه ، من دارم روی یه برنامه حسابداری با بیش از 170 تا فرم کار میکنم ، مشکلی هم ندارم .
توجه کنید تعداد کنترلهای روی یه فرم محدود می باشد ، البته سقف تعدادش بالاست . ( کنترلها شامل منو ها نیز میشه)

راستی ، این کد رو برای خروج فرمهاتون از حافظه فراموش نکنید

Unload Form1
Set Form1=Nothing

__siavash__
چهارشنبه 27 تیر 1386, 00:00 صبح
اگه واقعا به یه تعداد فرم خاص نیاز دارید ، فکر نمیکنم مشکلی داشته باشه ، من دارم روی یه برنامه حسابداری با بیش از 170 تا فرم کار میکنم ، مشکلی هم ندارم .
توجه کنید تعداد کنترلهای روی یه فرم محدود می باشد ، البته سقف تعدادش بالاست . ( کنترلها شامل منو ها نیز میشه)

راستی ، این کد رو برای خروج فرمهاتون از حافظه فراموش نکنید

Unload Form1
Set Form1=Nothing
من یه مدت با این مشکل مواجه بودم که وقتی یکی از فرم ها رو Unload میکردم اما حلقه ای که در حال اجرا بود ادامه پیدا میکرد و برنامه هنوز در لیست پراسسها بود
شما با


Set Form1=Nothing

چه هدفی دارید ؟

RezaKia
چهارشنبه 27 تیر 1386, 01:14 صبح
من یه مدت با این مشکل مواجه بودم که وقتی یکی از فرم ها رو Unload میکردم اما

سلام،
فکر کنم شما یکی از اصول توابع خروج دارای حلقه بدون شرط رو فراموش کردید:
اگر در یک کلاس (فرم هم یک کلاس است) تابع دارای یک حلقه است، مثل تایمر، دستور For و ... باید حتماً در شرط ابتدای هر اجرای حلقه تمام نشدن کار کلاس رو چک کنید.
اگر کلاس متوقف شده بود (مثل Unload Form) باید سریعاً از حلقه خارج و بسرعت تمیز کاری های احتمالی را انجام داده و از تابع خارج شوید.

برای این کار چندین و چند راه موجود است اما ساده ترین آن که کمترین میزان کد نویسی و کمترین میزان مصرف منابع را هم دارد، والبته برای هر حالتی هم مناسب نیست، روش زیر است:

یک متغیر یا Property از نوع Boolean در General Declarationکلاس تعریف و True نبودن آنرا در حلقه چک میکنبم. اگر True شد یعنی کلاس Unload ،Terminate ،Dispose و .... شده.
درون رخدادی که در هنگام اتمام کار کلاس اجرا میشود (مثل Form Closing) مقدار این متیر را True میکنیم.

این هم یک نمونه کد:

Private blnIsFormClosed AsBoolean
PrivateSub Form1_Closing(ByVal sender AsObject, ByVal e As System.ComponentModel.CancelEventArgs) HandlesMyBase.Closing
blnIsFormClosed = True
EndSub
PrivateSub DoSomeLoop()
Do
' Some Code
Loop
EndSub

noorsoft
چهارشنبه 27 تیر 1386, 04:01 صبح
اگه برنامه ای دارین که باید تعداد زیادی فرم داشته باشه هیچ مشکی نداره چون قرار دادن تعداد زیادی کنترل روی یک فرم مشکل ساز است پس بهترین راه استفاده از فرمهای جداگانه می باشد ولی به هر حال بستگی به برنامه داره

__siavash__
چهارشنبه 27 تیر 1386, 12:47 عصر
سلام،
فکر کنم شما یکی از اصول توابع خروج دارای حلقه بدون شرط رو فراموش کردید:
اگر در یک کلاس (فرم هم یک کلاس است) تابع دارای یک حلقه است، مثل تایمر، دستور For و ... باید حتماً در شرط ابتدای هر اجرای حلقه تمام نشدن کار کلاس رو چک کنید.
اگر کلاس متوقف شده بود (مثل Unload Form) باید سریعاً از حلقه خارج و بسرعت تمیز کاری های احتمالی را انجام داده و از تابع خارج شوید.

برای این کار چندین و چند راه موجود است اما ساده ترین آن که کمترین میزان کد نویسی و کمترین میزان مصرف منابع را هم دارد، والبته برای هر حالتی هم مناسب نیست، روش زیر است:

یک متغیر یا Property از نوع Boolean در General Declarationکلاس تعریف و True نبودن آنرا در حلقه چک میکنبم. اگر True شد یعنی کلاس Unload ،Terminate ،Dispose و .... شده.
درون رخدادی که در هنگام اتمام کار کلاس اجرا میشود (مثل Form Closing) مقدار این متیر را True میکنیم.

این هم یک نمونه کد:

Private blnIsFormClosed AsBoolean
PrivateSub Form1_Closing(ByVal sender AsObject, ByVal e As System.ComponentModel.CancelEventArgs) HandlesMyBase.Closing
blnIsFormClosed = True
EndSub
PrivateSub DoSomeLoop()
Do
' Some Code
Loop
EndSub

ممنون
این کدی که گذاشتی به نظر نمیاد مال VB باشه فکر کنم برای VB.Net باشه !

این کد

Set Form1=Nothing

همون کارو نمیکنه ؟؟؟

majjjj
چهارشنبه 27 تیر 1386, 20:42 عصر
ممنون
این کدی که گذاشتی به نظر نمیاد مال VB باشه فکر کنم برای VB.Net باشه !

این کد

Set Form1=Nothing

همون کارو نمیکنه ؟؟؟
من اینو تو کتابهای بیسیک 6 دیدم
کارش هم اینه که شی فرم رو در نظر میگیره اصلا نبوده

RezaKia
چهارشنبه 27 تیر 1386, 21:58 عصر
سلام،
تو VB 6.0 باید کد توی تابع Form1_CLose رو تو تابع Unload فرم بنویسی منطق و باقیش همونه.

کیوان معینی
چهارشنبه 27 تیر 1386, 23:01 عصر
این کدی که گفتم ، برای آزاد سازی صریح فضای اشغال شده توسط فرم و متغیرهای اون از حافظه باید استفاده بشه ، سیاوش عزیز .


وگرنه بعد از چندین بار بستن عادی چندین فرم سنگین از نظر متغیرها (مثل Recordset ها ) ، با یه همچین پیغامی روبرو میشین .



Out of Memory ...

( البته مقدار حافظه سیستمتون نقش داره )

__siavash__
پنج شنبه 28 تیر 1386, 00:19 صبح
این کدی که گفتم ، برای آزاد سازی صریح فضای اشغال شده توسط فرم و متغیرهای اون از حافظه باید استفاده بشه ، سیاوش عزیز .


وگرنه بعد از چندین بار بستن عادی چندین فرم سنگین از نظر متغیرها (مثل Recordset ها ) ، با یه همچین پیغامی روبرو میشین .



Out of Memory ...

( البته مقدار حافظه سیستمتون نقش داره )
اگه این کارو بکنیم دیگه اون مشکلی که در بالا گفتم پیش نمیاد
یعنی دیگه لازم نیست ابتدای حلقه Unload شدن فرم رو چک کنیم ؟

RezaKia
پنج شنبه 28 تیر 1386, 00:44 صبح
اگه این کارو بکنیم دیگه اون مشکلی که در بالا گفتم پیش نمیاد
یعنی دیگه لازم نیست ابتدای حلقه Unload شدن فرم رو چک کنیم ؟


اگر بهر دلیلی کلاسی که حلقه داره توش اجرا میشه بسته بشه باید سریعا حلقه رو تمام کرد.

یعنی اینکه مثلاً یک فرم دارید که داره یک کاری رو تو یک حلقه انجام میده، بعد کاربر وسط کار دکمه Close از روی فرم رو میزنه. حالا برنامه و فرم بهر روشی که تموم بشن باید حلقه قبل از اتمام کار فرم بسته شود. وگرنه تمام منابع تخصیصی قفل خواهند ماند.

حتی اگر Nothing هم بکنی جون حلقه فعال دارد بعضی از منابع که حلقه به آنها نیاز دارد فعال میمانند. :متعجب:

drhadi_20
جمعه 29 تیر 1386, 11:12 صبح
از همه دوستان سپاسگزارم