• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

استفاده از ActiveX هاي وي بي در صفحه هاي HTML

emad86_20011

Registered User
تاریخ عضویت
4 فوریه 2004
نوشته‌ها
185
لایک‌ها
2
سن
37
محل سکونت
Mashhad, Iran
من نمي دونم اين سوال جاش اينجاي يا نه ولي مي گم
1. وقتي اكتيو ايكس رو با وي بي ساختيم بايد چه جوري اپلودش كنيم؟ يعني منظورم اينه كه بايد فايلاشو تك تك بفرستيم يا اول همه رو به صورت cab در بياريم بعد بفرستيم؟
در ضمن براي استفادش همون ادرس فايل cab + كلاس اي ديش بسه؟

2. سوال دومم اينه كه يه تابع توي وي بي تعريف كردم، بعد برنامه رو به ocx تبديل كردم و رفتم تو فرانت پيچ...
ادرس فايل رو با مشخصاتش دادم و بدون مشكل اومد رو صفحه و اجرا شد... ولي وقتي با VBScript به اون تابع مقدار دادم error داد. منظوره errorش اين بود كه اصلا همچين تابعي وجود نداره :(

اگه كسي بتونه كمك كنه خوشحال مي شم :happy:
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
در مورد انتشارش شما كافيه كه Setup اونو بسازي - با هر چي كه ميتوني و دوست داري مثلا خود وي بي يه add in داره يا اينكه ميتوني از برنامه هاي نصب (كه يه روزگاري تو قسمت مقالات معرفي شده) استفاده كني. اما در مورد مشكل دوم من نفهميدم دقيقا چيكار ميخواي بكني؟
 

emad86_20011

Registered User
تاریخ عضویت
4 فوریه 2004
نوشته‌ها
185
لایک‌ها
2
سن
37
محل سکونت
Mashhad, Iran
به نقل از littlerabbit :
در مورد انتشارش شما كافيه كه Setup اونو بسازي - با هر چي كه ميتوني و دوست داري مثلا خود وي بي يه add in داره يا اينكه ميتوني از برنامه هاي نصب (كه يه روزگاري تو قسمت مقالات معرفي شده) استفاده كني. اما در مورد مشكل دوم من نفهميدم دقيقا چيكار ميخواي بكني؟
ممنون ولی من منظورم اين بود که در موقع باز شدن صفحه سايت اکتيو ايکس از آدرس داده شده دانلود بشه بعد اجرا شه.

در مورده سؤال دوم ببين مثلاً يک تابع تعريف کردی اينجوری
کد:
function aSample(m as string)
	label1.caption = m
end function
بعد که برنامه رو به ocx کامپايل ميکنی و ميخوای استفادش کنی اون تابع کار نميکنه
البتّه اگه اکتيو ايکس رو تويه يه فرم تو خوده وی بی بزاری همه چيز درست کار ميکنه ولی اگه همون اکتيو ايکس رو تو يه صفحه html بزاری کار نميکنه

تو صفحه html همه چيز درست کار ميکنه جز توابع
کد:
<SCRIPT LANGUAGE="VBSCRIPT">
sub window_onload()
	myActiveX.aSample("TEST")
end sub
</SCRIPT>
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
به نقل از emad86_20011 :
ممنون ولی من منظورم اين بود که در موقع باز شدن صفحه سايت اکتيو ايکس از آدرس داده شده دانلود بشه بعد اجرا شه.

در مورده سؤال دوم ببين مثلاً يک تابع تعريف کردی اينجوری
کد:
function aSample(m as string)
	label1.caption = m
end function
بعد که برنامه رو به ocx کامپايل ميکنی و ميخوای استفادش کنی اون تابع کار نميکنه
البتّه اگه اکتيو ايکس رو تويه يه فرم تو خوده وی بی بزاری همه چيز درست کار ميکنه ولی اگه همون اکتيو ايکس رو تو يه صفحه html بزاری کار نميکنه

تو صفحه html همه چيز درست کار ميکنه جز توابع
کد:
<SCRIPT LANGUAGE="VBSCRIPT">
sub window_onload()
	myActiveX.aSample("TEST")
end sub
</SCRIPT>

در مورد اولي : نه بايد تو اون فايل Cab يه فايل inf هم باشه. مثلا فلش رو چك كن ببين چي داره اينو ببين :
http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0

البته من فقط منظورم فايل inf هست كه اون هم Attach ميكنم و نيازي به لينك بالا نداري

اما در مورد سال دوم ميتوني عبازت Public رو قبل از function بنويسي؟ امكان داره مشكل اين باشه شايدم يه چيز ديگست به هر صورت لمتحان كن.
 

فایل های ضمیمه

  • swflash.zip
    1.1 KB · نمایش ها: 32

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
راستي يه چيز ديگه چرا اينها رو به صورت Property تعريف نميكني؟
 

emad86_20011

Registered User
تاریخ عضویت
4 فوریه 2004
نوشته‌ها
185
لایک‌ها
2
سن
37
محل سکونت
Mashhad, Iran
به نقل از littlerabbit :
راستي يه چيز ديگه چرا اينها رو به صورت Property تعريف نميكني؟
به نكته جالبي اشاره كردي ، چون بلد نيستم، اگه بگي ممنون ميشم
public هم با اون جوري كه من نوشتم يكيه... توي كاربرد فرقي نداره!

فايل inf رو هم ديدم... خيلي عجيب غريبه... حتما بايد يه برنامه باشه كه اين كاره بكنه!!!
در ضمن چرا بعد از فايل cab ورژنه برنامه رو مينويسن؟؟؟ اگه ننويسن نميشه؟

:eek: اينجور كه به نظر مياد گذاشتن اكتيو ايكس تو سايت كاره سختيه... ترسيدم :D
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
نه زياد سخت نيست فقط يكم دنگ و فنگ داره سعي كن عينا همينو شبيه سازي كني فقط اسم Section ها و GUID كنتزل رو عوض كن. تو MSDN يه قسمت واسه توضيخ دادن اين جور سيستم نصب هست.

اما در مورد سوال اولت : من هم نتونستم به هيچ تابعي از اكتيو ايكس هاي وي بي دسترسي داشته باشم اما دسترسي به خصايص Property ها به راحتي ممكنه و ميشه حتي اونا رو با تگ Param مقدار اوليه داد.
 

emad86_20011

Registered User
تاریخ عضویت
4 فوریه 2004
نوشته‌ها
185
لایک‌ها
2
سن
37
محل سکونت
Mashhad, Iran
به نقل از littlerabbit :
نه زياد سخت نيست فقط يكم دنگ و فنگ داره سعي كن عينا همينو شبيه سازي كني فقط اسم Section ها و GUID كنتزل رو عوض كن. تو MSDN يه قسمت واسه توضيخ دادن اين جور سيستم نصب هست.

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

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
به نقل از webmaster :
گفتگوي 2 نفره شده ;)
1- گفتگوي دو نفره به چه معنيه؟ فقط خواستي بگي تو هم هستي؟ اگه ميتوني جواب بده!!!!! اونوقت منم نميام همه جا خودمو قاطي كنم.

