PDA

View Full Version : سوال: Load کند form



hamed jalili
چهارشنبه 08 خرداد 1387, 22:33 عصر
سلام دوستان

برنامه رو براتون آپ کردم ، ببینید خودتون بهتر متوجه می شید .
ولی یه توضیح مختصر در مورد نحوه پیاده سازی می دم :

1- هر کدوم از مهره های شطرنج یک PictureBox هستند .
2- همه ی مهره ها درون یه Pannel هستند که BackGround Pannel همون Board ه .
3- همه مهره دارای عکس هایی با پسوند TGA با BackGround Transparent هستند .


به Load کند مهره ها و Tabe New توجه کنید !!!
به نظرتون چه طور میشه کاری کرد که سریعتر Load بشه ؟






.

linux
چهارشنبه 15 خرداد 1387, 16:27 عصر
از دوستان کسی نیست که بتونه به من کمک کنه ؟
.
شما با استفاده از GDI+ می توانید بهتر و سریعتر کار کنید.

hamed jalili
چهارشنبه 15 خرداد 1387, 23:53 عصر
دوست عزیز ، ممنون از راهنماییتون
فقط یه مشکلی هست ، من با GDI+ تا به حال کار نکردم !!!
از MSDN Online Microsoft هم چیزایی پیدا کردم ولی ظاهرا نیازمند اینه که قبلا با توابع API کار کرده باشین (که من کار نکردم ) و ...
خیلی ساده بگم ، ظاهرا باید در زمینه برنامه نویسی با توابع گرافیکی حرفه ای باشم تا بتونم با GDI+ کار کنم . فکر نمی کنم یاد گرفتنش کاره 1 2 روز باشه !!!!


آیا این تنها راه ه یا بهترین راه ه ؟
راه ه ساده تری به نظر ه کسی نمی رسه ؟





.

top7news
پنج شنبه 16 خرداد 1387, 01:37 صبح
سلام دوست خوب
چرا به جای picture box از label استفاده نکردی
من دوستی داشتم که بازی تخته نرد رو با سی شارپ پیاده سازی کرده بود و البته به جای picture box از label استفاده کرده بود.effect های جالبی هم به کارش داده بود با label طوری که زمانی که روی مهره های کلیک می کردی حالت فشرده شدن پیدا می کردن و البته سرعت لود شدن برنامه اش هم خوب بود.

linux
پنج شنبه 16 خرداد 1387, 03:18 صبح
دوست عزیز ، ممنون از راهنماییتون
فقط یه مشکلی هست ، من با GDI+ تا به حال کار نکردم !!!
از MSDN Online Microsoft هم چیزایی پیدا کردم ولی ظاهرا نیازمند اینه که قبلا با توابع API کار کرده باشین (که من کار نکردم ) و ...
خیلی ساده بگم ، ظاهرا باید در زمینه برنامه نویسی با توابع گرافیکی حرفه ای باشم تا بتونم با GDI+ کار کنم . فکر نمی کنم یاد گرفتنش کاره 1 2 روز باشه !!!!
آیا این تنها راه ه یا بهترین راه ه ؟
راه ه ساده تری به نظر ه کسی نمی رسه ؟
.
اصلا به آن سختی هم که شما فکر می کنید نیست. شاید سختی کار برای طراحی الگوریتم ها باشد.
این مثال را ببنید

hamed jalili
پنج شنبه 16 خرداد 1387, 14:10 عصر
چرا به جای picture box از label استفاده نکردی


دوست عزیز میشه کمی بیشتر توضیح بدین ؟
شما او برنامه رو که upload کردم رو دیدین ؟ اگه دیدین ، من چه طور می تونم به جای اون Picture Box ها از Lable استفاده کنم ؟ من تا حالا از این تکنیک که Lable رو به بزرگی اون PictureBox ها در بیارم ، استفاده نکردم ، ثانیا چه طوری می تونم یه Lable رو به شکل وزیر یا شاه یا ... در بیارم ؟
راستی ، مشکل تنها با Picture Box که نیست ، من باید منو های دیگه ای هم اضافه کنم ، که با این وضعیت فکر کنم ، اونا دیگه اصلا Load نشن :لبخند:






.

