PDA

View Full Version : ساخت ocx قابل استفاده در vb6



Payman62
سه شنبه 24 اردیبهشت 1387, 01:56 صبح
سلام.
چطور میشه تو c# کامپوننت ocx درست کرد که تو ویبی هم بشه ازش استفاده کرد؟

Payman62
سه شنبه 24 اردیبهشت 1387, 12:30 عصر
سلام.
اصلا میشه تو دات نت ocx ساخت؟
اگه نمیشه چطور میشه dll هایی که تو دات نت میسازیم تو ویبی استفاده کنیم؟
نه حتما با C# کلا با دات نت.

ASKaffash
چهارشنبه 25 اردیبهشت 1387, 16:40 عصر
با سلام دوست عزیز ( اینهم جهت سایر عزیزان )
پاسخ شما مثبت است وشدنی است در Help MSDN جستجو کنید در خصوص nampespace
System.Runtime.InteropServices و فایلهای تبدیل کننده به OCX تحت عناوین
Tlbexp.exe , Tlbimp.exe

علیرضا مداح
چهارشنبه 25 اردیبهشت 1387, 17:47 عصر
سلام دوست عزیز ،

Tlbexp.exe generates a type library that contains definitions of the types defined in the assembly. Applications such as Visual Basic 6.0 can use the generated type library to bind to the .NET types defined in the assembly.
ref : http://msdn.microsoft.com/en-us/library/hfzzah2c(VS.80).aspx

Payman62
چهارشنبه 25 اردیبهشت 1387, 20:01 عصر
سلام.
ولی خروجی این فایل tlb هست نه ocx. من ocx میخوام. میخوام کامپوننت گرافیکی داشته باشم.
جناب کفاش منتظر سورست هستم.

Payman62
پنج شنبه 26 اردیبهشت 1387, 19:53 عصر
چی شد سورسو پیدا نکردی؟

Payman62
دوشنبه 06 خرداد 1387, 09:11 صبح
سلام.
این مثالی که گذاشتم این مشکل رو حل میکنه.

Payman62
دوشنبه 06 خرداد 1387, 09:14 صبح
سلام.
من یه کامپوننت با .net نوشتم بردم تو ویبی6. فرض کن یه کلید تو کامپوننت من قرار داره. من میخوام از تو ویبی6 به پروپرتی های این کلید دسترسی داشته باشم. مثلا بتونم بک کالرش رو عوض کنم. ولی تو ویبی فقط کل اون یوزرکنترل رو میشناسه و اشیای روی یوزرکنترل رو نمیبینه.
میشه برای تک تک پروپرتی ها تو دات نت پروپرتی تعریف کرد که تو ویبی تو پروپرتی های کامپوننت نمایش داده بشه و میشه بهشون مقدار داد و مقدار مثلا بک کالر عوض میشه.
ولی من میخوام کاری کنم به طور اتوماتیک همه پروپرتی ها رو بشناسه. دیگه نشینم برای تک تکشون کد نویسی کنم.

ASKaffash
دوشنبه 06 خرداد 1387, 09:39 صبح
دوست عزیز سلام
کد مود نظر یک مثال ساده بود که در ذیل برایت قرار میدهم ولی نکته اینجاست که نمیدانم تبدیل کننده چه بوده است در واقع معکوس برنامه Tlbexp.exe .


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace ComProvider
{
public class Class1
{
public void f(int i)
{
MessageBox.Show(i.ToString());
}
}
}

Payman62
دوشنبه 06 خرداد 1387, 12:45 عصر
سلام.
فکر نمیکنم مثالت جواب سوالم باشه. توضیح بده.

وقتی کامپوننت رو به صورت ریفرنس به پروژه ویبی اضافه میکنم میشه به همه ابجکت ها و اشیا رو کامپوننت و همچنین میشه به پروپرتی هاشون دسترسی داشت. ولی وقتی ویزیبل کامپوننت رو true میکنم رو فرم ظاهر نمیشه.
ولی وقتی با دستور control.add یه نمونه از ریفرنس به روی فرم میارم و ویزیبلش رو تورو میکنم رو فرم ظاهر میشه ولی نمیشه به هیچ کدوم از اشیا دسترسی داشت.
این مثال رو ببینید میتونید کاری کنید که این مشکل حل شه.
http://payman.parsaspace.com/Example/Test.zip

