PDA

View Full Version : سوال: كدهاي ثابت هر پروژه



rahe behtari hast
یک شنبه 12 آذر 1391, 16:02 عصر
من يك فرم دارم و يك دكمه روي اون فرم. اين كدها رو ميخوام درك كنم


namespace WindowsFormsApplication7
{
partial class Form1
{
///<summary>
/// Required designer variable.
///</summary>
private System.ComponentModel.IContainer components = null;


///<summary>
/// Clean up any resources being used.
///</summary>
///<param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}


#region Windows Form 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()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(79, 42);
this.button1.Name = "button2";
this.button1.Size = new System.Drawing.Size(118, 43);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);


}


#endregion


private System.Windows.Forms.Button button1;
}

}


چندتا جاش برام نا مفهومه:


1- ما مگه ننوشتيم
private System.Windows.Forms.Button button1;

پس اين ديگه چه معنيي داره؟
this.button1.Name = "button2"



ما مگه اسم آبجكتي رو كه ايجاد كرديم همون موقع نذاشتيم button1 پس چرا name رو به عنوان يك پروپرتي در كلاس button در نظر گرفتن. بر فرض اگه عوضش كنيم چي ميشه؟!


2-متد Dispose كارش چيه؟

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}


3- اينها چيه؟

#region Windows Form Designer generated code
#endregion


4- اين چيه؟


private System.ComponentModel.IContainer components = null


در جاي ديگه اي هم اين كد وجود داره


namespace WindowsFormsApplication7
{
publicpartialclassForm1 : Form
{
public Form1()
{
InitializeComponent();
}


}
}


1-فضاي نام اين و بالاييه يكيه تنها تفاوتش توي كلاس هست كه كلاس پايين يك ارث بري كرده كه كلاس بالا نكرده. ميشه گفت اين دو سري كد كنار همن؟


2- فرم كامپوننت نيست. پس دقيقا چيه؟ ما براي ايجاد يك دكمه يك كدي نوشتيم. فرم رو چطور تشخيص ميده؟


3- براي دكمه خصوصيات زيادي وجود داره اما اينجا فقط چندتا دونشون رو مقدار داده. دليل چيه؟ بقيه كجا مقدار داده ميشن؟

مهرداد صفا
یک شنبه 12 آذر 1391, 17:32 عصر
با سلام

1- ما مگه ننوشتيم
private System.Windows.Forms.Button button1;

پس اين ديگه چه معنيي داره؟
this.button1.Name = "button2"



ما مگه اسم آبجكتي رو كه ايجاد كرديم همون موقع نذاشتيم button1 پس چرا name رو به عنوان يك پروپرتي در كلاس button در نظر گرفتن. بر فرض اگه عوضش كنيم چي ميشه؟!

در کد ما button1 در واقع فقط نام متغیری است که شی را در خود دارد اما در framework کنترل با خصوصیت Name شناخته می شود. مثلا شما برای پیدا کردن یک کنترل در فرم با استفاده از نام آن مینویسید:

this.Controls.Find("button2")//button1.Name

2-متد Dispose كارش چيه؟
این متود از IDisposable گرفته شده و بازنویسی میشود برای از بین بردن اشیا ساخته شده و آزاد سازی منابع

3- اينها چيه؟

#region Windows Form Designer generated code
#endregion
برای دسته بندی کدها درون editor برای خوانایی بیشتر به کار می روند. مثلا می توانید در یک کلاس خصوصیات و متودها را جدا جدا دسته بندی کنید


1-فضاي نام اين و بالاييه يكيه تنها تفاوتش توي كلاس هست كه كلاس پايين يك ارث بري كرده كه كلاس بالا نكرده. ميشه گفت اين دو سري كد كنار همن؟

بله. کلید واژه partial در تعریف کلاس به این معنیست که این کلاس ممکن است در چند فایل جداگانه و در قسمتهای مختلف تعریف شده باشد. در واقع هر دو کلاس یکی هستند.