hamed jalili
پنج شنبه 16 خرداد 1387, 14:25 عصر
g.DrawImage(cc.BlackPawn, r);
g.DrawString(string.Format("{0},{1}", (8 - j), i + 1), this.Font, Brushes.Blue, newRectangleF(newPointF(r.Left, r.Top), newSizeF(r.Width, r.Height)));




دوست عزیز Linux جان ،
اون طور که من از کد شما متوجه شدم ، این دو خط برای کشیدن سرباز ها بود ، درسته ؟

این کدی که شما زحمتشو کشیدین واقعا سریعه ، ولی یه مشکلی داره ( البته من این طور فکر می کنم ) :
اون برنامه که من Upload کردم ، برنامه اصلی نیست ، در برنامه اصلی شما روی هر سرباز یا وزیر یا رخ یا ... که کلیک می کنید ، توابع مختلفی از event های مختلف اونا صدا زده می شه که کار های مربوط به جابه جا کردم مهره و ... انجام می ده ، یعنی هر مهره باید ماهیت یه Object رو کاملا داشته باشه و گرنه نمیشه بقیه قسمت های کد رو کنترل کرد .

( البته این برنامه تموم شده ، Engine هم نوشته شده ، یعنی برنامه اصلی از نظر بازی و قوانین و موتور کاملا صحیح کار می کنه ، فقط مشکلاتی از قبیل همین سرعت کند گرافیکی و Data Base ها و Save های بازی مونده - یعنی خیلی ساده بگم ، دیگه نمیشه این ماهیت مهره ها رو عوض کرد بلکه باید یه چاره ای با این شرایط براشون اندیشید )




ولی اون طور که من از کد شما متوجه شدم ، سرباز های Object نیستند ، بلکه فقط یا شکل هستند که نمیشه Event هایی مثل Click یا Mouse on ، Mouse Leave و ... را براشون تعریف کرد .







.

linux
پنج شنبه 16 خرداد 1387, 14:50 عصر
g.DrawImage(cc.BlackPawn, r);
g.DrawString(string.Format("{0},{1}", (8 - j), i + 1), this.Font, Brushes.Blue, newRectangleF(newPointF(r.Left, r.Top), newSizeF(r.Width, r.Height)));




دوست عزیز Linux جان ،
اون طور که من از کد شما متوجه شدم ، این دو خط برای کشیدن سرباز ها بود ، درسته ؟

این کدی که شما زحمتشو کشیدین واقعا سریعه ، ولی یه مشکلی داره ( البته من این طور فکر می کنم ) :
اون برنامه که من Upload کردم ، برنامه اصلی نیست ، در برنامه اصلی شما روی هر سرباز یا وزیر یا رخ یا ... که کلیک می کنید ، توابع مختلفی از event های مختلف اونا صدا زده می شه که کار های مربوط به جابه جا کردم مهره و ... انجام می ده ، یعنی هر مهره باید ماهیت یه Object رو کاملا داشته باشه و گرنه نمیشه بقیه قسمت های کد رو کنترل کرد .

( البته این برنامه تموم شده ، Engine هم نوشته شده ، یعنی برنامه اصلی از نظر بازی و قوانین و موتور کاملا صحیح کار می کنه ، فقط مشکلاتی از قبیل همین سرعت کند گرافیکی و Data Base ها و Save های بازی مونده - یعنی خیلی ساده بگم ، دیگه نمیشه این ماهیت مهره ها رو عوض کرد بلکه باید یه چاره ای با این شرایط براشون اندیشید )




ولی اون طور که من از کد شما متوجه شدم ، سرباز های Object نیستند ، بلکه فقط یا شکل هستند که نمیشه Event هایی مثل Click یا Mouse on ، Mouse Leave و ... را براشون تعریف کرد .
.
فقط خط اول برای کشیدن سرباز بود خط دوم شماره ردیف و ستون را می نویسه.
این یک مثال بود که شما با نحوه کار GDI+ آشنا بشید و سرعت کار را ببینید.
حتما از من انتظار نداشتی که ساعت 3 صبح یک برنامه کامل که مهره ها را حرکت بدهد برای شما بنویسم.
وقتی بخواهید با GDI+ کار کنید خودتان باید همه چیز را پیاده سازی کنید، یک کلاس باید بسازید مثلا سرباز، که حالا یکسری خواص و متد داره ، رنگ ، جایگاه در صفحه و ...
یک کلاس باید بسازید به اسم مثلا board که کارش کشیدن صفحه شطرنج باشه و ...
کار شما زیادتر میشه ولی سرعت اجرای برنامه بالا هست.

