PDA

View Full Version : مشكل در باز كردن فرم



behroz1387
سه شنبه 24 دی 1387, 22:56 عصر
با سلام من يك برنامه با زبان c# نوشته ام تنها مشكل آن اين است كه در حين باز كردن يك فرم كه معولا يكي دو ثانيه طول ميكشد چندين فرم باز و بسته مي شود و ظاهر لود شدن فرم را زشت مي كند
ممنون مي شم اگه كسي كمك كنه

newgoldenman
چهارشنبه 25 دی 1387, 00:12 صبح
ه در حين باز كردن يك فرم كه معولا يكي دو ثانيه طول ميكشد چندين فرم باز و بسته مي شود و ظاهر لود شدن فرم را زشت مي كند
هر فرمي، وقتي ساخته ميشه، تا اونو Show نكنيم، نشون كاربر داده نميشه! پس نمايش، عدم نمايش، ترتيب نمايش و نيز عدم نمايش همه ي فرم هاي برنامه ي شما، دست خودتونه. شما خودت ببين چه فرمي رو new ميكني و چه زماني، و به چه نحو، فرمت رو Show يا ShowDialog ميكني.

behroz1387
چهارشنبه 25 دی 1387, 16:49 عصر
دوست عزيز مي خواهم كه موقعي فرمي را مي بندم اون هايد نشه بلكه بسته بشه ولي از كل برنامه خارج نشه و فقط آن فرم را ببنده نمي خوام هايد بشه
ممنون

pars.engineer
چهارشنبه 25 دی 1387, 17:27 عصر
شما براي نمايش فرم از چه كدي استفاده مي كنيد؟



در حين باز كردن يك فرم كه معولا يكي دو ثانيه طول ميكشد


چرا يكي دو ثانيه زمان مي برد؟ (بايد بلافاصله نمايش داده شود)
آيا خودتان مي خواهيد كه به طور تدريجي لود شود؟(يعني به تدريج از شفاف به كدر تبديل شود)

behroz1387
چهارشنبه 25 دی 1387, 17:51 عصر
براي نمايش فرم از كد
this.hide;
form2 frm = new form2;
frm.showdialog;
استفاده ميكنم
نه من مي خواهم فرم سريع باز شود

h.jaza
پنج شنبه 26 دی 1387, 10:08 صبح
اولا راجع به موضوعات خیلی مشابه به این امر که البته خیلی هم می تونه کمکتون بکنه، زیاد بحث شده، یکم سرچ کنید.

و اما بعد، اینکه چند تا فرم باز و بسته (یا Hide) میشه، یعنی اینکه خودتون در کدتون این کار رو انجام دادین، احتمالی که من میدم اینه که یا در program و یا در همون فرم اصلی برای اینکه به همه ی فرم ها دسترسی داشته باشین، از همه یه نمونه ساختین و Show کردین و پروسسی انجام دادین و بعد متناسب با فرم جاری، سایر رو Hide کردین که این باعث همون مشکلی شده که گفتین. (یکم تخیلیه، نی)

ولی به هر حال، این نشون دادن ها و رفتن های فرم، بیانگر اینه که شما خودتون یه جایی (از همونایی که گفتم)، میاین و این کار و انجام میدین.

برای واضح تر شدن کار، یا پروژتون و یا کلاس program به همراه لود فرم اول رو بزارین تا معلوم بشه مشکل از کجاس.

newgoldenman
پنج شنبه 26 دی 1387, 14:05 عصر
در حين باز كردن يك فرم كه معولا يكي دو ثانيه طول ميكشد
خيلي ساده است رفع اين مشكل. مشكل هم از اونجاست كه مرحله ي ساخته شدن شكل و شمايل فرمتون(UI) يه كمي طول ميكشه! براي رفع اين مشكل، شما زودتر، و چند مرحله قبل از از اينكه يك نمونه از كلاس form2 خودتون بسازيد، اونو بسازيد، و هر موقع كه نياز داشتيد، اونو Show يا ShowDialog كنيد.
مثلاً ميتونه وقتي باشه كه، فرم اوليه و اصلي برنامتون هم داره ساخته ميشه(مثلاً توي formLoad فرم اصليت يك نمونه از form2 بساز، ولي show نكن). و سپس، هر موقع كه نياز داشتي، اونو show كن. ميبيني كه به جوابت رسيدي.


