PDA

View Full Version : سوال: نحوه ذخیره سازی یک شی با خوصییات شخصی و استاده از آن در برنامه های دیگر



aliburnout
یک شنبه 10 بهمن 1389, 09:20 صبح
سلام
من یه مشکل دارام که برنامه نوشتنم رو خیلی طولانی می کنه ، مثلا میخوام برای همه textbox ها برنامم یک خوصیات تعریف کنم. حالا راهی هست که برای یکه تعریف کنم و باقی همه اون خصوصیات رو داشته باشن؟
ممنون میشم سریع تر بهم خبر بدین باس برنامم رو شروع کنم.
اگه میشه برام ایمیل کنید : aliburnout3@yahoo.com

ACorvinus
یک شنبه 10 بهمن 1389, 09:41 صبح
سلام.

شما اگه میخواین یه TextBox داشته باشین که یک/چند خاصیت اضافی تری نسبت به Standard TextBox داشته باشه باید یه UserControl تعریف کنین.

اگه طرز تهیه UserControl رو بلد نیستین، بگین TextBox شما چه خصوصیتی میخواد داشته باشه که در صورت طولانی نبودن کدنویسی من براتون تهیه کنم.

گاهی اوقات شما میخواین 50 تا کلاستون خصوصیات مشترک داشته باشن و خصوصیات مختص خودشون. (فقط برای کلاس ها). در اینصورت شما باید یه Interface (رابط) تعریف کنین. البته فکر نکنم شما نیازی به رابط داشته باشین و با طراحی UserControl شما میتونین UserControl خود رو در هر برنامه ای که خواستین استفاده کنین. (مثل یه component).

موفق باشین.

aliburnout
یک شنبه 10 بهمن 1389, 09:49 صبح
سلام.

شما اگه میخواین یه TextBox داشته باشین که یک/چند خاصیت اضافی تری نسبت به Standard TextBox داشته باشه باید یه UserControl تعریف کنین.

اگه طرز تهیه UserControl رو بلد نیستین، بگین TextBox شما چه خصوصیتی میخواد داشته باشه که در صورت طولانی نبودن کدنویسی من براتون تهیه کنم.

گاهی اوقات شما میخواین 50 تا کلاستون خصوصیات مشترک داشته باشن و خصوصیات مختص خودشون. (فقط برای کلاس ها). در اینصورت شما باید یه Interface (رابط) تعریف کنین. البته فکر نکنم شما نیازی به رابط داشته باشین و با طراحی UserControl شما میتونین UserControl خود رو در هر برنامه ای که خواستین استفاده کنین. (مثل یه component).

موفق باشین.


ممنون میشم اگه ساختن user control رو برام توضیح بدی . آخه یه textbox خالی نیس

ACorvinus
یک شنبه 10 بهمن 1389, 10:23 صبح
سلام دوباره.

New Project رو میزنی و بجای Windows Form Application اینبار Class Library رو انتخاب می کنی.
Class Library ایجاد شده در حالت پیش فرض شامل یه Class1 هست که با اون کاری نداریم. میتونی درجا Delete کنی.
حالا روی Class Library کلیک راست می کنی و از زیر منوی Add آیتم Component رو انتخاب می کنی.
یه صفحه خاکستری باز میشه که روش نوشته: To add components to your class, ... .

خب حالا از پنجره Solution به System.Windows.Forms یه Reference میدی و رو همون قسمت خاکستری رنگ F7 رو فشار میدی تا بری به بخش کد نویسی.

فضای نام System.Windows.Forms رو using می کنی و در اینصورت یه کدی به همچین شکلی داری:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary1
{
public partial class Component1 : Component
{
public Component1()
{
InitializeComponent();
}

public Component1(IContainer container)
{
container.Add(this);

InitializeComponent();
}
}
}

حالا اگه میخوای یه TextBox جدید بسازی به جای اینکه از Componenct ارث بری کنی از TextBox ارث بری کن. اینجوری:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary1
{
public partial class Component1 : TextBox
{
public Component1()
{
InitializeComponent();
}

public Component1(IContainer container)
{
container.Add(this);

InitializeComponent();
}
}
}

فقط توجه داشته باش که نوشتن UserControl کار سختیه و همه جوانب رو باید در نظر بگیری. برای مثال اگه میخوای یه خاصیت فقط خواندنی به نام Length داشته باشی که طول متن TextBox رو نشون بده اونو اینجوری مینویسی:


public int Length
{
get
{
return (base.Text.Length);
}
}

سوالی داشتی بپرس. موفق باشی.

aliburnout
دوشنبه 11 بهمن 1389, 09:06 صبح
سلام دوباره.

New Project رو میزنی و بجای Windows Form Application اینبار Class Library رو انتخاب می کنی.
Class Library ایجاد شده در حالت پیش فرض شامل یه Class1 هست که با اون کاری نداریم. میتونی درجا Delete کنی.
حالا روی Class Library کلیک راست می کنی و از زیر منوی Add آیتم Component رو انتخاب می کنی.
یه صفحه خاکستری باز میشه که روش نوشته: To add components to your class, ... .

