PDA

View Full Version : استفاده از یک کلاس از نوع text box



once4ever
سه شنبه 20 بهمن 1383, 16:05 عصر
من یه text box دارم که یه سری کد برای تغییراتش نوشتم و حالا میخوام این text box رو تو 100جای برنامم استفاده کنم بنظر شما راه منطقیش چیه؟ یه کلاس درست کنم و صداش بزنم (که خودم اینو قبول دارم) که اگه یه راهنمایی کنید که چجوری کلاسشو درست کنم ممنون میشم.

M.GhanaatPisheh
سه شنبه 20 بهمن 1383, 18:30 عصر
یه User Control بساز و همه این کارا رو اونجا انجام بده
هر چند بار هم که خواستی به برنامت اضافش کن.

once4ever
چهارشنبه 21 بهمن 1383, 09:58 صبح
میشه بیشتر توضیح بدین

M.GhanaatPisheh
چهارشنبه 21 بهمن 1383, 11:40 صبح
New Project -> Windows Control Library
از مسیر زیر یه User Control بسازید
یه فرم کوچولو در اختیار شما قرار میگیره
یه TextBox روش بندازین و کدهایی که لازم میدونید براش بنویسید
برنامه زمان کامپایل بصورت dll کامپایل میشه

میتونید توی ToolBox تون هم Addش کنید و هرجا لازم بود Drag کنید.

موفق باشید.

once4ever
پنج شنبه 22 بهمن 1383, 17:45 عصر
خوبه ولی من اینو نمیخوام چون با دی ال ال یه محدودیتی تو انجام خصوصیتهای تکست باکسم بوجود میاد که خوب نیست (شاید بتونی اونو حلش کنی برام؟! میخوام موقع استفاده از دی ال ال از نوع تکست باکس بتونم اندازه تکست باکسمو تو برنامه تغییر بدم که البته باید با get and set اینکارو کرد که موفق نشدم !)

Peyman_Ranjbar
جمعه 23 بهمن 1383, 02:22 صبح
به نظر من استفاده از کامپوننتی که خصوصیات textbox رو ارث ببره بهترین راهه

Peyman_Ranjbar
جمعه 23 بهمن 1383, 02:28 صبح
ببخشید کامل نگفتم
اول کد


public class Mytextbox :System.Windows.Forms.TextBox
{
......
}


و داخل این کد هر متدی که خواستی اضافه کن
و هر کدوم از خصوصیا textbox رو که خواستی از بین ببری override کن


من معمولا از این روش استفاده می کنم

مثال



using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;

namespace MyControls
{
/// <summary>
/// Summary description for NumBox.
/// </summary>
internal class NumBox : System.Windows.Forms.TextBox
{
private bool noNum=false;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public NumBox(System.ComponentModel.IContainer container)
{
///
/// Required for Windows.Forms Class Composition Designer support
///
container.Add(this);
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

public NumBox()
{
///
/// Required for Windows.Forms Class Composition Designer support
///
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}


#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.KeyDown+=new System.Windows.Forms.KeyEventHandler(NumBox_KeyDow n);
this.KeyPress+=new System.Windows.Forms.KeyPressEventHandler(NumBox_K eyPress);
this.MaxLength=9;
//this.Font=new System.Drawing.Font("NewFont",10);
}
#endregion

private void NumBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
noNum=false;
if(e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
if(e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
if(e.KeyCode != Keys.Back)
noNum=true;
}

private void NumBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if(noNum)
e.Handled=true;
}
public int Number
{
get
{
if(base.Text!=string.Empty)
return Convert.ToInt32(base.Text);
else
return 0;
}
set
{
base.Text = value.ToString();
}
}
}
}


این یک کامپوننت هست که فقط عدد قبول می کنه از همون textbox

once4ever
جمعه 23 بهمن 1383, 08:37 صبح
unicorn عزیز مرسی از جوابت ولی همونطور که گفتم من یک gui از نوع textbox ساختم(dll) و خوب کار میکنه و تنها مشکلم اینه که وقتی داخل برنامه اصلی استفاده میکنم نمیتونم سایز یا اندازه این textbox رو عوض کنم . مثلا برای مقدار این textbox از خاصیت get & set بصورت زیر استفاده کردم:

public string TextInput
{
set
{
textInput.Text=value;
textInput.RightToLeft=System.Windows.Forms.RightTo Left.Yes;
}
get
{
return textInput.Text;
}
در مورد سایز نمیدونم باید چجوری عمل بشه؟
متشکرم

Peyman_Ranjbar
یک شنبه 25 بهمن 1383, 02:22 صبح
خوب یه نگاه به تعریف کلاس بنداز


internal class NumBox : System.Windows.Forms.TextBox


البته ممکنه من منظورت رو دقیق متوجه نشم ولی اگه از کلاس textbox ارث برده باشی تمام خصوصیات مثل سایز هم با اون تغییر میکنه

once4ever
یک شنبه 25 بهمن 1383, 21:22 عصر
دقیقا همینطور که شما میگی :موفق:
مرسی از جواب خوبت خیلی کمک کرد

M.GhanaatPisheh
دوشنبه 26 بهمن 1383, 00:39 صبح
حالا یه سوال من ازتون بپرسم ؟ :)
once4ever و UnicorN عزیز اگر بخواید چندتا کنترل جاهای زیادی از برنامتون استفاده کنین چیکار میکنین؟
از همه اون کلاسها ارث بری میکنین؟ :)