2- فرم كامپوننت نيست. پس دقيقا چيه؟ ما براي ايجاد يك دكمه يك كدي نوشتيم. فرم رو چطور تشخيص ميده؟
درست متوجه منظور نشدم ولی فرم هم یک کامپوننت است. و اگر درست فهمیده باشم کنترل از طریق کد زیر به فرم اضافه می شود:
Form.Controls.Add(Control);


3- براي دكمه خصوصيات زيادي وجود داره اما اينجا فقط چندتا دونشون رو مقدار داده. دليل چيه؟ بقيه كجا بعضی از خصوصیات هم مقدار یپشفرض را دارند و مقداردهی نمیشوند.



"نمی دانم" گامیست به سوی دانش
شاه وفا ابالفضل

rahe behtari hast
دوشنبه 13 آذر 1391, 10:55 صبح
واقعا ممنون بخاطر جواب
فكر نميكردم كسي روي اين مباحث اطلاعات دقيقي داشته باشه. اميدوار شدم...



این متود از IDisposable گرفته شده و بازنویسی میشود برای از بین بردن اشیا ساخته شده و آزاد سازی منابع

سوال: اين برداشت من درسته؟
ما وقتي برنامه رو ران ميكنيم. حافظه اشغال ميشه سري بعد كه ران شد بايد حافظه پاك بشه.


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

سوال: يعني قابليتش در حد همون توضيحاتيه كه با // ايجاد ميكنيم؟ ميشه كلا حذفش كرد؟


بله. کلید واژه partial در تعریف کلاس به این معنیست که این کلاس ممکن است در چند فایل جداگانه و در قسمتهای مختلف تعریف شده باشد. در واقع هر دو کلاس یکی هستند.

سوال: دليل چند تكه كردن يك كلاس چيه؟ دليل خاصي داره؟ ماجراي اون ارث بري كه روي قسمت خاصي از كلاس اعمال شده توي چند تكه كردنش مهمه؟


درست متوجه منظور نشدم ولی فرم هم یک کامپوننت است.

سوال: ببينيد من نميدونم چرا فرم رو مثل يك كامپوننت نيومده توي منوي تولز بذاره؟
از طرفي با ايجاد هر فرم ما در فولدر برنامه يك فولدر جديد ايجاد ميكنيم كه براي ساير كامپوننت ها اين اتفاق نميافته.
از همه مهمتر ما كي و كجا گفتيم كه برنامه از كلاس فرم1 شروع بشه؟
و داخل كدها اين فرم كجا ايجاد شده؟ مثلا ما از روي كلاس button يك آبجكت نمونه ميگيريم به اسم button1 اما براي form اين اتفاق نميافته. براي همين ميگم فرم كامپوننت نيست. در واقع اتفاقي كه براي فرم ميافته اينه كه كلاسي ساخته ميشه كه از كلاي form ارث بري ميكنه. و حالا ما از كلاس form1 ميتونيم آبجكت ايجاد كنيم.
چرا در دات نت فريم ورد كلاس button با كلاس form فرق ميكنه؟
ميشه اين طور گفت كه چون button به تنهايي كافيه ما فقط از روش نمونه ميگيريم اما كلاس form بايد داخلش پر بشه و يك سري كامپوننت بهش اضافه بشه. به همين دليل يك كلاس ميسازيم به اسم form1 كه ويژگيهاي form رو داره و حالا داخلش هر چيزي خواستيم ميچينيم و بعد از روي اين كلاس نمونه گيري ميكنيم و از اون نمونه استفاده ميكنيم؟
به شكل ديگه ما اگر اين كد رو بنويسيم:
form form1 = new form();a
با هيچ خطايي رو برو نميشيم اما فقط يك فرم خالي ظاهر ميشه كه فاينده اي نداره
به همين دليل ما اول يك كلاس ايجاد ميكنيم به اسم form1:form و بعد اون رو پر ميكنيم و حالا ازش آبجكت ميسازيم
form1 f=new form1();a