2 - جواب شما دوست عزیز.
خصیصه یا همون Property یه جور جفت از توابع هست. به اینصورت که یه تابع اونو میگیره و یه تابع اونو برمیگردونه. به عبارتی اگه یه خصیصه بخوایم بایستی دو تا تابع تعریف کنیم. اولی رو بهش میگن Get (تو هر زبونی یه جوره اما کلیت قضیه یکیه.) این تابع وقتی فراخوانی میشه که ما از خصیصه در سمت راست تساوی استفاده کنیم (یعنی به نحوی مقدار اونو بگیریم ) مثل این مورد :
کد:
	tmp=Form1.Caption
در این حالت تابع 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() وقتی فراخوانی میشه که مثلا بنویسیم :
کد:
	tmp=Form1.OnTop
یعنی استفاده در طرف راست تساوی
در این تابع بایست مقدار این خصیصه برگردانده شود. ما مقدار این حالت (یعنی OnTop بودن یا نبودن فرم را در متغیر خصوصی mOnTop گذاشتیم و فقط کافیست آن را برگردانیم
تابع Public Property Let OnTop(ByVal vNewValue As Boolean) هم وقتی فراخوانی میشه که بنویسیم :
کد:
	Form1.OnTop=True
یعنی استفاده در طرف چپ تساوی.
برای همینم دومی یه آرگومان هم میگیره. خیلی سادست آرگومان میگه که مقدار خصیصه میخواد با چی تنظیم شه. اگه 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 رو میسازه. شما فقط باید اونا رو تکمیل کنید.

موفق باشید
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
اگه ديگه مشكلي نيست اينو ببرم تو بخش مقالات.
 

ned

کاربر تازه وارد
تاریخ عضویت
21 آگوست 2004
نوشته‌ها
36
لایک‌ها
0
سن
42
محل سکونت
tehran
سلام
جواب سوال اول اينكه تك تك بذار بعدا كه كيخواي فايلتو درست كني دچار دردسر ميشي
خداحافظ
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
به نقل از ned :
سلام
جواب سوال اول اينكه تك تك بذار بعدا كه كيخواي فايلتو درست كني دچار دردسر ميشي
خداحافظ
چه ربطي داشت!!؟؟
 

emad86_20011

Registered User
تاریخ عضویت
4 فوریه 2004
نوشته‌ها
185
لایک‌ها
2
سن
37
محل سکونت
Mashhad, Iran
خيلی ممنون، خيلی کمکم کرد
فقط بايد ببينم ميشه اين فايل inf رو درست کرد يا نه

بازم ممنون ;)
 
بالا