بلكه بسته بشه ولي از كل برنامه خارج نشه
در مورد اين جملتون هم تنها يك دليل وجود داره و اون اينه كه: تنها فرمي كه با بسته شدنش، برنامه هم با پايان ميرسه، همون فرم اصلي برنامه هست كه توي كلاس program بارگزاري و نمايش داده ميشه(بصورت پيش فرض Form1 هست.)

موفق باشي

behroz1387
پنج شنبه 26 دی 1387, 17:07 عصر
حالا كه فرمم ساخته شده راهي نداره كه اصلاحش كنم

h.jaza
پنج شنبه 26 دی 1387, 17:55 عصر
چرا نداره، گفتم که باید کدات رو ویرایش بکنی به اونی که می خوای (در پست های 7 و 8 توضیح داده شده).

Amir Oveisi
پنج شنبه 26 دی 1387, 18:15 عصر
علاوه بر توضیحات دوستان ، اگر تعداد کنترل های فرمهاتون زیاده و لودش طول میکشه میتونین DoubleBuffered ش رو true کنین.
این کار باعث میشه روونتر و بهتر و سریع تر لود بشه.

موفق باشید
jooje

h.jaza
پنج شنبه 26 دی 1387, 18:45 عصر
برمودا جان، DoubleBuffered کردن باعث نمیشه که سر بار زیادی به سیستم وارد بشه؟ (Trade-Off)

Amir Oveisi
جمعه 27 دی 1387, 13:50 عصر
DoubleBuffered کردن باعث نمیشه که سر بار زیادی به سیستم وارد بشه؟


Buffered graphics can reduce or eliminate flicker that is caused by progressive redrawing of parts of a displayed surface. Buffered graphics require that the updated graphics data is first written to a buffer. The data in the graphics buffer is then quickly written to displayed surface memory. The relatively quick switch of the displayed graphics memory typically reduces the flicker that can otherwise occur.
MSDN


Double Buffer is a technique where we draw all our graphic needs to an image stored in the memory (buffer) and after we are done with all our drawing needs we a draw a complete image from the memory onto the screen. This concentrates the drawing to the screen (an operation that badly effects the performance of the application) to a single operation rather than many small ones.
Codeproject

Amin Ul
جمعه 27 دی 1387, 14:04 عصر
سلامی عرض میکنم به بروبچه های کد نویس.
میبخشید که این بحث رو اینجا مطرح میکنم .

مشکل من مربوط میشه به اینکه نمیتونم با فرم هام بازی کنم . یعنی نمیتونم یه فرم رو hide یا show کنم .
قبلا با برنامه های زیادی کار کردم اما این C# خیلی داره اذیت میکنه . منطق new و showdialog و ... برام غیر قابل فهمه.
سوال: چطوری میتونم از چند فرم از پیش ساخته استفاده کنم؟

ممنون از عزیزان . فقط نکته قابل توجه اینکه من این پروژه رو هرجه زودتر باید تموم کنم . یعنی حداکثر تا امشب .

:بوس:

h.jaza
جمعه 27 دی 1387, 14:30 عصر
مرسی برمودا جان، همین رو می خواستم، که دری برای شرح این مسئله باز بشه حتی با مطرح کردن سوالی در خاک ریز...
لطفا یکم راجع به پیاده سازیش هم توضیح بدین.
با تشکر

مشکل من مربوط میشه به اینکه نمیتونم با فرم هام بازی کنم . یعنی نمیتونم یه فرم رو hide یا show کنم .
?

قبلا با برنامه های زیادی کار کردم اما این C# خیلی داره اذیت میکنه . منطق new و showdialog و ... برام غیر قابل فهمه.
مطالعه کنید، حتما متوجه می شید. می تونید با کتاب راکس شروع کنید.

سوال: چطوری میتونم از چند فرم از پیش ساخته استفاده کنم؟
خیلی بحث شده، سرچ کنید، حتما به جواب خواهید رسید.

Amir Oveisi
جمعه 27 دی 1387, 16:42 عصر
پیاده سازیش خیلی سادست. کافیه property به نام DoubleBuffered فرم رو true بکنید.

h.jaza
جمعه 27 دی 1387, 16:56 عصر
ابتدا یه نگاه به الگوریتم (http://www.usenix.org/events/usenix02/full_papers/huang/huang_html/node8.html)میندازیم و سپس به این (http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx) و این (http://www.codeproject.com/KB/GDI-plus/gdiplus.aspx)دو برنامه که تفاوت رو نشون میدن نگاه بندازید.