و در اصل تمام كامپوننتهايي كه به صورت خالي كاربرد نداره مثل Dataset يا همون form يا Crystal اول يك كلاس ميسازيم و از اون كامپوننت ارث بري ميكنه بعد از پر كردنشون حالا از چيزي كه خودمون ساختيم نمونه گيري ميكنيم.

سوال: با اين تفاصيل ما ميتونيم به جاي اين كه يك دي ال ال بسازيم و به كمك اون يك كامپوننت رو سفارشي كنيم. داخل همون پرو‍ژه اصليمون يك كلاس باز كنيم و مثلا وراثتش رو با textbox برقرار كنيم و اون رو سفارشي كنيم و از اين به بعد به جاي اين كه از منوي تولز textbox رو بياريم از كلاس ساخته شده خودمون اون رو نمونه گيري كنيم. فكر كنم تنها مشكلش اينه كه نميتونيم به منوي تولز اضافه اش كنيم و خودمون به صورت دستي بايد تمام تنظيماتش رو انجام بديم

سوال: آيا dataset و crystal هم كه مثل form و class و linqtoclass به برنامه اضافه ميشن هم كامپوننت هستن؟


بعضی از خصوصیات هم مقدار یپشفرض را دارند و مقداردهی نمیشوند.


اين حرف درسته؟
ما وقتي يك كلاس داريم -چه خودمون ايجادش كرده باشيم و چه در دات نت فريم ورك آماده برامون گذاشته باشن- يك سري پروپرتي داره كه بعضي از اونها به صورت پيشفرض مقدار داده شدن و بعضيها خالي ان كه موقع نمونه گيري اونها رو حتما بايد مقدار بديم.

سوال: وقتي ما يك نمونه گيري از كلاس xdocument انجام ميديم حتما بايد اون پروپرتي آدرس رو كه مقدار پيش فرض نداره و در عين حال پر بودنش حياتي است رو خودمون مقدار بديم به اين شكل:


Xdocument D = new Xdocument ("C://Folder.file.XML);a


خب ما براي دكمه هم همين داستان رو داريم. يك دكمه مجموعه اي از ويژگيهاست كه بعضيها مثل رنگ مقدار پيش فرض داره. بعضيها مثل سايز و مكان موقع ايجاد شدن حتما بايد مشخص بشه. پس اصولا با توجه به مثال قبل بايد پروپرتيهاي حياتي رو همون موقع مشخص كنيم مثل:


button button1=new button (size,location);a

سوال: پروپرتي text در button يك پروپرتي هست كه پر بودنش واجب نيست و ميتونه خالي باشه. غير از بحث زيبايي دليل ديگه اي داره كه دات نت فريم ورد به اين پروپرتي مقدار پيش فرض نداده و در عين حال خودش موقع ايجاد اسم مناسب براش ميذاره؟ در واقع ميخوام به اين نتيجه برسم كه اون پروپرتيهايي كه موقع ايجاد مقدار دهي ميشن لزوما جزء پروپرتيهاي حياتي نيستن.

------------------------------------------------------------------------------------------
سوال جديد: ميتوان گفت كلاسهايي كه استاتيك هستند مثل messagebox در واقع كلاسهايي هستند كه ما هيچوقت به بيش از يك دونشون هم زمان نياز نداريم. به همين دليل لازم نيست از اين كلاسها نمونه گرفته بشه و پروپرتيها داخل نمونه مقدار دهي بشن بلكه داخل كلاس اصلي پروپرتيهاي اصلي رو مقدار ميديم.

اين حرف درسته؟
كلا دليل استفاده از كلاسهاي استاتيك اين نيست كه يك كلاسي وجود داره كه هيچوقت به طور همزمان نبايد چند مرتبه استفاده بشه و براي خلاص شدن از نمونه گيري بي دليل استاتيك ايجاد شده؟
------------------------------------------------------------------------------------------
سوال جديد: يك مقدار درباره this برام توضيح ميديد؟ من اين طور ياد گرفتم كه this آبجكتيست كه به فرم باز شده اشاره ميكنه. اما متوجه دو تا موضوع نيشم.
اولا اين چه آبجكتيه كه يك بار مال فرم1 هست يك بار مال فرم 2 و...
دوما اين نمونه گيري كي و كجا اتفاق ميافته
سوما اگر نبود چه مشكلي پيش مياومد؟ ما خيلي راحت ميتونيستيم مثل بقيه برخورد كنيم مثل:

class main
}
form1 f=new form1();a

