PDA

View Full Version : اعمال تغییرات به صورت RunTim به فرم مادر



benighted.boy
چهارشنبه 16 آبان 1386, 08:57 صبح
با سلام.
من تو برنامم یه فرم فرزند دارم که جهت تنظیمات محیط برنامه توسط کاربره (تنظیماتی مثل تصویر زمینه و ... )
این تنظیمات داخل متغییر هایی که در Setting تعریف کردم ذخیره میشه .حالا مشکلم اینجاست که میخوام کاربر هر کدام از تنظیمات رو تغییر داد بلافاصله در فرم مادر ایجاد شه .اما تا برنامه بسته نشه و دوباره باز نشه تنظیمات اعمال نمیشه . :ناراحت:
این هم یه تکه از کد برنامم :

OpenPicture.Filter = "Picture(*.jpg)|*.jpg|Bittmap(*.bmp)|*.bmp";
OpenPicture.FilterIndex = 1;
OpenPicture.Title = "انتخاب تصویر زمینه";
if (OpenPicture.ShowDialog() == DialogResult.OK)
{
Properties.Settings.Default.StrPathPictureFie = OpenPicture.FileName;
Properties.Settings.Default.Save();
pictureBox1.BackgroundImage = Image.FromFile(Properties.Settings.Default.StrPath PictureFie);
(new frm_main()).BackgroundImage = Properties.Settings.Default.StrPathPictureFie;
}

ARA
چهارشنبه 16 آبان 1386, 09:20 صبح
میشه کد کامل بگذاری

این چیزی که من میبینم شما فرم اصلیتون رو new کردین این داخل کدفرزنداتونه

من معمولا یک event تعریف میکنم که هر وقت تغییر کرد event اجرا شه

hassan razavi
چهارشنبه 16 آبان 1386, 10:38 صبح
یا می تونید فرم اصلی تون را به عنوان پارامتر به فرم دوم بفرستید و تغیرات رو روی پارامتر اعمال کنید

benighted.boy
پنج شنبه 17 آبان 1386, 07:39 صبح
من فرم اصلی رو به عنوان پارامتر به فرم فرزند فرستادم اما جواب نداد .

hassan razavi
پنج شنبه 17 آبان 1386, 12:09 عصر
اگه ممکنه پروژتون رو بزارید ببینبمش

Mahdi.Kiani
جمعه 18 آبان 1386, 11:21 صبح
خوب عزیز نباید هم تغییراتت اعمال بشه
چون شما اومدین و یک آبجکت جدید از فرم اصلیتون ساختین که هیچ ربطی به فرم اصلی که الان در حال اجرا هست نداره

benighted.boy
جمعه 18 آبان 1386, 17:26 عصر
خوب مشکل منم درست همین جاست .توی زبانهایی مثل VB6 که فرم رو به طور مستقیم Show میکردیم این مشکلات نبود اما اینجا object می سازیم این مشکل هست .
من از evnet استفاده کردم اما تا فرم بسته نشه اعمال نمیشه
از متغیر Static استفاده کردم اما جواب نداد
حالا چه کار میشه کرد ؟

اَرژنگ
جمعه 18 آبان 1386, 17:54 عصر
خوب مشکل منم درست همین جاست .توی زبانهایی مثل VB6 که فرم رو به طور مستقیم Show میکردیم این مشکلات نبود اما اینجا object می سازیم این مشکل هست .
من از evnet استفاده کردم اما تا فرم بسته نشه اعمال نمیشه
از متغیر Static استفاده کردم اما جواب نداد
حالا چه کار میشه کرد ؟

اگه ممکنه پروژتون رو بزارید ببینبمش

benighted.boy
جمعه 18 آبان 1386, 18:16 عصر
این شبه نمونه از سورسم هست .میخوام تصویر همزمان با قرار گرفتن در کادر عک در زمینه فرم مادر هم قرار بگیرد .

hassan razavi
جمعه 18 آبان 1386, 20:13 عصر
همانطور که قبلا گفتم ، فرم اولی را بصورت پارامتر به فرم دوم ارسال کنید.
برنامتون رو اصلاح کردم ، براتون میفرستم.

