به نقل از webmaster :
گفتگوي 2 نفره شده
1- گفتگوي دو نفره به چه معنيه؟ فقط خواستي بگي تو هم هستي؟ اگه ميتوني جواب بده!!!!! اونوقت منم نميام همه جا خودمو قاطي كنم.
2 - جواب شما دوست عزیز.
خصیصه یا همون Property یه جور جفت از توابع هست. به اینصورت که یه تابع اونو میگیره و یه تابع اونو برمیگردونه. به عبارتی اگه یه خصیصه بخوایم بایستی دو تا تابع تعریف کنیم. اولی رو بهش میگن Get (تو هر زبونی یه جوره اما کلیت قضیه یکیه.) این تابع وقتی فراخوانی میشه که ما از خصیصه در سمت راست تساوی استفاده کنیم (یعنی به نحوی مقدار اونو بگیریم ) مثل این مورد :
در این حالت تابع Get فراخوانی شده و مقدار Caption را میگیرد و بازمیگرداند و این مقدار در متغیر (در اینجا tmp ) قرار میگیرد.
تابع دوم تابع Set یا Let هست. البته جفتش یکی هست فقط تو وی بی تفاوت دارند اولی Set واسه اشیا استفاده میشه (اگه خصیصه شما از جنس مثلا Variant یا Picture باشه) اما دومی در مورد متغیر های نوعی ساده (مثل integer) البته هر دو به جای هم استفاده میشوند !! وی بی زیاد سختگیر نیست!
حالا یه مثال . میخوام یه خصیصه به فرم اضافه کنم به اسم OnTop که Boolean هست این کدو تو فرم برارید :
کد:
Option Explicit
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
' SetWindowPos() hwndInsertAfter values
Private Const HWND_TOP = 0 'Send To Front
Private Const HWND_BOTTOM = 1 'Send To Back
Private Const HWND_TOPMOST = -1 'Always On Top
Private Const HWND_NOTOPMOST = -2 'Normal
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering
Private mOnTop As Boolean
Public Property Get OnTop() As Boolean
OnTop = mOnTop
End Property
Public Property Let OnTop(ByVal vNewValue As Boolean)
mOnTop = vNewValue
Dim Temp As Long
Temp = IIf(mOnTop, HWND_TOPMOST, HWND_NOTOPMOST)
SetWindowPos hwnd, Temp, Left / Screen.TwipsPerPixelY, Top / Screen.TwipsPerPixelX, Width / Screen.TwipsPerPixelX, Height / Screen.TwipsPerPixelY, SWP_NOACTIVATE Or SWP_SHOWWINDOW
End Property
البته اینکه اینقدر شلوغ شد به خاطر اینه که تابع Api هم هست (شاید بهتر بود یه مثال ساده تر میزدم؟؟)
اما به هر حال اینجا یه متغییر هست به اسم mOnTop و دو تا تابع یکی Get و یکی Let . باقیش ربطی به تعریف Property نداره.
تابع Public Property Get OnTop() وقتی فراخوانی میشه که مثلا بنویسیم :
یعنی استفاده در طرف راست تساوی
در این تابع بایست مقدار این خصیصه برگردانده شود. ما مقدار این حالت (یعنی OnTop بودن یا نبودن فرم را در متغیر خصوصی mOnTop گذاشتیم و فقط کافیست آن را برگردانیم
تابع Public Property Let OnTop(ByVal vNewValue As Boolean) هم وقتی فراخوانی میشه که بنویسیم :
یعنی استفاده در طرف چپ تساوی.
برای همینم دومی یه آرگومان هم میگیره. خیلی سادست آرگومان میگه که مقدار خصیصه میخواد با چی تنظیم شه. اگه True باشه فرمو OnTop میکنیم و بعد هم mOnTop رو True میکنیم (این برای اینه که بعدا تو تابع Get ازش استفاده میشه) حالا اگه False باشه فرمو از حالت OnTop در میاریم و mOnTop رو False میکنیم. دقت کنید این mOnTop اصلا نباید در خارج از این دو تابع دستکاری شود و اصولا کاربر اکتیو ایکس یا کلاس نباید به آن دسترسی پیدا کند (گر چه در این مثال من یک خصیصه به فرم اضافه کردم اما خصیصه ها معمولا در مورد اکتیو ایکس ها کاربرد دارند) این متغیر mOnTop فقط یک متغیر کمکی برای نگه داشتن مقدار خصیصه است. و شما میتونید به هر صورتی که میخواید اونو نگه دارید. اینم بگم توی خود اکتیو ایکس شما مجازید از این کپی محلی استفاده کنید ولی در خارج نه.
اگه میخواید یه خصیصه فقط خواندنی باشه کافیه متد Set یا Let رو ننویسید. خصیصه فقط نوشتنی هم (یه کم غیر منطقیه اما به هر حال ) تابع Get رو ننویسید.
حالا یه اکتیو ایکس ایجاد کنید و یه Label توش بذارید و این کدو توش بنویسید :
کد:
Public Property Get Sample() As String
Sample = Label1.Caption
End Property
Public Property Let Sample(ByVal vNewValue As String)
Label1.Caption = vNewValue
End Property
یه خصیصه واسه این اکتیو ایکس تعریف میشه که اسمش Sample هست و جنسش هم String . دیگه نیازی به یه متغیر محلی واسه نگه داشتن این خصیصه نیست چون اونو تو Caption اون Label نگه داشتیم.
این همون کاریه که تو سوالتون میخواستید انجام بدید. کافیه بنویسید : (اینو با Front Page درست کردم و شما هم باید GUID کنترل خودتونو اینجا بذارید که مطمئنا با این که من نوشتم متفاوته چون الگوریتم ایجاد GUID یه جوریه که اگه کارت شبکه داشته باشی دیگه هیچ وقت رو هیچ ماشین دیگه ای ایجاد نمیشه ولی اگه نداری رو ماشین خودت دیگه تکرار نمیشه تابع ایجاد یه GUID هم coCreateGUID هست که باید بعد از CoInitializeEX فراخوانی بشه -این اصلا ربطی به بحث نداشت همینجوری گفتم محض خنده!-)
کد:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
<SCRIPT LANGUAGE="VBSCRIPT">
sub window_onload()
UserControl11.Sample="Test"
end sub
</SCRIPT>
</head>
<body>
<p>
<object classid="clsid:0EAAD486-467B-4798-BC46-01A2160DC2B6" id="UserControl11">
<param name="_ExtentX" value="8467">
<param name="Sample" value="Alpha">
<param name="_ExtentY" value="6350">
</object>
</p>
</body>
</html>
میبینید که میشه این خصیصه رو تو تگ Object به تگ داخلی Param مقدار اولیه داد (البته تو این مثال تو Window_OnLoad اونو تغییر دادید دیگه حالت اولیه دیده نمیشه ) مشکل حله ؟؟؟؟
راستی :
تو منوی Tools یه گزینه Add Procedure هست. از اونجا میتونید یک Property به ماژول خودتون اضافه کنید. خودش دو تا تابع Let و get رو میسازه. شما فقط باید اونا رو تکمیل کنید.
موفق باشید