PDA

View Full Version : نامی برای مجموعه ای از متغیرها



benyamin_pc
سه شنبه 19 دی 1385, 08:29 صبح
سلام
اگه چند تا متغییر با نام های مختلف داشته باشیم چطوری میشه مثلا pl را به همه آنها نسبت داد;که مثلا وقتی بگیم pl این کارو بکن همه اونها اون کارو بکنن

sinpin
پنج شنبه 28 دی 1385, 08:20 صبح
سلام
اگه چند تا متغییر با نام های مختلف داشته باشیم چطوری میشه مثلا pl را به همه آنها نسبت داد;که مثلا وقتی بگیم pl این کارو بکن همه اونها اون کارو بکنن


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

یک کلاس abstract مثل employee میتونه showsalary داشته باشه. و کلاسهایی مثل hour_emp(کارمند ساعتی) و cont_emp(کارمند قراردادی) باید این متود رو override کنند. حالا از بیرون میتونید به هر نوع کارمند بگید showsalary کن.

benyamin_pc
پنج شنبه 28 دی 1385, 12:46 عصر
میشه یه تیکه کد بذارین که مثلا سه تا متغییر با نامهای a1,a2,a3 داشته باشیم و اسم همشون b باشه؟

linux
پنج شنبه 28 دی 1385, 21:15 عصر
دوست عزیز شما باید از آرایه ها استفاده کنید در حالت پیشرفته تر لیست ها و جنریکها در دات نت .

sinpin
شنبه 30 دی 1385, 13:00 عصر
فکر میکنم اون چیزی که مد نظر شما باشه با collection ها (مثل arraylist) حل بشه.
توی این حالت یه ساختار مثل آرایه دارید که هر اندیس اون یک object قبول میکنه و لذا type safety نداره (چون هر چیزی رو میشه توش add کرد) و اگه بخواین بهتر کار کنید generic بهتره (مثل List<int> d...)

sinpin
شنبه 30 دی 1385, 13:06 عصر
که مثلا وقتی بگیم pl این کارو بکن همه اونها اون کارو بکنن

چیزی که شما گفتید در واقع استفاده از یک method مشترک بود و بهمین خاطر من polymorphism رو پیشنهاد دادم. ولی فکر کنم منظورتون چیز دیگری بود. :چشمک:

Amir Oveisi
یک شنبه 01 بهمن 1385, 00:07 صبح
میشه از List یا LinkedList استفاده کرد ولی باز نیاز به یه متد دارین

benyamin_pc
یک شنبه 08 بهمن 1385, 02:25 صبح
میشه یه تیکه کد بذارین که مثلا سه تا متغییر با نامهای a1,a2,a3 داشته باشیم و اسم همشون b باشه؟
وقتی بگیم مثلا b.backcolor=color.gold; رنگ همشون عوض شه و وقتی می گیم a1.backcolor=color.gold فقط رنگ a1 عوض شه

سار
یک شنبه 08 بهمن 1385, 13:05 عصر
سلام
اگه چند تا متغییر با نام های مختلف داشته باشیم چطوری میشه مثلا pl را به همه آنها نسبت داد;که مثلا وقتی بگیم pl این کارو بکن همه اونها اون کارو بکنن

یک کلاس پایه از نوع PL بسازید و بعد یک لیست از PL تولید کنید که با ایندکس به هر کدام میتوانید دسترسی داشته باشید. یه متد هم بنویس برای کلاست که کار انتصاب رو انجام بده.

Behrooz_CS
یک شنبه 08 بهمن 1385, 17:25 عصر
عزیز جان می دونم با جوابهای دوستان گیج شدی!

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



public Color B
{
set{
a1.Color = a2.Color = a3.Color = value;
}
}

benyamin_pc
یک شنبه 08 بهمن 1385, 22:34 عصر
الان وقتی بگیم b.Left+=10 دکمه های a1,a2,a3 10 واحد می رن جلو؟

benyamin_pc
یک شنبه 08 بهمن 1385, 22:37 عصر
آقا یه بار دیگه دقیق توضیح بدم
به تعداد نا مشخص دکمه داریم a1,a2,a3,.......
می خواهیم کل اونا هم یه اسم داشته باشن
مثلا B

