ايران ويج

نسخه‌ی کامل: حذف شئ در زمان اجرا
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام

برای حذف یه شئ در زمان اجرا چی کار باید کرد؟

اگرم بخوام یه USER CONTROL ایجاد کنم که براش EVENT تعیین کنم ( رویداد حذف

- CLS یا DELETE) که بتونم اون یوز کنترل رو حذف کنم ( مثلا با راست کلیک از منو

میان بر یوزر کنترل -گزینه DELETE )

من تو ساخت یوزر کنترل زیاد وارد نیستم.

اگرم دارم اشتباه میرم بهم بگین. Shy
با سلام
كنترلي كه هنگام طراحي رسم شده (بوجود آمده) را نمي توان هنگام اجرا حذف كرد
ولي ميتوان همان كنترل را موقع اجرا بوجود آورد و در همان زمان هم حذف كرد با دستور
Controls.Add
Controls.Remove
اينهم يك مثال :
کد:
Dim WithEvents ComSavBmp As VB.CommandButton
Dim i As Integer
Private Sub Command1_Click()
On Error Resume Next
i = i + 1
  Set ComSavBmp = Controls.Add("VB.CommandButton", "ComSavBmp" & i, Me)
    With ComSavBmp
        .Move 950, 1365 + (i * 330), 3060, 330
        .Caption = "IranVig ..."
        .Enabled = True
        .Visible = True
    End With