f.show();a
{


Class form1
}
f.text="ali";a
{
------------------------------------------------------------------------------------------
سوال جديد: اين حرف درسته كه ما در C#‎‎‎‎ 5 تا قسمت كليدي داريم

Namespace
Class
Method
Property
Event

و هيچ چيزي از اين 5 تا خارج نيست؟ interface ها چه جور چيزهايي هستند؟ چيز ديگه اي هم داريم؟

سوال: متد ها مدلهاي مختلفي دارن. مثل سازنده ها كه از نظر ظاهري با بقيه متدها فرق داره. و متدهاي هندل كه وروديش يك event هست. و....
چند مدل method داريم؟

سوال:چهارچوب كلي يك event به چه شكليه؟ يك چنين شكلي رو ميشه براش بكشيد:

event
}
{

سوال: وقتي يك هندل متد ايجاد ميكينم مثلا متدي براي وقتي كه "روي دكمه1 كليك شد" چه چيزهايي رو به عنوان ورودي اون متد بهش ميفرسته؟ چيزهايي كه داخل پرانتز هميشه مينويسه رو ميشه برام بشكافيد

سوال: اين e دقيقا چيه؟

rahe behtari hast
دوشنبه 13 آذر 1391, 14:53 عصر
دوستان همكاري لطفا...

مهرداد صفا
دوشنبه 13 آذر 1391, 23:18 عصر
سلام
خواهش میکنم.


سوال: اين برداشت من درسته؟
ما وقتي برنامه رو ران ميكنيم. حافظه اشغال ميشه سري بعد كه ران شد بايد حافظه پاك بشه.

جواب: ما وقتی برنامه را ران میکنیم حافظه اشغال میشود. در اولین فرصت باید حافظه آزاد شود.
با این که مدیریت حافظه در .net به صورت خودکار صورت میگیرد اما کلاسهایی مختلف از قبیل کلاسهای IO و data connectionها هستند که از منابع unmanaged استفاده میکنند و چون مدیریت این منابع با .net نیست garbage collection قادر به شناسایی و آزادسازی این منابع نیست که این آزاد سازی باید به صورت دستی در متود Dispose صورت گیرد. از این موارد میتوان به Late binding objects هم اشاره کرد که اگر منابع آنها آزاد نشود میتوانند در اجرای مجدد برنامه مشکل ساز باشند.



سوال: دليل چند تكه كردن يك كلاس چيه؟ دليل خاصي داره؟ ماجراي اون ارث بري كه روي قسمت خاصي از كلاس اعمال شده توي چند تكه كردنش مهمه؟

جواب: به طور کلی قسمت بندی کلاس میتواند در پروژه های بزرگ و تیمی مورد استفاده قرار گیرد. در اینجا دلیل این کار برای جدا کردن قسمت کد designer از کد برنامه نویس است تا هم designer کار خود را به خوبی انجام دهد و هم برنامه نویس درگیر کدهای designer نباشد. موضوع ارثبری تداخلی با قسمت بندی کلاس ندارد.


سوال: ببينيد من نميدونم چرا فرم رو مثل يك كامپوننت نيومده توي منوي تولز بذاره؟
از طرفي با ايجاد هر فرم ما در فولدر برنامه يك فولدر جديد ايجاد ميكنيم كه براي ساير كامپوننت ها اين اتفاق نميافته.
از همه مهمتر ما كي و كجا گفتيم كه برنامه از كلاس فرم1 شروع بشه؟
و داخل كدها اين فرم كجا ايجاد شده؟ مثلا ما از روي كلاس button يك آبجكت نمونه ميگيريم به اسم button1 اما براي form اين اتفاق نميافته. براي همين ميگم فرم كامپوننت نيست. در واقع اتفاقي كه براي فرم ميافته اينه كه كلاسي ساخته ميشه كه از كلاي form ارث بري ميكنه. و حالا ما از كلاس form1 ميتونيم آبجكت ايجاد كنيم.
چرا در دات نت فريم ورد كلاس button با كلاس form فرق ميكنه؟
ميشه اين طور گفت كه چون button به تنهايي كافيه ما فقط از روش نمونه ميگيريم اما كلاس form بايد داخلش پر بشه و يك سري كامپوننت بهش اضافه بشه. به همين دليل يك كلاس ميسازيم به اسم form1 كه ويژگيهاي form رو داره و حالا داخلش هر چيزي خواستيم ميچينيم و بعد از روي اين كلاس نمونه گيري ميكنيم و از اون نمونه استفاده ميكنيم؟
به شكل ديگه ما اگر اين كد رو بنويسيم:
form form1 = new form();a
با هيچ خطايي رو برو نميشيم اما فقط يك فرم خالي ظاهر ميشه كه فاينده اي نداره
به همين دليل ما اول يك كلاس ايجاد ميكنيم به اسم form1:form و بعد اون رو پر ميكنيم و حالا ازش آبجكت ميسازيم
form1 f=new form1();a

و در اصل تمام كامپوننتهايي كه به صورت خالي كاربرد نداره مثل Dataset يا همون form يا Crystal اول يك كلاس ميسازيم و از اون كامپوننت ارث بري ميكنه بعد از پر كردنشون حالا از چيزي كه خودمون ساختيم نمونه گيري ميكنيم.

جواب: نمی دانم شاید به خاطر این است که فرم یک ContainerControl است که البته تفاوت فرم با button هم در همین است که یک ContainerControl است و میتواند شامل کنترلهای دیگر باشد و چون TopLevelControl است نمیتواند به عنوان یک کنترل به یک فرم یا هر ContainerControl دیگر اضافه بشود. اگر میخواهید در مورد کامپوننت بودن فرم مطمئن شوید از C#‎ بپرسید!:

//این کد را درون یک فرم قرار دهید
MessageBox.Show((this is Control).ToString());
MessageBox.Show((this is Component).ToString());

یا سلسله وراثت فرم را در MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.aspx) ببینید که به این صورت است:

form<ContainerControl<ScrollableControl<Control:System.ComponentModel.Component<...
البته فرم یک کامپوننت خاص است که یک WindowsApplication با آن شروع می شود. در ویندوز هر برنامه از یک متود اصلی شروع میشود که در C#‎ در کلاس Program در فایل Program.cs میتوانید این روال را ببینید. در اینجا برنامه(System.Windows.Forms.Application) با استفاده از یک شی جدید از Form1 اجرا میشود که اگر به این صورت نبود برنامه از کجا باید میدانست که کدام فرم، فرم اصلی است. شما حتی میتوانید برنامه را به این صورت run کنید:

static void Main()
{
Application.Run(new Form() { Text="test"});
}

و ببینید که برنامه بدون اینکه بفهمد ما از این فرم یک کلاس گرفتیم و فرم را پر کردیم یا نه اجرا میشود.


سوال: با اين تفاصيل ما ميتونيم به جاي اين كه يك دي ال ال بسازيم و به كمك اون يك كامپوننت رو سفارشي كنيم. داخل همون پرو‍ژه اصليمون يك كلاس باز كنيم و مثلا وراثتش رو با textbox برقرار كنيم و اون رو سفارشي كنيم و از اين به بعد به جاي اين كه از منوي تولز textbox رو بياريم از كلاس ساخته شده خودمون اون رو نمونه گيري كنيم. فكر كنم تنها مشكلش اينه كه نميتونيم به منوي تولز اضافه اش كنيم و خودمون به صورت دستي بايد تمام تنظيماتش رو انجام بديم