Peyman_Ranjbar
دوشنبه 26 بهمن 1383, 03:19 صبح
اینجور مواقع UserControl استفاده باید بشه

اون کنترلها هم روی usercontrol قرار می گیره :sunglass:

M.GhanaatPisheh
دوشنبه 26 بهمن 1383, 14:09 عصر
:wink:

once4ever
سه شنبه 27 بهمن 1383, 11:03 صبح
خوب نکته اول اینه که من یه user control درست کردم و از یک text box استفاده کردم و کدهامو داخل اون نوشتم تنها مشکلی که دارم اینه که موقع استفاده از dll سایز textbox رو نمیتونم تغییر بدم!! ؟
نکته دوم اینه که دقیقا این یک textbox هست که خیلی زیاد استفاده میشه آیا فکر میکنید هر بار ساختن این کلاس مشکلی در اجرا بوجود میاره؟!

M.GhanaatPisheh
سه شنبه 27 بهمن 1383, 19:26 عصر
خوب حالا با کد زیر میتونی Size رو هم عوض کنی
یه Property که به کلاست اضافه میشه

public System.Drawing.Size tSize
{
get
{
return textBox1.Size;
}
set
{
textBox1.Size = new System.Drawing.Size(value.Width,value.Height);
}
}

بازم مشکلی هست؟

Peyman_Ranjbar
چهارشنبه 28 بهمن 1383, 02:33 صبح
آیا فکر میکنید هر بار ساختن این کلاس مشکلی در اجرا بوجود میاره؟!

دقیقا نه! مشکلی نداره چون به جای اینکه textbox بسازه از کنترل ساخته شده استفاده میکنه


خوب حالا با کد زیر میتونی Size رو هم عوض کنی
یه Property که به کلاست اضافه میشه

public System.Drawing.Size tSize
{
get
{
return textBox1.Size;
}
set
{
textBox1.Size = new System.Drawing.Size(value.Width,value.Height);
}
}


بازم مشکلی هست؟

وقتی با وراثت از یک کنترل میشه کنترلی ساخت که فقط خصوصیات دلخواه رو تغییر بدیم چرا از usercontrol ?
:confy2:
usercontrol رو زمانی باید استفاده کرد که از چند کنترل همزمان ودر یک نقطه لازم باشه
نمی دونم شما چرا اینقدر به usercontrol اصرار می کنید؟
دونستنش برای من هم جالبه و آموزنده :flower:

once4ever
چهارشنبه 28 بهمن 1383, 13:30 عصر
من هم همینطور میخوام بدونم نوع و مورد استفاده هر کدوم بصورت حرفه ای تو چه حالتهایی هست . نه اینکه چون کارو میشه اونجوریم انجام داد پس انجام بدیم . اگه اطلاعاتی دارید یاد میگیریم.
ممنون :wink:

Peyman_Ranjbar
پنج شنبه 29 بهمن 1383, 03:26 صبح
در کل استفاده از کامپوننت سریعتر هست چون فقط کنترل والد رو لود می کنه ولی usercontrol چون از چند کنترل استفاده می کنه(حداقل دو تا یکی خود usercontrol و دیگری کنترلی که روی آن گذاشته میشه)

usercontrol زمانی استفاده میشه که بخواهیم با استفاده از چند کنترل یک کنترل مجتمع بسازیم تا مجبور به کد نویسی در ماژول برنامه نباشیم یا کلا بگم مثل نشون دادن یک فرم در یک container

مثلا برای ساخت قسمتی از برنامه که backup می گیره و لازمه که در 10 تا فرم نمایش داده بشه اگر غیر از usercontrol استفاده بشه واقعا اشتباهه (نمی شه که اون کدها رو همه جای برنامه تکرار کرد حتی با کپی و پیست :embr: ) :mrgreen:

ولی وقتی می خواهیم کنترلی درست کنیم که فقط تغییرات کوچکی در نمونه اصلیش دادیم دیگه استفاده از usercontrol ذلالت آوره :mrgreen:

در کل usercontrol برای ساخت کنترلهای پیچیده و complex هست :strange:



اگه از usercontrol برای همین نمونه ای که مثالش رو چند تا پست قبل گفتم بخواهی استفاده کنی باید تک تک property ها و event ها رو دوباره تعریف کنی ::نوشتن:: ::نوشتن:: ولی با این روش فقط !! موارد دلخواه رو میتونی override کنی یا موارد
جدیدی به اون اضافه کنی :wink:


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

موفق باشی :flower: :flower:

once4ever
دوشنبه 03 اسفند 1383, 12:21 عصر
UnicorN وdot_net_lover عزیز مرسی از توضیحات خوبتون و کمکی که کردید :reading:
موفق باشید

مطهر
دوشنبه 03 اسفند 1383, 16:27 عصر
:thnx:

اگه از usercontrol برای همین نمونه ای که مثالش رو چند تا پست قبل گفتم بخواهی استفاده کنی باید تک تک property ها و event ها رو دوباره تعریف کنی
میشه در این مورد بیشتر توضیح بدهید (با یه مثال عالی میشه :mrgreen: ):sunglass:

Peyman_Ranjbar
دوشنبه 03 اسفند 1383, 23:15 عصر
میشه در این مورد بیشتر توضیح بدهید (با یه مثال عالی میشه )

با دقت پستها رو بخون
فکر نکنم چیزی از قلم افتاده باشه