خب حالا از پنجره Solution به System.Windows.Forms یه Reference میدی و رو همون قسمت خاکستری رنگ F7 رو فشار میدی تا بری به بخش کد نویسی.

فضای نام System.Windows.Forms رو using می کنی و در اینصورت یه کدی به همچین شکلی داری:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary1
{
public partial class Component1 : Component
{
public Component1()
{
InitializeComponent();
}

public Component1(IContainer container)
{
container.Add(this);

InitializeComponent();
}
}
}

حالا اگه میخوای یه TextBox جدید بسازی به جای اینکه از Componenct ارث بری کنی از TextBox ارث بری کن. اینجوری:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary1
{
public partial class Component1 : TextBox
{
public Component1()
{
InitializeComponent();
}

public Component1(IContainer container)
{
container.Add(this);

InitializeComponent();
}
}
}

فقط توجه داشته باش که نوشتن UserControl کار سختیه و همه جوانب رو باید در نظر بگیری. برای مثال اگه میخوای یه خاصیت فقط خواندنی به نام Length داشته باشی که طول متن TextBox رو نشون بده اونو اینجوری مینویسی:


public int Length
{
get
{
return (base.Text.Length);
}
}

سوالی داشتی بپرس. موفق باشی.


دوباره سلام عزیز من نتونستم اون چیزی که می خوام رو بسازم:ناراحت:
ممنون میشم اگه برام بسازی چون خیلی بهش نیاز دارم ، من یه Textbox میخوام که وقتی Focos واردش شد زرد بشه وفتی ازش خارج شد سفید ، وقتی هم داخلش Enter زده شد بره به tab index بعدی
می دونم اینا تو برنامه هم هست ولی من نزدیک 50 تا textbox دارم.
اگه لطف کنی با کدش و طریقه استفادش بگی یه دنیا ممنون میشم.

hossein2007
دوشنبه 11 بهمن 1389, 10:13 صبح
سلام دوست عزیز.
این تکه کد همون چیزیه که می خوای:



using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;


namespace Inherited_Controls
{
class TextBox_Base : TextBox
{
public TextBox_Base()
{
if (!DesignMode)
{
this.Font = new System.Drawing.Font("tahoma", 9, System.Drawing.FontStyle.Regular);
this.RightToLeft = RightToLeft.No;

this.Enter += new EventHandler(_Enter);
this.Leave += new EventHandler(_Leave);
}
}

void _Enter(object sender, EventArgs e)
{
if (!DesignMode)
{
this.BackColor = Color.Yellow;
this.SelectAll();
}
}

void _Leave(object sender, EventArgs e)
{
if (!DesignMode)
{
this.BackColor = Color.White;
}
}
}
}



توجه کنید که در ToolBox تان یک کنترل بنام TextBox_Base به وجود می آید و می تونید مثل TextBox معمولی از اون استفاده کنید.

aliburnout
دوشنبه 11 بهمن 1389, 21:02 عصر
سلام دوست عزیز.
این تکه کد همون چیزیه که می خوای:



using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;


namespace Inherited_Controls
{
class TextBox_Base : TextBox
{
public TextBox_Base()
{
if (!DesignMode)
{
this.Font = new System.Drawing.Font("tahoma", 9, System.Drawing.FontStyle.Regular);
this.RightToLeft = RightToLeft.No;

this.Enter += new EventHandler(_Enter);
this.Leave += new EventHandler(_Leave);
}
}

void _Enter(object sender, EventArgs e)
{
if (!DesignMode)
{
this.BackColor = Color.Yellow;
this.SelectAll();
}
}

void _Leave(object sender, EventArgs e)
{
if (!DesignMode)
{
this.BackColor = Color.White;
}
}
}
}



توجه کنید که در ToolBox تان یک کنترل بنام TextBox_Base به وجود می آید و می تونید مثل TextBox معمولی از اون استفاده کنید.

سلام دوست عزیز
ممنون از راهنمایی خیلی کارم آسون شد.
اگه تونستی برام توضیح بده چی کار کردی تا برای باقی برنامه هام بتونم خودم درست کنم

hossein2007
دوشنبه 11 بهمن 1389, 23:51 عصر
خوشحالم که مشکلت حل شد.
در ادامه متد ها رو توضیح می دم.

اول کار که یه کلاس به نام TextBoxBase تعریف کردم که از کلاس TextBox ارث بری کرده.
در ادامه در متد سازنده اون فونت و خاصیت RightToLeft را ست کردم.
سپس برای آنکه به رویداد های Enter و Leave این TextBox دسترسی داشته باشم دو خط بعدی رو نوشتم.
در آخر هم در هر کدام از این رویدادها هم کد دلخواهم رو نوشتم.

توضیح در مورد ِDesignMode :
اگه این شرط گذاشته نشه، هنگامی که کنترل TextBox_Base را از ToolBox به روی فرم می آوری با فراخوانی شدن تابع سازنده، کدهایش اجرا می شود.
چون من تمایل داشتم در هنگام طراحی فرم و قرار دادن این کنترل روی فرم کد های سازنده اجرا نشوند در تمام کنترل های ارث بری شده ام این شرط رو می گذارم.
موفق باشی.