sinpin
سه شنبه 10 بهمن 1385, 00:27 صبح
collection ها نوع داده ای که قبول میکنن object است (اگه generic استفاده نکنید البته) این یعنی شما میتونید هر چیزی رو توش بندازید (که این همون پلیمورفیسمه !). مثلا 10 تا دکمه رو میندازید توی یک لیست بعد با یه حلفه میتونید ضمن استخراج با خواص مشترکشون کار کنید.

sinpin
سه شنبه 10 بهمن 1385, 00:38 صبح
Introduction

Arrays provide convenient ways to work with groups of controls that share common functionality. Groups of controls might be used to display related data, or provide related behavior when clicked, for example. Although Visual Basic® .NET and Visual C#® have no inherent support for creating control arrays, you can duplicate all of the functionality of control arrays programmatically. This article will walk you through the creation of a simple component that duplicates control array functionality.

Some of the more useful aspects of control arrays include the following:


Accessing a set of controls with the same name by index, allowing you to retrieve and set properties by number and iterate through all the controls in an array. This would typically be done using the following syntax: ' Visual Basic pseudo-codeMyControl(myIndex).MyProperty = myValueMyControl(myIndex + 1).MyMethod// C# pseudo-codemyControl[myIndex].MyProperty = myValue;myControl[myIndex + 1].MyMethod

Handling events for multiple controls with a single event handler, and retrieving and using the index in those events, as shown in this example: ' Visual Basic pseudo-codePrivate Sub MyControl_Click(sender as Object, e as EventArgs) Messagebox.Show("You have clicked MyControl number " & _ MyControl.Index)End Sub// C# pseudo-codeprivate void myControl_Click(System.Object sender, System.EventArgs e) { Messagebox.Show("You have clicked MyControl number " + myControl.Index); }

Dynamically adding or removing controls at run time, as shown here: ' Visual Basic pseudo-codeDim i as IntegerFor i = 1 to 5 ' Insert code to create controls and assign values to properties.Next i// C# pseudo-codefor (int i = 1; i < 6; i++){ // Insert code to create controls and assign values to properties. }

Visual Basic .NET and C# allow you to duplicate some of the functionality commonly associated with control arrays. For example, you can use delegates to bind events from multiple controls to a single event handler. However, it might be more convenient to incorporate that functionality into a single dynamic, easy-to-manage component. In this article you will create a component that uses the following:


A collection to index and sort your controls. A collection of buttons will be used for demonstration purposes.

An event handler to handle the click event from your derived button.

Code to allow referencing the control and its members by index.

Code to dynamically add and remove controls from your form.

Prerequisites


