سلام.
چطور میشه تو C# کامپوننت ocx درست کرد که تو ویبی هم بشه ازش استفاده کرد؟
سلام.
چطور میشه تو C# کامپوننت ocx درست کرد که تو ویبی هم بشه ازش استفاده کرد؟
سلام.
اصلا میشه تو دات نت ocx ساخت؟
اگه نمیشه چطور میشه dll هایی که تو دات نت میسازیم تو ویبی استفاده کنیم؟
نه حتما با C# کلا با دات نت.
با سلام دوست عزیز ( اینهم جهت سایر عزیزان )
پاسخ شما مثبت است وشدنی است در Help MSDN جستجو کنید در خصوص nampespace
System.Runtime.InteropServices و فایلهای تبدیل کننده به OCX تحت عناوین
Tlbexp.exe , Tlbimp.exe
سلام دوست عزیز ،
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/libr...2c(VS.80).aspx
I've just started tweeting!
@Alireza_Maddah
سلام.
ولی خروجی این فایل tlb هست نه ocx. من ocx میخوام. میخوام کامپوننت گرافیکی داشته باشم.
جناب کفاش منتظر سورست هستم.
چی شد سورسو پیدا نکردی؟
سلام.
این مثالی که گذاشتم این مشکل رو حل میکنه.
سلام.
من یه کامپوننت با .net نوشتم بردم تو ویبی6. فرض کن یه کلید تو کامپوننت من قرار داره. من میخوام از تو ویبی6 به پروپرتی های این کلید دسترسی داشته باشم. مثلا بتونم بک کالرش رو عوض کنم. ولی تو ویبی فقط کل اون یوزرکنترل رو میشناسه و اشیای روی یوزرکنترل رو نمیبینه.
میشه برای تک تک پروپرتی ها تو دات نت پروپرتی تعریف کرد که تو ویبی تو پروپرتی های کامپوننت نمایش داده بشه و میشه بهشون مقدار داد و مقدار مثلا بک کالر عوض میشه.
ولی من میخوام کاری کنم به طور اتوماتیک همه پروپرتی ها رو بشناسه. دیگه نشینم برای تک تکشون کد نویسی کنم.
دوست عزیز سلام
کد مود نظر یک مثال ساده بود که در ذیل برایت قرار میدهم ولی نکته اینجاست که نمیدانم تبدیل کننده چه بوده است در واقع معکوس برنامه Tlbexp.exe .
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace ComProvider
{
publicclassClass1
{
publicvoid f(int i)
{
MessageBox.Show(i.ToString());
}
}
}
سلام.
فکر نمیکنم مثالت جواب سوالم باشه. توضیح بده.
وقتی کامپوننت رو به صورت ریفرنس به پروژه ویبی اضافه میکنم میشه به همه ابجکت ها و اشیا رو کامپوننت و همچنین میشه به پروپرتی هاشون دسترسی داشت. ولی وقتی ویزیبل کامپوننت رو true میکنم رو فرم ظاهر نمیشه.
ولی وقتی با دستور control.add یه نمونه از ریفرنس به روی فرم میارم و ویزیبلش رو تورو میکنم رو فرم ظاهر میشه ولی نمیشه به هیچ کدوم از اشیا دسترسی داشت.
این مثال رو ببینید میتونید کاری کنید که این مشکل حل شه.
http://payman.parsaspace.com/Example/Test.zip
سلام
کد شما فکرم را مشغول کرده اول اینکه موقع اجرا خطا میگیرد ولی خوب است روی این ایده دارم کار میکنم
اگر جواب گرفتم حتما با شما در میان خواهم گذاشت. با تشکر
سلام.
منم که گفتم وقتی ویزیبل رو تورو میکنی نمیشه به پروپرتی ها دسترسی داشت.
این مشکل هم حل شد.
یه مثال گذاشتم. ببینید. من برای این که به پروپرتی های اشیای کامپوننتم دسترسی داشته باشم خاصیت modifiers شون رو public میکنم. با این روش میشه پروپرتی های همه اشیای رو کامپوننت رو تغییر داد.
حتی اگه یه کامپوننت رو تو یه کامپوننت دیگه قرار بدیم با پابلیک کردن این خاصیت میشه پروپرتی های اشیای داخل اون کامپوننت رو هم تغییر داد.
مثالی که گذاشتم به خوبی مشخص میکنه چی میگم. (Test2.zip)
حالا من یه کامپوننت از نت گرفتم. مستقیم اوردمش تو ویبی دیدم نمیشه به پروپرتی هاش دسترسی داشت. بعد به یه کامپوننت دیگه اضافش میکنم و modifiers رو هم پابلیک میکنم. ولی باز هم تو ویبی نمیشه به پروپرتی هاش دسترسی داشت. این مشکل رو چطور حل کنم ؟ میگه object requred . مثالش رو هم همراه با خود کامپوننت گذاشتم. (Ques.zip)
سلام.
این مشکلم حل کردم. البته با یه کلک رشتی.
کلاس AGauge تو سورس dll از Control ویژگی به ارث میبرد که من با یه نغییر کوچیک این قسمت رو به UserControl تغییر دادم تا تو ویبی نمایان بشه و ظاهر گرافیکی هم داشته باشه. چون من تو ویبی به همه ویژگی ها دسترسی داشتم ولی فقط کامپوننت رو نمیتونستم ظاهر کنم که با این تغییر این مشکل حل شد. به این صورت.
public partial class AGauge : UserControl
حالا یه سوال دیگه. این تغییر مشکلی تو کارکرد کامپوننت ایجاد نمیکنه؟
با سلام
دوست عزیز چقدر خوب است که تجارب کسب شده را تحت یک تاپیک مفصل مطرح وبه سایرین آموزش دهید چون خیلی کار ویژه ای است واگر دقت کرده باشید کسی در این تاپیک بعلت ویژه گی خاص آن وارد نمیشود. باتشکر
سلام.
درسته. مشکلی بود که کمتر کسی جوابش رو میدونست. به نظر میرسه فقط شما وارد این تاپیک میشید.
اوردن کامپوننت تو لیست ریفرنس ها کار ساده ای بود. ولی نمایشش روی فرم تبدیل شده بود به یه مشکل. جالبه بگم روش Form1.add.controls و یا روش استفاده از این کامپوننت آخری که به یوزر کنترل تبدیل کردم رو خودم فهمیدم و کسی در این مورد راهنماییم نکرد. کار خسته کننده ای بود ولی به نتیجش میرزید.
چشم به زودی یه تاپیک در این مورد میزنم و به طور کامل توضیح میدم.
سلام.
بازم سوال.
دیدید با این روش که گفتم میشه به همه پروپرتی های کامپوننت دسترسی داشت. ولی پروپرتی هارو برامون لیست نمیکنه. باید خودمون بدونیم کامپوننت شامل چه پروپرتی هایی هست.
به نظر شما راهی وجود داره تا لیست پروپرتی های کامپوننت رو پیدا کنیم؟
مطلب زیر را مطالعه کنید :
Understanding Classic COM Interoperability With .NET Applications
آخرین ویرایش به وسیله علیرضا مداح : چهارشنبه 08 خرداد 1387 در 19:41 عصر
I've just started tweeting!
@Alireza_Maddah
سلام.
اون روش اولی که کامپوننت رو از تو vb.net میبرد تو vb6 این امکان رو داره که لیست پروپرتی هارو در حالت دیزاین نشون بده. منظورم این روشه که یه مثالم ازش گذاشتم. عملیات رجیستر شدن رو اتوماتیک انجام میده و کامپوننت تو لیست کامپوننت های ویبی6 نمایش داده میشه و میشه مثل کامپوننت های خود ویبی به پروژه اضافش کرد و کشیدش رو فرم.
حالا تو این روش در حالت عادی در حالت دیزاین لیست پروپرتی ها ناقص هست. مثلا value که مقدار این گیج رو ست میکنه تو ویبی نمایش داده نمیشه. باید یه کاری کرد که لیست پروپرتی ها کامل نشون داده بشه. دیدم کسی این کارو کرده ولی نمیدونم چطور. کسی بلده؟
سلام
دوست عزیز جناب Payman هر کاری میکنم Test12.tlb رجیستر نمیشود تا بتوانم تست کنم لطفا کمک نمائید
سلام.
این یکی رو که گذاشتم یه تست بکن. اگه اینم نشد برو تو رجیستری کلمه Gauge رو سرچ کن. هر کلید یا ولیویی که پیدا کرد کلیدشو پاک کن.
بعد دوباره پروژه .NET رو اجرا کن و build کن. بعد یه پروژه ویبی جدید (نه اونی که تو این فایلی هست که من گذاشتم) باز کن و Gauge رو از لیست کامپوننت ها تیک بزن تا به جعبه ابزارت اضافه شه. بعد ببین میتونی جواب سوال منو بدی.
آخرین ویرایش به وسیله Payman62 : سه شنبه 14 خرداد 1387 در 12:33 عصر
سلام.
آقای کفاش پروژه رو چک کردی؟
سلام.
یه مشکل دیگه.
اون مثالی که گذاشته بودم که کامپوننتی میساخت که میشد تو ویبی به صورت اینترفیس ازش استفاده کرد (https://barnamenevis.org/attach...8&d=1211778698) یه مشکلی داره. اول این که اگه بخوای از کامپوننت رو یه سیستم دیگه استفاده کنی حتما باید برنامه دات نتی رو هم اجرا کنی تا کامپوننت رجیستر و قابل استفاده در ویبی بشه.
دوم این که رو سیستم خودمم چند تا کامپوننت که میسازم با هم قاطی میشن. مثلا من تو ویبی تست1 رو اد میکنم تست2 به جعبه ابزارم اضافه میشه.
حالا چطور میتونم دستی کامپوننتم رو رجیستر کنم که نه قاطی بشن نه لازم باشه برنامه دات نتی رو سیستم های دیگه هم کامپایل شه؟
سلام
من با 2008 کارمیکنم اصلا اجرا نمیشه و خطا میده منظورم اینکه اضافه میشه ولی روی خط دوم سورس خطا میده چطوری مشکل را حل کنم
سلام.
کدی که ارور میده رو بذار. من چطور بفهمم کدومو میگی.
با سلام
در کد قرمز رنگ ذیل :
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 را ریفرنس کرده ام
سلام.
قبلش پروژه دات نت رو کامپایل کردی؟
آخه اگه یه ریفرنسی هم موجود نباشه پیغام میده
invalid class strnig
نه چیزی که شما فرمودی. یه پروژه جدید بساز و دوباره تست کن.
با سلام
اتفاقا همین کار را کردم وقتی سورس #C را کامپایل میکنم درست است وقتی تبدیل به Tlb میکنم درست است وحتی ریفرنس میکنم بازهم درست است ولی وقتی در VB اجرا میکنم خطا میدهد برای همین است که سئوال کردم دات نت شما 2008 است ؟
سلام.
نه 2005. ولی بعید میدونم ربطی داشته باشه.
سلام.
یه سوال جدید.
حالا که با اون مثالی که توضیح دادم (https://barnamenevis.org/attach...8&d=1211778698 ) میشه کامپوننت از تو .net اورد تو ویبی یه مشکل جدید دارم. من میخوام کل پروپرتی های کامپوننت تو ویبی قابل دسترس باشه. ولی تو ویبی نمیشه به پروپرتی های کامپوننت دسترسی داشت. چطور این مشکلو حل کنم؟
سلام.
چی شد مشکل حل شد؟
سلام
نه اصلا توی 2008 همین خطا رو که گفته بودم میدهد احتمالا یک فرقی بین 2005 و 2008 در این مورد خاص هست !
سلام.
یه سوال دیگه.
فرض یه کامپوننت ساختی که روش یه کلیده که وقتی روش کلیک کنی یه فرم باز میشه. وقتی اینو میاری تو ویبی یه مشکلی پیش میاد. وقتی فرم ویبی باز میشه و کلید رو کلیک میکنی فرم دات نتی باز میشه. تا این جا مشکلی نیست. ولی بعد که ویبی رو استاپ میکنی اون فرم دات نتی همچنان باز میمونه. اگه تو ویبی 2 تا فرم داشته باشی و کامپوننت رو یکی از فرمات باشه و فرم باز شه و کارش تموم شه و بسته شه ولی فضای اشغالی توسط کامپوننت دات نتی همچنان اشغال میمونه و هندل ها رو آزاد نمیکنه. تا زمانی که برنامه ویبی کلا بسته نشه کامپوننت دات نتی باز میمونه. حتی اگه اون فرمی که روش بوده بسته شه.
حالا من با یه سری ترفند و نوشتن ساب مشکلو موقتا حل کردم. ولی میخوام بدونم چی کار باید کرد که وقتی فرم ویبی بسته شد همه کامپوننت های روش هم بسته شن و فضای اشغالی کاملا آزاد شه.