ورود

View Full Version : سوال: ساخت برنامه ای به روش ماژولی



Mask
یک شنبه 24 مهر 1390, 14:24 عصر
با عرض سلام خدمت دوستان.
بنده یه پلیر قوی نوشته ام.این برنامه رو اسمشو میزارم نسخه core.
سوالم اینه که چکار باید بکنم که برنامه نویسهای دیگه بتونند برای برنامم(نسخه core) ماژول بنویسند و به برنامه من ایمپورت کنند.
برنامه من مثلا چند فرمت رو پشتیبانی میکنه. مثلا فلان برنامه نویس میبینه که برنامه خوبیه . میخام اون برنامه نویس بتونه از بیرون یه پلاگین یا ماژولی رو بنویسه و به برنامه اظافه کنه.
ممنون از جوابتون.

یوسف زالی
یک شنبه 24 مهر 1390, 15:52 عصر
سلام.
اگر من بودم در هنگام لود برنامه میومدم مثلا چک می کردم ببینم در فلان فایل لیست چه توابعی از چه دی ال ال هایی هست.
برای اونها منو می ساختم و برای هر منو هم یک رویداد که تابع مشخص شده رو فراخوانی می کنه.
نمی دونم به دردتون می خوره یا نه.
مثلا در فایل:

DllName, FuncName, MenuName
-------------------------------------------------

Dll1.dll, Func1(@1, @2, @3), DoStyleFade
Dll1.dll, Func2(@1, @2, @3), DoEffect1
Dll2.dll, Func(@1, @2, @3), DoSomethingElse

برنامه ای که میخواد با برنامه من تعامل کنه باید این استاندارد رو در فایل من بنویسه.
امیدوارم کمکتون کرده باشه.

Felony
یک شنبه 24 مهر 1390, 16:40 عصر
در کل برنامه شما تعیین کننده نحوه تعامل هست ؛ مثل تمام برنامه های که میشه براشون پلاگین نوشت ( Photoshop , Multimedia Builder , Maya و ... ) همه این ها یک SDK در اختیار برنامه نویس میزارن که این SDK ساختار و نحوه تعامل با برنامه رو تعیین میکنه و برنامه نویس باید بر اساس اون با برنامه تعامل برقرار کنه ، حالا بستگی به برنامه شما داره که قراره چه تعاملی با پلاگین ها داشته باشه ، یه موقع تعامل در حد جا به جایی 4 تا متغییر و رشته هست ، یه موقع هم به همین سادگی نیست و پلاگین حتی در رابط کاربری و ... برنامه هم میتونه دخیل باشه ، شما با توجه به این موارد ( تعاملات مورد نیاز برنامه ) میتونی یک سری قوانین برای نوشتن پلاگین هات تعیین کنی و حتی برای اون SDK خودت رو بسازی و به کاربر بگی بر این اساس پلاگین رو باید بنویسی و توسعه بدی .

مثلا تو برنامت رو یه تصویر یکسری افکت رو اعمال میکنی ( با Canvas ) حالا میخوای یک افکت جدید رو با پلاگین به برنامه اضافه کنی ، حالا باید تعیین کنی پلاگین چطور با برنامه تعامل داشته باشه ، آیا باید برنامه عکس رو تحویل پلاگین بده و افکت روش اعمال بشه و به برنامه برگرده ، آیا هندل DC تصویر ( hDC ) به پلاگین ارسال بشه یا ...

Mask
یک شنبه 24 مهر 1390, 17:15 عصر
ممنون.همه این فرمایشات رو تا حدودی میدونم.
موضوع اینه که نمیدونم از کجا شروع کنم.
اگه یه نمونه ساده بهم نشون بدید. فکر میکنم با تلاش بعدی بتونم گسترشش بدم.
حاجی جون بچت این برنامه ما چی شد:لبخند:

BORHAN TEC
یک شنبه 24 مهر 1390, 20:48 عصر
من از قبل تجربه این کار را دارم و به نظر من بهترین راه موجود بدون شک :متعجب:استفاده از RemObjects Hydra است.:چشمک:

SAASTN
دوشنبه 25 مهر 1390, 02:23 صبح
این یه نمونه ساده برای پیاده سازی افزونه با اتکا به یه تک DLL هست. شما می تونید خودتون هم DLL های جدیدی تولید کنید و کنار این برنامه قرار بدین.
ProjectGroup1 رو باز کنید و Build All Projects. اگه جاییش گنگه بپرسید تا توضیح بدم. توجه داشته باشید که من این کد رو با فرض سالم بودن ساختار DLL های پیدا شده نوشتم، در صورتی که درستش اینه که این فرض حتما آزمون بشه.
ممنون میشم دوستان یه بررسی بکنن و اگه جاییش عمل نا ثوابی انجام شده به من گوشزد کنن.