ASKaffash
دوشنبه 06 خرداد 1387, 17:05 عصر
سلام
کد شما فکرم را مشغول کرده اول اینکه موقع اجرا خطا میگیرد ولی خوب است روی این ایده دارم کار میکنم
اگر جواب گرفتم حتما با شما در میان خواهم گذاشت. با تشکر

Payman62
سه شنبه 07 خرداد 1387, 09:44 صبح
سلام.
منم که گفتم وقتی ویزیبل رو تورو میکنی نمیشه به پروپرتی ها دسترسی داشت.
این مشکل هم حل شد.
یه مثال گذاشتم. ببینید. من برای این که به پروپرتی های اشیای کامپوننتم دسترسی داشته باشم خاصیت modifiers شون رو public میکنم. با این روش میشه پروپرتی های همه اشیای رو کامپوننت رو تغییر داد.
حتی اگه یه کامپوننت رو تو یه کامپوننت دیگه قرار بدیم با پابلیک کردن این خاصیت میشه پروپرتی های اشیای داخل اون کامپوننت رو هم تغییر داد.
مثالی که گذاشتم به خوبی مشخص میکنه چی میگم. (Test2.zip)

حالا من یه کامپوننت از نت گرفتم. مستقیم اوردمش تو ویبی دیدم نمیشه به پروپرتی هاش دسترسی داشت. بعد به یه کامپوننت دیگه اضافش میکنم و modifiers رو هم پابلیک میکنم. ولی باز هم تو ویبی نمیشه به پروپرتی هاش دسترسی داشت. این مشکل رو چطور حل کنم ؟ میگه object requred . مثالش رو هم همراه با خود کامپوننت گذاشتم. (Ques.zip)

Payman62
سه شنبه 07 خرداد 1387, 10:23 صبح
سلام.
این مشکلم حل کردم. البته با یه کلک رشتی.
کلاس AGauge تو سورس dll از Control ویژگی به ارث میبرد که من با یه نغییر کوچیک این قسمت رو به UserControl تغییر دادم تا تو ویبی نمایان بشه و ظاهر گرافیکی هم داشته باشه. چون من تو ویبی به همه ویژگی ها دسترسی داشتم ولی فقط کامپوننت رو نمیتونستم ظاهر کنم که با این تغییر این مشکل حل شد. به این صورت.
public partial class AGauge : UserControl
حالا یه سوال دیگه. این تغییر مشکلی تو کارکرد کامپوننت ایجاد نمیکنه؟

ASKaffash
سه شنبه 07 خرداد 1387, 10:30 صبح
با سلام
دوست عزیز چقدر خوب است که تجارب کسب شده را تحت یک تاپیک مفصل مطرح وبه سایرین آموزش دهید چون خیلی کار ویژه ای است واگر دقت کرده باشید کسی در این تاپیک بعلت ویژه گی خاص آن وارد نمیشود. باتشکر

Payman62
سه شنبه 07 خرداد 1387, 11:39 صبح
سلام.
درسته. مشکلی بود که کمتر کسی جوابش رو میدونست. به نظر میرسه فقط شما وارد این تاپیک میشید.
اوردن کامپوننت تو لیست ریفرنس ها کار ساده ای بود. ولی نمایشش روی فرم تبدیل شده بود به یه مشکل. جالبه بگم روش Form1.add.controls و یا روش استفاده از این کامپوننت آخری که به یوزر کنترل تبدیل کردم رو خودم فهمیدم و کسی در این مورد راهنماییم نکرد. کار خسته کننده ای بود ولی به نتیجش میرزید.
چشم به زودی یه تاپیک در این مورد میزنم و به طور کامل توضیح میدم.