hamed jalili
پنج شنبه 16 خرداد 1387, 15:07 عصر
Linux جان
ممنون از لطف شما
ولی من متوجه نشدم ، این مهره ها که شما کشیدن ، Object که نیستند ؟





.

barnamejoo
پنج شنبه 16 خرداد 1387, 15:18 عصر
در GDI+ شما باید کل object ها رو خودتون مدیریت بکنید. در واقع آبجکت بصورت label و picturebox وجود نداره! در ضمن باید تغییرات رو هم خودتوت update کنید، مثلا در ایونت paint .

پیشنهاد میکنم اگر gdi+ براتون سخته و سی# اجباری نیست از زبانی بغیر از .net مثل وی بی 6 یا دلفی استفاده کنید.

hamed jalili
پنج شنبه 16 خرداد 1387, 15:31 عصر
پیشنهاد میکنم اگر gdi+ براتون سخته و سی# اجباری نیست از زبانی بغیر از .net مثل وی بی 6 یا دلفی استفاده کنید.

ممنون از راهنماییتون
+GDI برام سخت هست ، نه برای یاد گرفتن ، بلکه تغییر قالب برنامه ، چون دراین برنامه نزدیک به 4000 خط کد نوشته شده ، که همگی با event های Object ها و Pannel کار می کنند !!!
تغییر این کد ها به یه قالب دیگه و یا از محیطی به محیط دیگه انتقال دادن برام خیلی سخته !!!


راستی قبلا که من مهره ها رو روی Form گذاشته بودم ، این مشکل رو نداشتم ، ولی الان که مهره ها رو توی Pannel گذاشتم ، این مشکل ایجاد شده . البته بنا به دلایلی مثل کنترل موقعیت و حفظ موقعیت در سایز های مختلف یا در Resoulation های مختلف و ... نمی شه مهره ها رو روی form قرار داد .





.

top7news
پنج شنبه 16 خرداد 1387, 18:59 عصر
سلام
در مورد label خوب خاصیت auto size اون رو false کنید و عکس مورد نظرتون رو توی خاصیت image مربوط به label قرار بدین که همه خاصیت های picture box رو هم فکر کنم داشته باشه
ضمنا شما میتونید با کد نویسی شکل دکمه ها (button) رو هم به شکل مورد نظرتون تغییر بدین و از دکمه ها به جای مهره ها استفاده کنید

hamed jalili
پنج شنبه 16 خرداد 1387, 22:08 عصر
در مورد label خوب خاصیت auto size اون رو false کنید و عکس مورد نظرتون رو توی خاصیت image مربوط به label قرار بدین ...

دوست عزیز ،
من اون کاری که شما فرموده بودین رو انجام دادم ، هیچ فرقی نکرد ، فایل و براتون آپلود کردم ، خودتون یه نگاه بندازید .


یعنی C# از عهده Load چند تا عکس بر نمی آید ؟!! :متفکر::متفکر::لبخندساده:


راه حل دیگه ای به نظر کسی نمی رسه ؟
اصلا چرا وقتی توی Pannel هستند این مشکل به وجود می آید در صورتی که وقتی عکس ها روی Form هستند یه همچین مشکلی پیش نمی آید ؟!!!!






.

top7news
پنج شنبه 16 خرداد 1387, 23:32 عصر
سلام
والا در مورد اینکه چرا تو پنل اینطوری میشن واسه منم سئواله چون برنامه های خود منم همین مشکل لود کند یا پرش رو دارن
ولی یه سئئوال
تو این برنامه رو روی یه سیستم که ویندوز ویستا داره و همینظور روی یه سیستم که رم بالای 2 گیگ داره هم امتحان کردی؟

hamed jalili
جمعه 17 خرداد 1387, 11:09 صبح
تو این برنامه رو روی یه سیستم که ویندوز ویستا داره و همینظور روی یه سیستم که رم بالای 2 گیگ داره هم امتحان کردی؟