و در ضمن یه سوال:
توی Unit1 مربوط به پروژه HueSaturationChanger توی روال SetImage به جای اونهمه اضافه کاری نوشته بودم:
ImageSource.Picture.Bitmap.Assign(aBitmap);

در زمان اجرا از جانب درگاه اشکال زدائیتش ندا اومد که نمی شه یه "TBitmap" رو به یه "TBitmap" اختصاص داد! کسی می دونه چرا؟:متفکر:

MohsenB
دوشنبه 25 مهر 1390, 14:18 عصر
و در ضمن یه سوال:
توی Unit1 مربوط به پروژه HueSaturationChanger توی روال SetImage به جای اونهمه اضافه کاری نوشته بودم:
ImageSource.Picture.Bitmap.Assign(aBitmap);

در زمان اجرا از جانب درگاه اشکال زدائیتش ندا اومد که نمی شه یه "TBitmap" رو به یه "TBitmap" اختصاص داد! کسی می دونه چرا؟:متفکر:

تنها کاری که میتوانید انجام دهید این تغییر است :

ImageSource.Picture.Bitmap.SetSize(aBitmap.Width, aBitmap.Height);
ImageSource.Picture.Bitmap.Canvas.Draw(0, 0, aBitmap);

موفق باشید

vcldeveloper
دوشنبه 25 مهر 1390, 14:53 عصر
و در ضمن یه سوال:
توی Unit1 مربوط به پروژه HueSaturationChanger توی روال SetImage به جای اونهمه اضافه کاری نوشته بودم:
1
ImageSource.Picture.Bitmap.Assign(aBitmap);




در زمان اجرا از جانب درگاه اشکال زدائیتش ندا اومد که نمی شه یه "TBitmap" رو به یه "TBitmap" اختصاص داد! کسی می دونه چرا؟
برای اینکه DLL شما و برنامه میزبان شما دارند از مدیر حافظه های جداگانه ایی استفاده می کنند که هر کدام فضای Heap اختصاصی خودشان را دارند، و در نتیجه عملگرهایی مثل is یا as به درستی عمل نمی کنند. در کد Assign هم با استفاده از is نوع پارامتر بررسی میشه، و از اونجایی که TBitmap در DLL با TBitmap در برنامه میزبان یکسان نیستند، این متد به شما خطا برگشت میده.

برای استفاده از نوع های داده اختصاصی دلفی (شامل کلاس ها، اینترفیس ها، آرایه های پویا، و string) باید از مدیر حافظه اشتراکی استفاده بشه، یعنی همون استفاده از ShareMem، یا SimpleShareMem و غیره.

SAASTN
دوشنبه 25 مهر 1390, 20:50 عصر
برای استفاده از نوع های داده اختصاصی دلفی (شامل کلاس ها، اینترفیس ها، آرایه های پویا، و string) باید از مدیر حافظه اشتراکی استفاده بشه، یعنی همون استفاده از ShareMem، یا SimpleShareMem و غیره.
ShareMem رو به پروژه اصلی هم اضافه کردم اما باز هم همون خطا رو دارم.
اساسا این جور استفاده از اشیائ ارسالی بین Exe و DLL چه جور خطراتی می تونه داشته باشه؟ خوب در مورد تابع Assign با توجه به توضیحاتتون بروز اون خطا منطقی هست، اما بقیه متدها و پراپرتی های کلاس ها بدون مشکل کار می کنند، آیا این شرایط ناپایداره و ممکنه به مشکلی بر بخوره؟

بازم دارم از موضوع اصلی فاصله می گیرم.

vcldeveloper
سه شنبه 26 مهر 1390, 00:12 صبح
ShareMem رو به پروژه اصلی هم اضافه کردم اما باز هم همون خطا رو دارم.
نمیدونم که آیا ShareMem در نسخه های جدید دلفی که از FastMM استفاده می کنند هم در این رابطه کارایی داره یا نه، به جاش از SimpleShareMem استفاده کنید. یادتون باشه که باید به هر دو پروژه اضافه بشه. اضافه شدنش به یکی از پروژه ها فایده ایی نداره.


اساسا این جور استفاده از اشیائ ارسالی بین Exe و DLL چه جور خطراتی می تونه داشته باشه؟ خوب در مورد تابع Assign با توجه به توضیحاتتون بروز اون خطا منطقی هست، اما بقیه متدها و پراپرتی های کلاس ها بدون مشکل کار می کنند، آیا این شرایط ناپایداره و ممکنه به مشکلی بر بخوره؟
هر کدی که وابسته به تعیین نوع یک داده در زمان اجرا باشه، میتونه به مشکل بر بخوره؛ چون دو مدیر حافظه دارند از دو مخزن مجزا برای اختصاص حافظه استفاده می کنند، و هیچ کدوم نوع های داده داینامیک اون یکی رو تشخیص نمیده. در همچین مواردی استفاده از BPL بهتر هست.