Payman62
سه شنبه 07 خرداد 1387, 13:12 عصر
سلام.
بازم سوال.
دیدید با این روش که گفتم میشه به همه پروپرتی های کامپوننت دسترسی داشت. ولی پروپرتی هارو برامون لیست نمیکنه. باید خودمون بدونیم کامپوننت شامل چه پروپرتی هایی هست.
به نظر شما راهی وجود داره تا لیست پروپرتی های کامپوننت رو پیدا کنیم؟

علیرضا مداح
سه شنبه 07 خرداد 1387, 15:18 عصر
مطلب زیر را مطالعه کنید :
Understanding Classic COM Interoperability With .NET Applications (http://www.codeproject.com/KB/COM/cominterop.aspx)

Payman62
شنبه 11 خرداد 1387, 16:52 عصر
سلام.
اون روش اولی که کامپوننت رو از تو vb.net میبرد تو vb6 این امکان رو داره که لیست پروپرتی هارو در حالت دیزاین نشون بده. منظورم این روشه که یه مثالم ازش گذاشتم. عملیات رجیستر شدن رو اتوماتیک انجام میده و کامپوننت تو لیست کامپوننت های ویبی6 نمایش داده میشه و میشه مثل کامپوننت های خود ویبی به پروژه اضافش کرد و کشیدش رو فرم.
حالا تو این روش در حالت عادی در حالت دیزاین لیست پروپرتی ها ناقص هست. مثلا value که مقدار این گیج رو ست میکنه تو ویبی نمایش داده نمیشه. باید یه کاری کرد که لیست پروپرتی ها کامل نشون داده بشه. دیدم کسی این کارو کرده ولی نمیدونم چطور. کسی بلده؟

ASKaffash
شنبه 11 خرداد 1387, 17:22 عصر
سلام
دوست عزیز جناب Payman هر کاری میکنم Test12.tlb رجیستر نمیشود تا بتوانم تست کنم لطفا کمک نمائید

Payman62
سه شنبه 14 خرداد 1387, 12:20 عصر
سلام.
این یکی رو که گذاشتم یه تست بکن. اگه اینم نشد برو تو رجیستری کلمه Gauge رو سرچ کن. هر کلید یا ولیویی که پیدا کرد کلیدشو پاک کن.
بعد دوباره پروژه .NET رو اجرا کن و build کن. بعد یه پروژه ویبی جدید (نه اونی که تو این فایلی هست که من گذاشتم) باز کن و Gauge رو از لیست کامپوننت ها تیک بزن تا به جعبه ابزارت اضافه شه. بعد ببین میتونی جواب سوال منو بدی.

Payman62
پنج شنبه 16 خرداد 1387, 17:42 عصر
سلام.
آقای کفاش پروژه رو چک کردی؟

Payman62
سه شنبه 21 خرداد 1387, 17:28 عصر
سلام.
یه مشکل دیگه.
اون مثالی که گذاشته بودم که کامپوننتی میساخت که میشد تو ویبی به صورت اینترفیس ازش استفاده کرد (http://barnamenevis.org/forum/attachment.php?attachmentid=18248&d=1211778698) یه مشکلی داره. اول این که اگه بخوای از کامپوننت رو یه سیستم دیگه استفاده کنی حتما باید برنامه دات نتی رو هم اجرا کنی تا کامپوننت رجیستر و قابل استفاده در ویبی بشه.
دوم این که رو سیستم خودمم چند تا کامپوننت که میسازم با هم قاطی میشن. مثلا من تو ویبی تست1 رو اد میکنم تست2 به جعبه ابزارم اضافه میشه.
حالا چطور میتونم دستی کامپوننتم رو رجیستر کنم که نه قاطی بشن نه لازم باشه برنامه دات نتی رو سیستم های دیگه هم کامپایل شه؟

ASKaffash
سه شنبه 21 خرداد 1387, 18:18 عصر
سلام
من با 2008 کارمیکنم اصلا اجرا نمیشه و خطا میده منظورم اینکه اضافه میشه ولی روی خط دوم سورس خطا میده چطوری مشکل را حل کنم

Payman62
چهارشنبه 22 خرداد 1387, 15:26 عصر
سلام.
کدی که ارور میده رو بذار. من چطور بفهمم کدومو میگی.

ASKaffash
چهارشنبه 22 خرداد 1387, 16:12 عصر
با سلام
در کد قرمز رنگ ذیل :


Private Sub Command1_Click()
Set a = Form1.Controls.Add("Test2.Test2", "A")
a.Visible = True
a.object.CheckBox1.Text = "BBBBB"
a.object.test11.Visible = False
a.object.test11.Visible = True
a.object.test11.button1.Text = "DDDD"
End Sub

این خطا را میدهد :
Can'at find project or library
با وجود اینکه Tlb را ریفرنس کرده ام

Payman62
شنبه 25 خرداد 1387, 09:30 صبح
سلام.
قبلش پروژه دات نت رو کامپایل کردی؟
آخه اگه یه ریفرنسی هم موجود نباشه پیغام میده
invalid class strnig
نه چیزی که شما فرمودی. یه پروژه جدید بساز و دوباره تست کن.

ASKaffash
شنبه 25 خرداد 1387, 16:27 عصر
با سلام
اتفاقا همین کار را کردم وقتی سورس #C را کامپایل میکنم درست است وقتی تبدیل به Tlb میکنم درست است وحتی ریفرنس میکنم بازهم درست است ولی وقتی در VB اجرا میکنم خطا میدهد برای همین است که سئوال کردم دات نت شما 2008 است ؟

Payman62
یک شنبه 26 خرداد 1387, 08:54 صبح
سلام.
نه 2005. ولی بعید میدونم ربطی داشته باشه.

Payman62
سه شنبه 28 خرداد 1387, 15:49 عصر
سلام.
یه سوال جدید.
حالا که با اون مثالی که توضیح دادم (http://barnamenevis.org/forum/attach...8&d=1211778698 ) میشه کامپوننت از تو .net اورد تو ویبی یه مشکل جدید دارم. من میخوام کل پروپرتی های کامپوننت تو ویبی قابل دسترس باشه. ولی تو ویبی نمیشه به پروپرتی های کامپوننت دسترسی داشت. چطور این مشکلو حل کنم؟

Payman62
دوشنبه 03 تیر 1387, 09:07 صبح
سلام.
چی شد مشکل حل شد؟

ASKaffash
دوشنبه 03 تیر 1387, 16:23 عصر
سلام
نه اصلا توی 2008 همین خطا رو که گفته بودم میدهد احتمالا یک فرقی بین 2005 و 2008 در این مورد خاص هست !

Payman62
سه شنبه 18 تیر 1387, 16:22 عصر
سلام.
یه سوال دیگه.
فرض یه کامپوننت ساختی که روش یه کلیده که وقتی روش کلیک کنی یه فرم باز میشه. وقتی اینو میاری تو ویبی یه مشکلی پیش میاد. وقتی فرم ویبی باز میشه و کلید رو کلیک میکنی فرم دات نتی باز میشه. تا این جا مشکلی نیست. ولی بعد که ویبی رو استاپ میکنی اون فرم دات نتی همچنان باز میمونه. اگه تو ویبی 2 تا فرم داشته باشی و کامپوننت رو یکی از فرمات باشه و فرم باز شه و کارش تموم شه و بسته شه ولی فضای اشغالی توسط کامپوننت دات نتی همچنان اشغال میمونه و هندل ها رو آزاد نمیکنه. تا زمانی که برنامه ویبی کلا بسته نشه کامپوننت دات نتی باز میمونه. حتی اگه اون فرمی که روش بوده بسته شه.
حالا من با یه سری ترفند و نوشتن ساب مشکلو موقتا حل کردم. ولی میخوام بدونم چی کار باید کرد که وقتی فرم ویبی بسته شد همه کامپوننت های روش هم بسته شن و فضای اشغالی کاملا آزاد شه.