PDA

View Full Version : كامپايل package هاي دلفي مثل vcl



MToloo
دوشنبه 16 آذر 1388, 09:40 صبح
سلام.
من براي اينكه حجم فايل exe برنامه ام كم بشه، Build with runtime packages رو تيك زدم. اما تغييراتي كه تو سورس يويتهاي دلفي داده بودم - مثل تغييرات تو يونيت dialogs - الان ديگه كار نميكنن. چون الان برنامه از vcl*.bpl استفاده ميكنه كه قبلا همراه با دلفي كپي شده. چطوري ميتونم اين بسته رو دوباره كامپايل كنم؟

vcldeveloper
دوشنبه 16 آذر 1388, 13:05 عصر
فایل پروژه Packageهای استاندارد دلفی به همراه آن منتشر نمیشه که بتونید runtime packageهای استاندارد دلفی را خودتان مجددا کامپایل کنید.

چرا فایل های سورس دلفی را تغییر دادید؟ برای رفع باگ بود، یا اضافه کردن قابلیت های دلخواه؟ اگر برای اضافه کردن قابلیت های دلخواه بود، کار چندان اصولی انجام ندادید، باید این تغییرات با ارث بری کلاس جدید و اعمال تغییرات در کلاس فرزند جدید انجام می دادید، یا از قابلیت Class Helpers استفاده می کردید.

در هر حال، اگر به اون یونیت ها نیاز دارید، باید آنها را تغییر نام بدید، و یک Package جدید خودتان ایجاد کنید، و این یونیت های تغییر یافته را در آن Package جدید اضافه کنید، و از آن Package جدید بجای Package استاندارد دلفی استفاده کنید.

MToloo
سه شنبه 17 آذر 1388, 07:45 صبح
چرا فایل های سورس دلفی را تغییر دادید؟ برای رفع باگ بود، یا اضافه کردن قابلیت های دلخواه؟ اگر برای اضافه کردن قابلیت های دلخواه بود، کار چندان اصولی انجام ندادید، باید این تغییرات با ارث بری کلاس جدید و اعمال تغییرات در کلاس فرزند جدید انجام می دادید، یا از قابلیت Class Helpers استفاده می کردید.

براي رفع باگ بود. اگه BidiMode كل Application رو RightToLeft بكنم، ديالوگهايي كه تو يونيت Dialogs ايجاد ميشن، به هم ميريزن. نوشته متن MessageDlg مياد روي آيكوني كه سمت چپه....



در هر حال، اگر به اون یونیت ها نیاز دارید، باید آنها را تغییر نام بدید، و یک Package جدید خودتان ایجاد کنید، و این یونیت های تغییر یافته را در آن Package جدید اضافه کنید، و از آن Package جدید بجای Package استاندارد دلفی استفاده کنید.
ممنونم از راهنماييتون. ولي نتونستم اين كار و بكنم. ميگه كه Package 'vcl' already contains unit 'Dialogs'.
از طرفي بسته VCL رو هم نميتونم remove كنم چون تو ليست package ها نيست.

Ebrahim Asadi
سه شنبه 17 آذر 1388, 08:12 صبح
سلام
سورس هاي دلفي كه تغيير دادي در فولدري كپي كن و مسير اين فولدر را در Library Path دلفي در ابتداي ليست قرار بده. من از اين روش هم در دلفي 7 و در هم در دلفي 2009 استفاده كرده ام. فقط بايد توجه داشته باشي كه مسير اين فايل ها، اولين مسير در Library Path باشد. در اين صورت دلفي اين فايل ها را كامپايل مي كند و به سراغ فايل هاي اصلي خودش نمي رود.

MToloo
سه شنبه 17 آذر 1388, 12:39 عصر
سلام
سورس هاي دلفي كه تغيير دادي در فولدري كپي كن و مسير اين فولدر را در Library Path دلفي در ابتداي ليست قرار بده. من از اين روش هم در دلفي 7 و در هم در دلفي 2009 استفاده كرده ام. فقط بايد توجه داشته باشي كه مسير اين فايل ها، اولين مسير در Library Path باشد. در اين صورت دلفي اين فايل ها را كامپايل مي كند و به سراغ فايل هاي اصلي خودش نمي رود.

آره درسته. ولي اگه Build with runtime package رو بزنين ديگه از اون يونيتها استفاده نميكنه.

vcldeveloper
سه شنبه 17 آذر 1388, 16:10 عصر
ممنونم از راهنماييتون. ولي نتونستم اين كار و بكنم. ميگه كه Package 'vcl' already contains unit 'Dialogs'.
از طرفي بسته VCL رو هم نميتونم remove كنم چون تو ليست package ها نيست.
نه دیگه! باید تک تک اون یونیت ها را با یک نام جدید ذخیره کنید، و به Package جدید اضافه کنید.

اگر نام این یونیت ها در لیست uses پروژه های شما قبل از نام یونیت اصلی دلفی باشه، با توجه به اینکه هر دو یونیت کلاس ها، و توابع هم نام دارند، دلفی از کلاس ها و توابع یونیت شما به جای یونیت استاندارد خودش استفاده میکنه. البته این راه خیلی هم ساده نیست، چون از نظر دلفی نوع داده های تعریف شده در این دو یونیت یکسان نیستند، پس اگر یک تابع پارامتری از نوع Classes.TStringList نیاز داشته باشه، شما نمی تونید بهش TStringList یونیت خودتون رو ارسال کنید.

یک راه موثر برای تغییر در کلاس های استاندارد دلفی بدون ارث بری یا تغییر سورس یونیت های استاندارد دلفی، استفاده از class helpers در دلفی 2007 و نسخه های بعد از آن هست.


براي رفع باگ بود. اگه BidiMode كل Application رو RightToLeft بكنم، ديالوگهايي كه تو يونيت Dialogs ايجاد ميشن، به هم ميريزن. نوشته متن MessageDlg مياد روي آيكوني كه سمت چپه....
خب، این رو اگه خودتون از اول یک MessageDlg جدید بنویسید، یا از تابع MessageBox سیستم عامل استفاده کنید، دردسرش کمتر از این هست که سورس RTL را تغییر بدید.

MToloo
چهارشنبه 18 آذر 1388, 10:32 صبح
نه دیگه! باید تک تک اون یونیت ها را با یک نام جدید ذخیره کنید، و به Package جدید اضافه کنید.


ممنونم از شما. درست شد. فقط از resourcestring هايي كه استفاده شده خطا ميگرفت:


[DCC Error] E2201 Need imported data reference ($G) to access 'SMsgDlgWarning' from unit 'mtDialogs'


مجبور شدم resourcestring ش و دوباره تو اون يونيت كپي كنم. كار قشنگي به نظر نمياد ولي راه بهتري به ذهنم نرسيد.
حالا اين يونيت و گذاشتم هر كسي خواست استفاده كنه (مال دلفي 2010 البته). اگر هم كسي راه بهتري غير از كپي مجدد resourcestring پيدا كرد كه ممنونش ميشم.

راستي تغييراتي كه تو اين يونيت دادم:
MessageDlg در حالتي كه bidiMode كل application روي bdRightToLeft تنظيم شده باشه، از راست به چپ باز ميشه، تصوير آيكون سمت راست قرارداده ميشه،‌ دكمه ها از سمت راست چيده ميشن، نوشته دكمه ها و عنوان فرم هم فارسي ميشه
InputQuery هم در اين حالت از راست به چپ ميشه ....

فقط كافيه به جاي use كردن Dialogs خود دلفي، اين يونيت use بشه. يا اگه لازمه كه هردوش use بشه، نام Dialogs قبل از نام اين يونيت باشه