PDA

View Full Version : اضافه کردن یک Type جدید به Type Library یا OLE Automation Section



Hadizadeh
دوشنبه 01 مرداد 1386, 13:58 عصر
من یک کامپوننت VCL که از کلاس TWinControl ارث بری شده رو طراحی کردم. می دونیم که برای تبدیل یک VCL دلفی به یک ActiveX می بایست کلاس اصلی TWincontrol باشه که بعد بتونیم در wizard ظاهر شده در بخش File>New>ActiveX>ActiveX Control اون رو مشاهده کنیم و سپس مراحل بعدی رو طی کنیم.اما مشکل من اینه که در کد اصلی مربوط به این VCL یک فانکشن (X) دارم که تو لیست پارامترهاش (آرگومانش) از یک ابجکت مثل TMyObject استفاده کردم که کلاس مربوط به اون تو یک یونیت دیگه که خودش یک VCL مجزاست تعریف شده. حالا وقتی این VCL ام رو به ActiveX تبدیل می کنم و سپس ActiveX رو نصب و فراخوانی می کنم این فانکشن (X) در بین متدهای منتشر شده ActiveX نیست. توجه کنید که فانکشن X در بخش Public کلاس VCL ام تعریف شده. جالب اینه که مابقی فانکش های معمولی تو ActiveX دیده میشن به غیر از این فانکشنی که از یک کلاس مجزای دیگری توش استفاده شده! حالا به نظر شما مشکل چیه؟ ممنون

Hadizadeh
دوشنبه 01 مرداد 1386, 15:48 عصر
دوستان همین طور که می دونید برای تبدیل یک VCL دلفی به AciveX باید از Type Library Editor استفاده کرد. ولی در این ادیتور فقط نوع داده های استاندارد مثل Integer و امثال اون وجود داره ولی چه طور میشه یک تایپ جدید به اون اضافه کرد تا توسط اون بتونیم فانکشن هایی از VCL که در لیست آرگومانشون ، تایپ های دلخواه تعریف شده توسط کاربر وجود داره، رو به داخل ActiveX صادر (Export) کرد. کسی میدونه؟

vcldeveloper
سه شنبه 02 مرداد 1386, 07:54 صبح
علت اینکه نمی تونید هر نوع داده ایی را در Type Library استفاده کنید اینه که این Type Library باید توسط زبان های برنامه نویسی مختلفی استفاده بشه که لزوما به شکل یکسانی کلاس ها و داده های پیچیده مثل Record, string, dynamic array و ... را پیاده سازی نمیکنند، در نتیجه ممکنه یک نوع داده برای یک زبان قابل درک باشه و در زبان دیگه ایی نباشه.
برای ارسال یک کلاس به عنوان پارامتر فکر کنم بتونید از variant استفاده کنید.

Hadizadeh
سه شنبه 02 مرداد 1386, 11:21 صبح
من تصمیم گرفتم که به جای تبدیل VCL ام به ActiveX و درگیر شدن با اینجور مسائل از یک ActiveX Form استفاده کنم. ولی نظر شما چیه؟

Hadizadeh
چهارشنبه 03 مرداد 1386, 18:30 عصر
علت اینکه نمی تونید هر نوع داده ایی را در Type Library استفاده کنید اینه که این Type Library باید توسط زبان های برنامه نویسی مختلفی استفاده بشه که لزوما به شکل یکسانی کلاس ها و داده های پیچیده مثل Record, string, dynamic array و ... را پیاده سازی نمیکنند، در نتیجه ممکنه یک نوع داده برای یک زبان قابل درک باشه و در زبان دیگه ایی نباشه.
برای ارسال یک کلاس به عنوان پارامتر فکر کنم بتونید از variant استفاده کنید.

آقای کشاورز از variant استفاده کردم کامپایلر خطا می گیره. ببینید فرض کنید من می خوام یک فانکشن داشته باشیم که تو آرگومانش یک TBitmap رو بگیره. حالا به نظرتون چه طور میشه این کار رو کرد؟ یادتون نره داریم ActiveX می نویسیم!

vcldeveloper
پنج شنبه 04 مرداد 1386, 10:06 صبح
فرض کنید من می خوام یک فانکشن داشته باشیم که تو آرگومانش یک TBitmap رو بگیره. حالا به نظرتون چه طور میشه این کار رو کرد؟ یادتون نره داریم ActiveX می نویسیم!
ببینید، بالاخره اون کسی که داره از این ActiveX استفاده می کنه، باید بدونه که این TBitmap چی هست. TBitmap برای دلفی قابل فهمه، برای یک زبان دیگه و برنامه نویسش شناخته شده نیست. من تجربه خاصی در ایجاد ActiveX ندارم، اما اگر به کاری که خود دلفی میکنه دقت کنید، می بینید که یا از Type هایی که توسط OLE پشتیبانی میشند، استفاده میکنه، یا خودش یک Interface برای کلاس مربوطه تعریف میکنه و اون Interface رو هم خودش پیاده سازی میکنه و از اون کلاس داخل ActiveX مربوطه استفاده میکنه، بطوری که فراخوانی هر یک از متدهای آن، موجب فراخوانی متد مربوط به شی ایجاد شده از اون کلاس بصورت داخلی میشه.

شاید دوستانی که تجربه بیشتری در زمینه کار با ActiveX و ایجاد آن دارند بتونند راه حل مناسبی به شما ارائه کنند.

Hadizadeh
پنج شنبه 04 مرداد 1386, 10:08 صبح
ممنونم. در حقیقت سوال من هم اینه!