جواب :دقیقا. هر شی از کلاسی که از Control ارثبری کرده باشد میتواند به فرم اضافه شود (به استثنای TopLevelControl).


سوال: آيا dataset و crystal هم كه مثل form و class و linqtoclass به برنامه اضافه ميشن هم كامپوننت هستن؟

جواب: میتوانید از C#‎ بپرسید.


------------------------------------------------------------------------------------------
سوال جديد: ميتوان گفت كلاسهايي كه استاتيك هستند مثل messagebox در واقع كلاسهايي هستند كه ما هيچوقت به بيش از يك دونشون هم زمان نياز نداريم. به همين دليل لازم نيست از اين كلاسها نمونه گرفته بشه و پروپرتيها داخل نمونه مقدار دهي بشن بلكه داخل كلاس اصلي پروپرتيهاي اصلي رو مقدار ميديم.

اين حرف درسته؟
كلا دليل استفاده از كلاسهاي استاتيك اين نيست كه يك كلاسي وجود داره كه هيچوقت به طور همزمان نبايد چند مرتبه استفاده بشه و براي خلاص شدن از نمونه گيري بي دليل استاتيك ايجاد شده؟

جواب: کلاسها میتوانند به دلایلی مثل سهولت در استفاده، خصوصیاتی مشترک در کل سیستم و.... به صورت static تعریف شوند و اعضای آنها بدون نیاز به instance در دسترس باشند. مثلا فرض کنید یک کلاس به نام SystemTime داریم که خصوصیات آن Hour, Minute, Second هستند که زمان جاری سیستم را Get و set میکنند. حالا چه نیازی است که این کلاس نمونه سازی شود.
متودهای static هستند که قابلیت اجرای همزمان را دارند که برای این کار از یک thread مجزا استفاده میکنند.
پس متودها میتوانند به صورت همزمان اجرا بشوند یا نشوند و در عین حال static باشند یا نباشند.


------------------------------------------------------------------------------------------
سوال جديد: يك مقدار درباره this برام توضيح ميديد؟ من اين طور ياد گرفتم كه this آبجكتيست كه به فرم باز شده اشاره ميكنه. اما متوجه دو تا موضوع نيشم.
اولا اين چه آبجكتيه كه يك بار مال فرم1 هست يك بار مال فرم 2 و...
دوما اين نمونه گيري كي و كجا اتفاق ميافته
سوما اگر نبود چه مشكلي پيش مياومد؟ ما خيلي راحت ميتونيستيم مثل بقيه برخورد كنيم مثل:

class main
}
form1 f=new form1();a

f.show();a
{


Class form1
}
f.text="ali";a
{

جواب: this در اینجا در واقع یک کلید واژه است که به یک شی که بعدا از کلاس جاری ساخته میشود اشاره میکند (خواه این کلاس فرم باشد یا هر چیز دیگر).
به کد زیر دقت کنید:

public class Test
{
public int value1;
public Test()
{
this.value1=1;
}
}
}
//...
Test testA = new Test();

در واقع بعد از این که یک instance از کلاس Test ساخته میشود به نام TestA، حالا this=TestA .
موردی که گفتید به این دلیل عملی نیست که از یک کلاس ممکن است چند نمونه ساخته شود (مگر اینکه منظور شما از f همان this باشد).



سوال: وقتي يك هندل متد ايجاد ميكينم مثلا متدي براي وقتي كه "روي دكمه1 كليك شد" چه چيزهايي رو به عنوان ورودي اون متد بهش ميفرسته؟ چيزهايي كه داخل پرانتز هميشه مينويسه رو ميشه برام بشكافيد