End Sub
Private Sub Command2_Click()
Controls.Remove "ComSavBmp" & i
i = i - 1
End Sub
Private Sub ComSavBmp_KeyPress(KeyAscii As Integer)
Dim tr As String
tr = "1234567890" & Chr(8)
If InStr(tr, Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub Form_Load()
i = 0
End Sub
hamed_Arfaee نوشته است:با سلام
كنترلي كه هنگام طراحي رسم شده (بوجود آمده) را نمي توان هنگام اجرا حذف كرد
ولي ميتوان همان كنترل را موقع اجرا بوجود آورد و در همان زمان هم حذف كرد با دستور
Controls.Add
Controls.Remove
اينهم يك مثال :
کد:
Dim WithEvents ComSavBmp As VB.[b]CommandButton[/b]
Dim i As Integer
Private Sub Command1_Click()
On Error Resume Next
i = i + 1
  Set ComSavBmp = Controls.Add("VB.[b]CommandButton[/b]", "ComSavBmp" & i, Me)
    With ComSavBmp
        [b].Move 950, 1365 + (i * 330), 3060, 330[/b]
        [b].Caption = "IranVig ..."[/b]
        [b].Enabled = True[/b]
        [b].Visible = True[/b]
    End With
End Sub
Private Sub Command2_Click()
Controls.Remove "ComSavBmp" & i
i = i - 1
End Sub
Private Sub ComSavBmp_KeyPress(KeyAscii As Integer)
Dim tr As String
tr = "1234567890" & Chr(8)
If InStr(tr, Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub Form_Load()
i = 0
End Sub

سلام
به جای Command Button بالا من از USERCONTROL استفاده کردم .

ولی مقدار ComSavBmp ---> Nothing هست ، چرا ؟

در ضمن در قسمت خصوصیت دکمه - خصوصیات یوزر کنترل رو نوشتم .
خیلی ممنون حامد خان. معنی WithEvents رو یاد گرفتم.
کد:
Set ComSavBmp = Controls.Add("VB.CommandButton", "ComSavBmp" & i, Me)
اینجوری که رویدادهای تعریف شده برای متغیر ComSavBmp فقط واسه آخرین دکمه ی ایجاد شده کار می کنن.
نمیشه متغیر ComSavBmp رو از نوع آرایه ای تعریف کرد یا آرایه ای از ComSavBmp درست کرد؟
نقل قول: به جای Command Button بالا من از USERCONTROL استفاده کردم .

ولی مقدار ComSavBmp ---> Nothing هست ، چرا ؟
چون یوزر کنترل شما جزئی از VB نیست بلکه جزئی از پروژه شماست.
چیکار کنیم آقا حامد؟ با اینکه تغییرات زیر رو دادم اما...
کد:
Dim WithEvents ComSavBmp As Project1.UserControl1
کد:
Set ComSavBmp = Controls.Add("Project1.UserControl1", "ComSavBmp" & i, Me)
اما این هم جواب نداد. مقدارش Nothing بود.
mojtabamalaekeh نوشته است:خیلی ممنون حامد خان. معنی WithEvents رو یاد گرفتم.
کد:
Set ComSavBmp = Controls.Add("VB.CommandButton", "ComSavBmp" & i, Me)
اینجوری که رویدادهای تعریف شده برای متغیر ComSavBmp فقط واسه آخرین دکمه ی ایجاد شده کار می کنن.
نمیشه متغیر ComSavBmp رو از نوع آرایه ای تعریف کرد یا آرایه ای از ComSavBmp درست کرد؟
بله قسمت ايونتها رو من اشتباهي كپي كردم
در اين حالت نميشه بصورت ارايه اي درست كرد اشيا رو ( يعني من نتونستم) ولي راهي هست كه اشيا بصورت آرايه اي باشن و بشه يك ايونت عمومي براشون تعريف كرد اونم اخر سر براش مثال ميزنم .

mojtabamalaekeh نوشته است:
نقل قول: به جای Command Button بالا من از USERCONTROL استفاده کردم .

ولی مقدار ComSavBmp ---> Nothing هست ، چرا ؟
چون یوزر کنترل شما جزئی از VB نیست بلکه جزئی از پروژه شماست.
چیکار کنیم آقا حامد؟ با اینکه تغییرات زیر رو دادم اما...
کد:
Dim WithEvents ComSavBmp As Project1.UserControl1
کد:
Set ComSavBmp = Controls.Add("Project1.UserControl1", "ComSavBmp" & i, Me)
اما این هم جواب نداد. مقدارش Nothing بود.

من خودم هم نفهميدم قضيه چيه يكم باهاش ور رفتم و اينا رو فهميدم
براي زادن يك كنترل از نوع يك يوزر كنترل بايد يك كارايي كرد !!!
در خصوصيات پروجكت Project Propertis و تو تب Make بايد گزينه Remove information about unused ActiveX controls رو بردارين
ولي بازم مشكلي هستم اونم اين كه نميشه به خصوصيات ذاتي كنترل در اين هنگام تولد دست پيدا كرد .
مثلا خصوصيت نمايش (Visible) بصورت ذاتي براي يوزر كنترل تعريف شده و براي كنترلهايي قابل دسترس است كه هنگام طراحي بوجود آمدند نه اجرا !!!
بصورت خلاصه تر خصوصيت visible براي يوزر كنترل تا زماني كه رسم نشده قابل دسترس نيست و اين نوع زادن در هنگام اجرا متفاوت است با حالت عادي .
پس الان نميشه يوزر كنترل بوجود اومده رو ديد !!! ولي بوجود مياد .!!!

پس ميشه بصورت ديگه ازش استفاده كرد
اول كنترل رو بوجود مياريم بعد از طريق اسمي كه بهش داديم باهاش كار ميكنيم و نشونش مي ديم ::
(( يه جور كلك رشتي ))
کد:
Dim i As Integer
Private Sub Command1_Click()
i = i + 1
   Controls.Add "Project1.UserControl1", "User" & i, Me
    With Me.Controls("User" & i)
        .Move 950, 1365 + (i * 330), 3060, 330
        .Caption = "IranVig ..."
        .Visible = True
    End With
End Sub
تو اين حالت اشيا بوجود ميان ولي بازهم نميشه بصورت آرايه اي باشن ولي تو مثال زير ميتونين بصورت آرايه اي استفاده كنين :
تو اين حالت بايد قبلا از كنترل يك نمومه بصورت انديس گذاري شده روي فرم موجود باشه مثلا بايد command1(0) موجود باشه تا بتونيم بقيه رو ازش كپي بگيريم ::

کد:
Private Sub CmdCopy_Click()
i = i + 1
Load Command(Command.Count)
Command(Command.UBound).Move 950, 1365 + (i * 330), 3060, 330
Command(Command.UBound).Visible = True
End Sub


نكته ::
1) اگه اشيا رو بصورت ارايه اي بوجود نياريم ميشه براشون ايونت هم تعريف كرد .
2) اگه نياز به توليد چندين شي هست (بصورت ارايه اي)و بايد به ايونتهاي اشيا دسترسي داشت بهتره كه از روش دوم استفاده بشه .
راه حل همه این مشکلات: VB.NET
يك مثال جالب تو MSDN پيدا كردم
نوع كنترل ها رو از VBcontrolExtender تعريف ميكنن ::
کد:
Dim WithEvents ComSavBmp As VBControlExtender
Dim i As Integer
Private Sub Command1_Click()
On Error Resume Next
i = i + 1
  Set ComSavBmp = Controls.Add("Priject1.UserControl1", "ComSavBmp" & i, Me)
    With ComSavBmp
        .Move 950, 1365 + (i * 330), 3060, 330
        .Caption = "IranVig ..."
        .Enabled = True
        .Visible = True
    End With
End Sub
البته بازهم تغييراتي كه قبلا گفتم بايد تو پروژه انجام بشه
http://support.microsoft.com/kb/190670