سیستم خودم این طوری
و از Visual Studio 2008 .Net 3.5 استفاده می کنم
ولی من فکر نمی کنم از سیستم باشه ، چون این سیستم با بازی هایی مثل Crysis ( که یه گرافیک واقعا سنگینی داره ) ، مشکل نداره ، فکر نمی کنم منطقی باشه که با Load چند تا عکس مشکل داشته باشه !!!

البته قبول دارم که اون بازی های زیر سایه DirectX یا OpenGL از سرعت گرافیکی واقعا بالایی برخوردارند .


برنامه رو زمانی که عکس ها به جای قرار گرفتن در داخل یه Pannel روی Form هستند ، رو براتون upload کردم ، اگه سرعت Load شدن در این حالت رو با حالت قبلی مقایسه کنید حتما متوجه می شید که سرعت Load شدن به مراتب بالاست









.

رضا عربلو
جمعه 17 خرداد 1387, 18:19 عصر
آیا شما Panel تان را Dock کرده اید(فکر می کنم Dock نکنید بهتر است). همچنین آیا تصویر را بعنوان BackgroundImage کنترل هایتان استفاده کرده اید و یا از یک کنترل PictureBox استفاده کرده اید.(فکر می کنم بصورت BackgroundImage استفاده کردن بهتر باشد.)
در کل برای حل این مشکل. اول بایستی ببینیم چه اتفاقی می افتد. مثلاً آیا قبل از لود شدن عکس تان SuspenLayout و بعد از آن ResumeLayout (هم برای form و هم برای Panel) فرا خوانده می شود و یا نه؟ و هر کدام از آنها می توانند تاثیری در بهبود performance داشته باشند.و با چه ترتیبی کدها ایجاد می شوند مثلاً اول Panel ایجاد می شود به فرم اضافه می گردد و سپس عکس لود می شود و یا آینکه اول Panel ایجاد می شود عکس لود می شود و سپس به فرم اضافه می گردد.

top7news
جمعه 17 خرداد 1387, 19:04 عصر
سلام آقای عربلو ی عزیز
میشه در مورد
آیا قبل از لود شدن عکس تان SuspenLayout و بعد از آن ResumeLayout (هم برای form و هم برای Panel) فرا خوانده می شود و یا نه؟ بیشتر توضیح بدین

hamed jalili
جمعه 17 خرداد 1387, 23:32 عصر
آیا شما Panel تان را Dock کرده ایدهمچنین آیا تصویر را بعنوان BackgroundImage کنترل هایتان استفاده کرده اید و یا از یک کنترل PictureBox استفاده کرده اید.

دوست عزیز ممنون از راهنماییتون
1- Pannel Dock نیست
2- و از BackgroundImage برای Object ها استفاده کردم ، Resoulation و Quality عکس هم بالا نیست .





در کل برای حل این مشکل. اول بایستی ببینیم چه اتفاقی می افتد. مثلاً آیا قبل از لود شدن عکس تان SuspenLayout و بعد از آن ResumeLayout (هم برای form و هم برای Panel) فرا خوانده می شود و یا نه؟ ....

من هم مثل دوست عزیزم top7news ، این قسمت و متوجه نشدم ، اگه لطف کنید بیشتر توضیح بدین ممنون میشم ؟






.

رضا عربلو
شنبه 18 خرداد 1387, 01:48 صبح
متد SuspendLayout باعث می شود که اونات های مربوط به layout یک کنترل مثل تغییر سایز، Loaction , Anchor , Dock , ...(هر چیزی که ممکن است باعث شود کنترلی Redraw شود) به حالت تعلیق در آیند تا هنگامیکیه متد ResumeLayout فراخوانده شود. در کل هنگامیکیه به کد تهیه شده برای یک فرم توسط VS نگاه کنید (Code designer) به وفور با این متدهای SyspenLayout و ResumeLayout در ابتدا و انتهای متد Initialization مواجه می شوید. و در مواقعی که در بالا دذکر شد بسیار بکار می آیند.