جواب: بستگی به رویداد تعریف شده دارد. این آرگومنتها با رویداد تعریف میشوند و در زمان فراخوانی به متود Handler ارسال میشوند. شما میتوانید رویدادی تعریف کنید که آرگومنتی نداشته باشد ولی به طور معمول در .net رویدادها دو آرگومنت دارند که اولی (فرستنده رویداد) همان شی است که رویداد روی آن اتفاق افتاده و E جزئیات مربوط به رویداد را شامل میشود.


سوال: اين e دقيقا چيه؟
[/QUOTE]
جواب: یک شی ساخته شده از یک کلاس که از کلاس EventArg ارثبری میکند و بسته به هر رویداد میتواند متفاوت باشد و حاوی جزئیاتی در مورد رویداد است. مثلا در مورد رویدادهای کیبورد، E یک KeyEventArgs است و خصوصیت KeyCode کد متناظر کلیدی است که فشده شده.

شاه وفا ابالفضل

rahe behtari hast
چهارشنبه 15 آذر 1391, 08:49 صبح
ممنون دوست عزيز كه جواب ميديد
ميدونم براي جواب دادن به سوالها وقتي زيادي ازتون گرفته ميشه اما ناچارم براي يادگرفتن يكم پر رو باشم! حلال كنيد...


سه تا سوال از سري قبل باقي موند:

سوال: يعني قابليتش در حد همون توضيحاتيه كه با // ايجاد ميكنيم؟ ميشه كلا حذفش كرد؟


سوال: وقتي ما يك نمونه گيري از كلاس xdocument انجام ميديم حتما بايد اون پروپرتي آدرس رو كه مقدار پيش فرض نداره و در عين حال پر بودنش حياتي است رو خودمون مقدار بديم به اين شكل:



Xdocument D = new Xdocument ("C://Folder.file.XML);a



خب ما براي دكمه هم همين داستان رو داريم. يك دكمه مجموعه اي از ويژگيهاست كه بعضيها مثل رنگ مقدار پيش فرض داره. بعضيها مثل سايز و مكان موقع ايجاد شدن حتما بايد مشخص بشه. پس اصولا با توجه به مثال قبل بايد پروپرتيهاي حياتي رو همون موقع مشخص كنيم مثل:



button button1=new button (size,location);a

پروپرتي text در button يك پروپرتي هست كه پر بودنش واجب نيست و ميتونه خالي باشه. غير از بحث زيبايي دليل ديگه اي داره كه دات نت فريم ورد به اين پروپرتي مقدار پيش فرض نداده و در عين حال خودش موقع ايجاد اسم مناسب براش ميذاره؟ در واقع ميخوام به اين نتيجه برسم كه اون پروپرتيهايي كه موقع ايجاد مقدار دهي ميشن لزوما جزء پروپرتيهاي حياتي نيستن.

سوال: اين حرف درسته كه ما در C#‎‎‎‎‎‎‎ 5 تا قسمت كليدي داريم

Namespace
Class
Method
Property
Event

و هيچ چيزي از اين 5 تا خارج نيست؟ interface ها چه جور چيزهايي هستند؟ چيز ديگه اي هم داريم؟

متد ها مدلهاي مختلفي دارن. مثل سازنده ها كه از نظر ظاهري با بقيه متدها فرق داره. و متدهاي هندل كه وروديش يك event هست. و....
چند مدل method داريم؟


و سه سوال جديد:

سوال مهم: فكر كنم درك اين موضوع بتونه خيلي از مشكلاتم رو حل كنه. ما دو تا چيز اساسي داريم "ايجاد يك شي از يك كلاس" و " نمونه گرفتن از يك كلاس"

button button1
در اينجا ما يك شي از يك كلاس ايجاد ميكنيم

new button()a
در اينجا هم ما يك نمونه از يك كلاس گرفتيم

خب اين دو تا رو ميخوام مفهوم دقيقش رو -دقيقا همون اتفاقي كه توي سيستم عامل و كامپايلر ميافته- درك كنم.
من فعلا اين طور خودم رو قانع كردم:

ما اول با ايجاد يك شي در واقع قسمتي از حافظه را اسم گذاري ميكنيم
و زماني كه يك نمونه از يك كلاس رو داخل اون شي ميريزيم در واقع يك كپي از پروپرتيهاي اون کلاس (نه كدها و نه ساير مغييرها) داخل اون فضا ريخته ميشه
حالا اين پروپرتيها دو گروهن.. بعضيهاشون از قبل يك مقدار پيشفرض داخلشون هست و بعضيها خالي ان
موقع ايجاد نمونه از يك كلاس بايد اون پروپرتيهاي رو كه خالي هستن مقدار بديم به اين شكل:
new button(value,value,...)a


مواقعي هست كه ما آبجكت ايجاد ميكنيم اما نمونه اي داخلش نميريزيم
int a=1
زماني هم هست كه بدون داشتن آبجكت نمونه ميگيريم
form1.location=system.form.drawing.point();a



اينها شايد با توضيحي كه من دادم نخونه


ميشه با همين ديد گفته هام رو اصلاح و تكميل كنيد؟


سوال: آيا كامپوننت با كنترلر فرق داره؟


سوال: در مورد this فكر كنم اين طور شد:

ما وقتي داريم داخل يك كلاس كد مينويسيم نميتونيم از اسم اون كلاس استفاده كنيم و اون كلاس رو صدا كنيم براي رفع اين مشكل this به وجود اومده. this در واقع هميشه به همون كلاسي اشاره داره كه ما داريم داخلش كد مينويسيم.

rahe behtari hast
سه شنبه 21 آذر 1391, 13:01 عصر
يك سوال ديگه:

يكم راجع به اين كد برام بگيد. اين كديه كه خوده برنامه به صورت خودكار وقتي ما يك هندلر متد ايجاد ميكنيم در اينيشيالايز كامپوننت ايجاد ميكنه:

this.button1.Click += new System.EventHandler(this.button1_Click);

در واقع ما دو تا كلاس مهم داخل دات نت داريم به اسم EventHandler و EventArgs

هر وقت براي يك رويداد روي يك آبجكت متدي ميسازيم و داخلش دستوري مينويسيم اين كد رو هم بايد به قسمت ديزاين اضافه كنيم:

Object.Event += new EventHandler(HandlerMethod);a

و از طرفي داخل همون handlermethod يك آبجكت از كلاس EventArgs ميسازيم

private void button1_Click (object sender,EventArgs e)
{
}

EventArgs e

-------------

حالا اگر داخل يك handlermethod بنويسيم

e.Handled = False

ديگه بعد از اتفاق افتادن اون رويداد اون عمليات انجام نميشه
مثلا اگر روي يك آبجكتي از كلاس textbox دكمه كيبورد زده شد و رويداد keypress اتفاق افتاد بايد عمليات درج متن داخل textbox اتفاق بيافته كه نميافته

حالا اگر در يكي از رويدادهاي keyup-keudown-keypress بنويسيم
e.Handled = False
و داخل يكي ديگه بنويسيم
e.Handled = true
چه اتفاقي ميافته؟

كدوم اولويت داره؟

اين حرف درسته كه بعد از اتفاق افتادن يك رويداد اول handlermethod به صورت كامل خودنده ميشه و بعد از اون در صورت true بودن عمليات ثابت مربوط به اون رويداد اتفاق ميافته


خلاصه يكم ميخوام از رويداها و اينها بدونم. مفهومي و عميق اما ساده و خلاصه

اصلا ميتونيم بگيم رويداد هم يك چهارچوبي داره مثل فضاي نام-كلاس-متد-پروپرتي ؟
رويداد هم يك قالب خاص داره. آره؟