اَرژنگ
شنبه 19 آبان 1386, 03:40 صبح
همانطور که قبلا گفتم ، فرم اولی را بصورت پارامتر به فرم دوم ارسال کنید.
برنامتون رو اصلاح کردم ، براتون میفرستم.
از لحاظ اصول برنامه نویسی این روش درست نیست: فرم ۲ هیچ‌ احیتاجی به دانستن در مورد فرم ۱ ندارد،در برنامه نویسی شئی‌گرا هر ابجکتی مسولیت خودش را دارد و نباید به ابجکتهایه دیگر دست بندازه و عوضشان کند، باید بهشان درخواست بفرسته که خود همان ابجکت این کار را براش انجام بدند (پروپرتیها برایه همین کار هستند). لطفاً از استفاده از این روش پرهیز کنید.


۲ روش درست وجود داره :
۱ـ همان روشی که آرا بهش اشاره کردند، و آٓن داشن یک ایونت برایه ستینگ‌هایه اپلیکیشن که وقتی عوض شدند فرم ۱ به وسیله این ایونت متوجه میشه و ایمجش را عوض میکند.
این روش برایه تمام ستینگها قابل استفاده است و کد عوض شدن ستینگها فقط در یک کلاس جمع شدند.
با داشتن یک کلاس که تمام ستینگهایه اپلیکشن در آنجا هستند و زمانیکه عوض میشند تمام ابجکتهایی که به ایونت عوض شدن سابسکریب کردند نُتیفی میشند و عملیات لازم را بر رویه خودشان انجام میدند.

این روش را برایه ساختن برنامه‌هایه جدی توصیه میکنم.

۲-اگر فقط میخواهید که فرم ۱ بعد از نشان دادن دایالوگ باکس بداند که ایمیج عوض شده، ۲ روش وجود داره
۱) فرم ۲ یک ایونت تعریف میکند و فرم یک به این ایونت سابسکریب میکند به این طریق بالاترین مقدار Decoupling و Cohesion را خواهید داشت (کسی فارسی این کلمات را میداند بگه)
۲) فرم ۲ یک پروپرتی از نوع ایمج تعریف میکند، بعد از اینکه فرم ۱ از فرم ۲ تغاضا کرد که خودش را به صورت دایالوگ نشان بده، فرم ۱ نتیجه دایالوگ را چک میکنه که اگر اوکی بود از ایمج پروپرتی فرم ۲ ، ایمج خودش را خودش ست میکند. این روش ، روش درست پاس دادن مقادیر از یک فرم به یک فرم دیگر است، اگرچه باید طرز تفکر را عوض کرد، در برنامه نویسی شئیگرا طرز درست نگاه کردن به این مسئله این است که فرم ۲ فقط یک وضیفه دارد، و آن هم انتخواب کردن یک ایمج و یا هر مقدار دیگری. فرم ۱ از فرم ۲ درخواست مقادیری را که در پروپرتیهاش ست کرده را بعد از اینکه نتیجه دایلاوگ اوکی بود میکند و اونها را خودش ست میکند.

این فرم ۲ نیست که مقادیر را به فرم ۱ پاس میده، این فرم ۱ است که مقادیر را از فرم ۲ درخواست میکند.

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

در ضمن مثالی که شما فرستادید یک اشکال داره ، اجازه کنسل کردن را به کاربر نمیده. فرم ۲ باید به صورت یک دایالوگ با اوکی و کنسل باشد و فرم ۱ بعد از اوکی از پروپرتی ایمج فرم ۲، ایمج خودش را ست کند، اگر هم که کاربر کنسل کرد هیچ‌کاری نکند.

benighted.boy
شنبه 19 آبان 1386, 22:28 عصر
آرژنگ جان خیلی ممنون از توضیحاتت .اگه لطف کنی یه Sample هم بزاری ممنون میشم.توضیحاتت کامله اما پیاده سازیش یه مقداری (لااقل واسه من که چند ماه بیشتر نیست c# رو شروع کردم) مشکل .
با تشکر .

اَرژنگ
چهارشنبه 30 آبان 1386, 10:16 صبح
آرژنگ جان خیلی ممنون از توضیحاتت .اگه لطف کنی یه Sample هم بزاری ممنون میشم.توضیحاتت کامله اما پیاده سازیش یه مقداری (لااقل واسه من که چند ماه بیشتر نیست c# رو شروع کردم) مشکل .
با تشکر .
http://barnamenevis.org/forum/showth...34&#post412617 (http://barnamenevis.org/forum/showthread.php?t=82834&#post412617)
http://barnamenevis.org/forum/showth...257#post376926 (http://barnamenevis.org/forum/showthread.php?t=75257#post376926)