top7news
شنبه 18 خرداد 1387, 07:48 صبح
ممنون آقای عربلوی عزیز
من این قسمت رو متوجه شدم فقط یه سئوال دیگه که هست اینکه چه طوری میشه این دو تا متد رو طوری تنظیم کرد که هک ترتیب فراخوانی هاشون درست باشه هم باعث سرعت توی لود فرم و سایر قسمت های برنامه بشه ؟
بازم ممنون از راهنمایی های خوبتون

hamed jalili
شنبه 18 خرداد 1387, 12:39 عصر
متد SuspendLayout باعث می شود که اونات های مربوط به layout یک کنترل مثل تغییر سایز، Loaction , Anchor , Dock , ...(هر چیزی که ممکن است باعث شود کنترلی Redraw شود) به حالت تعلیق در آیند تا هنگامیکیه متد ResumeLayout فراخوانده شود.

آقای عربلو من درست متوجه نشدم ،
آیا منظور شما اینه که : اول Dock , Anchor و ... مربوط به یه Object به حالت تعلیق در بیارم بعد از اینکه Load کامل شد ، ResumeLayout کنم ؟! مگه نیاز نیست که Object من از همون اول در Location مشخص شده ی خودش باشه ؟!





.

رضا عربلو
شنبه 18 خرداد 1387, 16:13 عصر
اگر به کدی که توسط Visual Studio برای یک فرم در فایل Form.Designer.CS تهیه می شود نگاه کنید کاملاً متوجه منظور من می شوید. در آنجا اول متد suspendLayout فرخوانده می شود سپس کارهای ایجاد object ها و ... انجام می شود و در پایان ResumeLayout فراخوانده می شود.

hamed jalili
شنبه 18 خرداد 1387, 17:08 عصر
اول متد suspendLayout فرخوانده می شود سپس کارهای ایجاد object ها و ... انجام می شود و در پایان ResumeLayout فراخوانده می شود.

درسته ؛
بین Suspend و Resume ؛ 600 خط کد ه !!!!!
خوب الان باید با این Suspend و Resume چی کار کنم ؟!

ترتیب Load شون هم اینطوریه :
اول Pannel ساخته میشه ، Suspend میشه ، بعد عکس ها کلا ساخته میشن ، بعد Pannel Resume میشه .







.

رضا عربلو
شنبه 18 خرداد 1387, 19:51 عصر
دوست عزیز، چیزی که من در مورد SuspenLayout و Resumelayout گفتم صرفاٌ یکی از مواردی بود که ممکن است بتواند در بهبود performance به شما کمک کند. برای اینکه بتوانید پرفورمنس خود را مثل حالت دوم بکنید بایستی اول بفهمید که چه اتفاقی در حالت دوم می افتد که در حالت اول می افتد. مقایسه دو کد با هم می تواند به شما کمک زیادی بکند.
در ضمن پیشنهاد می کنم به جای اینکه در زمان طراحی پنل تان را بر روی فرم قرار دهید . در زمان اجرا این کار را انجام دهید و در تاثیر تغییر ترتیب انجام کارها (از قبیل ایجاد پنل-اضافه کردن به فرم-الصاق عکس به پنل و ...) را ببینید. تا بهتر از موضوع سر در بیاورید.

hamed jalili
شنبه 18 خرداد 1387, 23:42 عصر
آقای عربلو ، ممنون از راهنماییتون
کارهایی که شما فرموده بودین رو انجام دادم ولی تغییری نکرد !!!
ظاهرا برای بالا بردن سرعت باید راه دیگه ای اندیشید !!!






.

hamed jalili
یک شنبه 19 خرداد 1387, 09:33 صبح
راستی من حتی یه کاره دیگه هم کردم که باز هم جواب نداد ،

یه PictureBox رو روی همه مهره ها گذاشتم و یه دکمه کنار گذاشتم ، به این صورت که همه چیز کاملا Load میشه ، شما نه مهره های شطرنج می بینید نه Board رو . وقتی روی دکمه کلیک می کنید ، Visibility اون PictureBox که روی مهره ها قرار داشت False میشه ؛ ولی باز هم همون سرعت کند رو داره .
با این کار فکر کنم مشخص می شه که از روش Suspend و Resume (روشی که دوست عزیزم آقای عربلو فرمودند ) نمیشه برای بهبود Performance استفاده کرد .





.