You should be familiar with components and how they work. For more information on component see Programming with Components (http://msdn.microsoft.com/library/en-us/vbcon/html/vbconComponentCreation.asp)

You should have some understanding of polymorphism. For more information, see Polymorphism in Components (http://msdn.microsoft.com/library/en-us/vbcon/html/vbconImplementingInterfacesInComponents.asp).

You should have an understanding of Visual Basic .NET or C# .NET syntax.

Creating the Project

In this section, you will create and name your project and add a class to your project. This class will encapsulate the code to implement the control array.

To create the ButtonArrayProject and the ButtonArray component


On the File menu, point to New and then select Project to open the New Project dialog box.

Select the Windows Application project template from the list of Visual Basic or Visual C# projects, and type ButtonArrayProject in the Name box.

From the File menu, choose Save All to save your project.

Implementing a Collection

Your ButtonArray class will handle the tasks of holding and organizing your control array through the implementation of a collection. A collection is an object that contains a list of indexed object variables, as well as methods to add, remove, and otherwise manipulate objects in the collection. In this section, you will create a class that inherits from System.Collections.CollectionBase, a class in the .NET Framework that provides much of the functionality required for collections, and implement methods that will provide the required functionality.

To create your inherited class


From the Project Menu, choose Add Class.

Name your class ButtonArray.vb or ButtonArray.cs, as appropriate. The Code Editor for your class opens.

In the class declaration, specify that this class inherits from the .NET Framework System.Collections.CollectionBase class. ' Visual BasicPublic Class ButtonArray Inherits System.Collections.CollectionBaseEnd Class// C#public class ButtonArray : System.Collections.CollectionBase{ // Code added by designer omitted.}

The System.Collections.CollectionBase class provides much of the required functionality for your collection. This includes a List object that keeps track of the objects contained by your collection, the Count property, which maintains a total of the objects currently in the collection, and the RemoveAt method, which allows you to remove the object at a particular index. You will make use of each of these when implementing your control-array collection.
Because each control array component will be associated with a single form, you will need to add a field to hold a reference to that form. By creating a private, read-only field to hold that reference, you ensure that each control-array component will be associated with only one form.

To add a private, read-only field to your component.


Add the following line immediately inside the class declaration: ' Visual BasicPrivate ReadOnly HostForm as System.Windows.Forms.Form// C#private readonly System.Windows.Forms.Form HostForm;

The first method you will have to implement in your collection is AddNewButton. This method will create a new button control and add it to the desired form. You will also use this method to set the initial properties for your new button.

To implement the AddNewButton method


In the Code Editor for your ButtonArray class, type the following code: Public Function AddNewButton() As System.Windows.Forms.Button ' Create a new instance of the Button class. Dim aButton As New System.Windows.Forms.Button() ' Add the button to the collection's internal list. Me.List.Add(aButton) ' Add the button to the controls collection of the form ' referenced by the HostForm field. HostForm.Controls.Add(aButton) ' Set intial properties for the button object. aButton.Top = Count * 25 aButton.Left = 100 aButton.Tag = Me.Count aButton.Text = "Button " & Me.Count.ToString Return aButtonEnd Function// C# public System.Windows.Forms.Button AddNewButton(){ // Create a new instance of the Button class. System.Windows.Forms.Button aButton = new System.Windows.Forms.Button(); // Add the button to the collection's internal list. this.List.Add(aButton); // Add the button to the controls collection of the form // referenced by the HostForm field. HostForm.Controls.Add(aButton); // Set intial properties for the button object. aButton.Top = Count * 25; aButton.Left = 100; aButton.Tag = this.Count; aButton.Text = "Button " + this.Count.ToString(); return aButton;}

This method:


Creates a new button.

Adds it to the internal list and to the controls collection of the form referenced by HostForm.

Sets initial properties, including setting the Tag property to the index of the button. You would add code in this section to set additional properties for your control.

Returns the new button so that it can be immediately modified or assigned to an additional object reference.

You must also create a constructor (the method that is run when your component is instantiated) that sets the value of the HostForm field and automatically adds a new button to your form whenever a new instance of your control array class was created. You would accomplish this in the following manner.

To create the constructor


Create a constructor for your class. ' Visual BasicPublic Sub New(ByVal host as System.Windows.Forms.Form) HostForm = host Me.AddNewButton()End Sub// C# // Replace the default constructor with this one.public ButtonArray(System.Windows.Forms.Form host){ HostForm = host; this.AddNewButton();}The constructor requires a parameter, the form on which your button array is to be placed. It assigns the value supplied to the HostForm field, and then invokes the AddNewButton method of the class to add a new button to the form.

Exposing the Array of Controls

Now that you have created a way to create and track the controls in your array, you need to be able to expose them to other developers. You can do this with a property. You will create a default property (Visual Basic) or indexer (C#) that returns a reference to a particular button, based on its index. This will also allow you to programmatically use the MyButtonArray(myIndex) syntax that is typical of control arrays.

To create the default property


Add the following code to your component. ' Visual BasicDefault Public ReadOnly Property Item(ByVal Index As Integer) As _ System.Windows.Forms.Button Get Return CType(Me.List.Item(Index), System.Windows.Forms.Button) End GetEnd Property// C#public System.Windows.Forms.Button this [int Index]{get { return (System.Windows.Forms.Button) this.List[Index]; }}

Implementing a Remove Method

Now that you have created a property for exposing the buttons in your array, you can implement a mechanism for removing buttons from the array. To remove a button from the array, you must remove it from the collection's internal List object and from the form's Controls collection.

To implement the Remove method


Add the following method to your component. ' Visual BasicPublic Sub Remove() ' Check to be sure there is a button to remove. If Me.Count > 0 Then ' Remove the last button added to the array from the host form ' controls collection. Note the use of the default property in ' accessing the array. HostForm.Controls.Remove(Me(Me.Count -1)) Me.List.RemoveAt(Me.Count -1) End IfEnd Sub// C#public void Remove(){ // Check to be sure there is a button to remove. if (this.Count > 0) { // Remove the last button added to the array from the host form // controls collection. Note the use of the indexer in accessing // the array. HostForm.Controls.Remove(this[this.Count -1]); this.List.RemoveAt(this.Count -1); }}

Creating a Common Event Handler

The last step is to create event handlers to handle the common events for your array. In this demonstration, you will create a method to handle the click event of your button, and then add code to associate the event with the event handler.

To create a common event handler


Add the following method to your component. ' Visual BasicPublic Sub ClickHandler(ByVal sender As Object, ByVal e As _ System.EventArgs) MessageBox.Show("you have clicked button " & CType(CType(sender, _ System.Windows.Forms.Button).Tag, String))End Sub// C#public void ClickHandler(Object sender, System.EventArgs e){ System.Windows.Forms.MessageBox.Show("You have clicked button " + ((System.Windows.Forms.Button) sender).Tag.ToString());}This method displays a message box indicating what button was clicked by retrieving the index stored in the Tag property of the button. Note that the signature of this method is the same as that of the event it will be handling, as is required for event handlers.

You also need to associate the event with the event handler.

To associate the event with the event handler


Add the following code to your AddNewButton method. ' Visual BasicAddHandler aButton.Click, AddressOf ClickHandler// C#aButton.Click += new System.EventHandler(ClickHandler);

Testing Your Project

Now that your component is complete, you need to create an application that tests the functionality of your component.

To create the test application


In Solution Explorer, right-click Form1 and select View Designer from the shortcut menu. The designer for Form1 opens.

From the Toolbox, add two buttons to the form.

Relocate these buttons to the right side of the form.

Set the properties of these buttons as follows. ButtonNameTextButton1btnAddAdd ButtonButton2btnRemoveRemove Button

In Solution Explorer, right-click Form1 and select View Code from the shortcut menu. The Code Editor for Form1 opens.

Within the class declaration for Form1, declare the control-array object. ' Visual Basic' Declare a new ButtonArray object.Dim MyControlArray as ButtonArray// C#// Declare a new ButtonArray object.ButtonArray MyControlArray;

In the constructor of the form, just before the end of the method, add the following code: ' Visual BasicMyControlArray = New ButtonArray(Me)// C#MyControlArray = new ButtonArray(this);
This statement creates a new ButtonArray object. The parameter (Me or this) refers to the form that is creating the new ButtonArray, and will be the form that the array of buttons will be placed upon.


Note: In Visual Basic .NET, the constructor is found in the code region labeled "Windows Form Designer generated code". You might need to expand this region to view the constructor.


In Solution Explorer, right-click Form1 and select View Designer from the shortcut menu.

In the designer, double-click btnAdd to open the Code Editor at the btnAdd_Click event.

In the btnAdd_Click method, add code to call the AddNewButton method of MyControlArray: ' Visual Basic' Call the AddNewButton method of MyControlArray.MyControlArray.AddNewButton()' Change the BackColor property of the Button 0. MyControlArray(0).BackColor = System.Drawing.Color.Red// C#// Call the AddNewButton method of MyControlArray.MyControlArray.AddNewButton();// Change the BackColor property of the Button 0.MyControlArray[0].BackColor = System.Drawing.Color.Red;

In Solution Explorer, right-click Form1 and select View Designer from the shortcut menu.

In the designer, double-click btnRemove to open the Code Editor at the btnRemove_Click event.

In the btnRemove_Click method, add the following code: ' Visual Basic' Call the Remove method of MyControlArray.MyControlArray.Remove()// C#// Call the Remove method of MyControlArray.MyControlArray.Remove();

Save your project.

To test your project


From the Debug menu, choose Start. Form1 opens with three buttons on it, labeled Add Button, Remove Button, and Button 1.

Click Button 1. Note that a message box is displayed, and that this message box correctly displays the index.

Click the Add Button button a few times.
With each click, a new button is added to the form. Clicking each of these new buttons results a message box that correctly reports the index of the button. Note also that the color of Button 0 has changed to red, resulting from this line in the btnAdd_Click event: MyControlArray(0).BackColor = System.Drawing.Color.Red

Click the Remove Button button several times. With each click, a button is removed from the form.

Click this button until all the buttons on the left-hand side of the form are removed.

Click the Add Button button again. Buttons are again added to the form and are numbered with the correct index.

Conclusion

This article has demonstrated how to create a component that encapsulates the functionality of a control array. You have seen how to create methods to dynamically add and remove controls from a form, and to expose an object through a default property or indexer. Because you implement all of the functionality, you can extend your control array by writing custom code for your component.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchCreatingControlArraysInVisualBasicNETVisualCN ET.asp?_r=1

benyamin_pc
سه شنبه 10 بهمن 1385, 01:55 صبح
collection ها نوع داده ای که قبول میکنن object است (اگه generic استفاده نکنید البته) این یعنی شما میتونید هر چیزی رو توش بندازید (که این همون پلیمورفیسمه !). مثلا 10 تا دکمه رو میندازید توی یک لیست بعد با یه حلفه میتونید ضمن استخراج با خواص مشترکشون کار کنید.


من می خوام به سوی بی نهایت تا دکمه داشته باشم!!

اَرژنگ
سه شنبه 10 بهمن 1385, 02:47 صبح
من می خوام به سوی بی نهایت تا دکمه داشته باشم!!
در ریاضی شاید بتوانید ولی در برنامه نویسی یک چیزی هست به اسمه حافظه.
خلاصه اینکه اگر بخواهید n تا دگمه داشته باشید را با ستفاده از یک دگمه کلکشن منجر خودتان و یا آرایه میتونید همانطوری که پیشنهاد کردند میشه.
برایه شروع کار از ۳ تا دگمه عروع کنید، هر وقت کارتان راه افتاد ۳ را به طرف بی نهایت سوق بدید.

benyamin_pc
سه شنبه 10 بهمن 1385, 03:26 صبح
اما اینو می دونم
ولی می خوام در هر لحظه به کل اشیا دسترسی داشته باشم ابن کار زمان میبره و کاری که می خوام انجام بدم دچار خطا میشه

اَرژنگ
سه شنبه 10 بهمن 1385, 03:57 صبح
اما اینو می دونم
ولی می خوام در هر لحظه به کل اشیا دسترسی داشته باشم ابن کار زمان میبره و کاری که می خوام انجام بدم دچار خطا میشه
میبخشید، از چه لحاز زمان میبره؟ برایه پیمودن حلقه و یا چیزه دیگری منظورتان است؟
چه خطایی؟ هر چی بیشتر اطاعات بفرستید زودتر جواب میگیرید.

benyamin_pc
چهارشنبه 11 بهمن 1385, 02:05 صبح
یعنی هیچ راهی نیست مجموعه ای بی حد از مثلا دکمه ها هم زمان صدا زده شوند؟

اَرژنگ
چهارشنبه 11 بهمن 1385, 04:15 صبح
یعنی هیچ راهی نیست مجموعه ای بی حد از مثلا دکمه ها هم زمان صدا زده شوند؟
بدونه پیمودن یک حلقه که ممکن نیست. تا جایی که من میدونم حتماً باید یک لیست وجود داشته باشه که با استفاده از حلقه که متد هرکدام از اشیاء صدا زده بشند.

omid_Ahmadi
چهارشنبه 11 بهمن 1385, 13:48 عصر
یعنی هیچ راهی نیست مجموعه ای بی حد از مثلا دکمه ها هم زمان صدا زده شوند؟


راهی که عنوان شده تنها راه موجوده، بهتره دقت داشته باشی که اجرای همزمان دو کد امکان نداره، راه شبیه سازی این کار هم ماتی ترد هست که به مشکل مطرح شده ربطی نداره

Behrooz_CS
چهارشنبه 11 بهمن 1385, 18:23 عصر
اما اینو می دونم
ولی می خوام در هر لحظه به کل اشیا دسترسی داشته باشم ابن کار زمان میبره و کاری که می خوام انجام بدم دچار خطا میشه

اصلاً شما چه کاری می خواهید انجام بدید ؟ :متفکر:

benyamin_pc
پنج شنبه 12 بهمن 1385, 03:09 صبح
مثلا فرض کن یه توپ داریم با یه جدول 200*300 پر از دکمه
اون توپ(دکمه) با سرعت زیاد داره روی این جدول به طور نا منظم قل می خوره می خواهیم وقتی که توپ روی هر دکمه(کلا وقتی توپ رو دکمهای بود حالا هر دکمه ای) رفت یه عدد زیاد شه اگه بیایم با یه For تو یه آرایه ای از دکمه ها بچرخیم یعنی در هر لحظه می تونیم چک کنیم توپ روی اون دکمه هست یا نه حالا توپ داره سریع حرکت می کنه اگه اون موقعی که توپ رو دکمه 1*1 هست For داره دکمه 150*200 رو چک میکنه یعنی توپ روی هیچ دکمه ای نیست!
و در نظر داشته باشین که اگه این دکمه ها به سوی بی نهایت زیاد شن چقدر سرعت For میاد پایین تر
مثل این میمونه که
For(int i=0;i<20000;i++){ye code sabok}
باعث ایجاد وقفه میشه

اَرژنگ
پنج شنبه 12 بهمن 1385, 07:03 صبح
مثلا فرض کن یه توپ داریم با یه جدول 200*300 پر از دکمه
اون توپ(دکمه) با سرعت زیاد داره روی این جدول به طور نا منظم قل می خوره می خواهیم وقتی که توپ روی هر دکمه(کلا وقتی توپ رو دکمهای بود حالا هر دکمه ای) رفت یه عدد زیاد شه اگه بیایم با یه For تو یه آرایه ای از دکمه ها بچرخیم یعنی در هر لحظه می تونیم چک کنیم توپ روی اون دکمه هست یا نه حالا توپ داره سریع حرکت می کنه اگه اون موقعی که توپ رو دکمه 1*1 هست For داره دکمه 150*200 رو چک میکنه یعنی توپ روی هیچ دکمه ای نیست!
و در نظر داشته باشین که اگه این دکمه ها به سوی بی نهایت زیاد شن چقدر سرعت For میاد پایین تر
مثل این میمونه که
For(int i=0;i<20000;i++){ye code sabok}باعث ایجاد وقفه میشه
شما دارید در ورشهایه طراحی بازی پیش میریرد، اصلاً‌ نوع برنامه ریزی که باید انجام بدید با این روش فرق دارد. در Game Programming به موضوعات مربوط به Collision Detection باید نگاه بندازید. الگریتمها و data structure هایی که لازم دارید را در آنجا پیدا میکنید.
روشهای Application Development در Geme Development بکاری نمیایید (شاید هم بیاد ولی نه زیاد ، تا جایی که من میدونم ، ولی من Game Development نمیدونم)
شاید Computer Simulation هم بکارتان بیاد (ولی باید از دلفی و یا سی ++ استفاده کنید. کسی میدونه که بازی‌ای‌ را با دات نت پیاده کردن ممکن است؟)

ninja_pro
جمعه 13 بهمن 1385, 04:56 صبح
در هر صورت یه الگوریتم می خواد با کد سی شارپم باید بشه (یعنی برنامه به این سادگیو نمیشه با سی شارپ نوشت؟)

benyamin_pc
جمعه 13 بهمن 1385, 05:48 صبح
اگه میدونین لطفا راهنمایی کنین ممنون میشم
اگه کدشو بذارین خیلی شرمنده کردین من خیلی درگیر اینم

اَرژنگ
جمعه 13 بهمن 1385, 10:06 صبح
در هر صورت یه الگوریتم می خواد با کد سی شارپم باید بشه (یعنی برنامه به این سادگیو نمیشه با سی شارپ نوشت؟)
برنامه به این سادگی!!!!:گیج:
آققا شما شوخی میکنید، اگر ساده است اگلریتم‌اش را اراعه بدید کد کردنش کاری نداره.
مشکل به زبان برنامه ْویسی ربطی نداره، یکی از اصلی ترین مشکلات در Game Programming
هستش.
به روشهایه Collision Detection اصلاً‌ نگاه انداختید که میگید ساد‌ه‌است؟ جایی مثال اینکار را پیدا کنید شاید بتونیم چیزی پیشنهاد کنیم.

benyamin_pc
جمعه 13 بهمن 1385, 13:12 عصر
آقا هر کی میدونه لطفا یه چیزیم به ما بگه
آقای ارژنگ شما هم اگه میدونین لطفا بگین