m-khorsandi
چهارشنبه 25 مهر 1386, 21:25 عصر
Delphi Compiler Version Directives
اگر برنامه و طرحی برای نوشتن کد دلفی دارید که میبایست با نسخههای مختلف کامپایلر دلفی کار کند، باید بدانید که تحت کدام نسخه از کامپایلر دلفی کدتان کامپایل خواهد شد. فرض کنید یک کامپوننت شخصی-تجاری برای خودتان مینویسید. ممکن هست کاربران کامپوننت شما نسخههای متفاوتی از دلفی را داشته باشند و اگر آنها سعی کنند کد کامپوننت را دوباره کامپایل کنند، احتمالاً به دردسر خواهند افتاد. فرضاً اگر شما در یکی از توابع از پارامتری با مقدار پیشفرض استفاده کرده باشید و کاربر، کامپوننت شما را در دلفی3 کامپایل کند، با خطایی متوقف میشود به این دلیل که دلفی 3 پارامتر با مقدار پیشفرض را پشتیبانی نمیکند.
رهنمودهای کامپایلر این امکان را به شما خواهند داد تا بتوانید اطلاعاتی از این قبیل را در زمان کامپایل بدست آورید. رهنمود کامپایلر یک توضیح یا comment با ترکیبی خاص هست. محل قرارگیری رهنمودهای کامپایلر میتواند در هرجایی که یک توضیح یا comment قرار میگیرد باشد. رهنمود کامپایلر با یک علامت $ بعد از بازکردن comment آغاز میشود و بدون فاصله بعد از آن نام رهنمود قرار میگیرد.
{Compiler_Directive_Name$}
کامپایلر دلفی دارای سه نوع رهنمود یا directive هست :
Switch directives – تغییر ویژگی خاصی از کامپایلر که میتواند On یا Off باشد، مانند : $D+ یا $D-، کامپایلر دلفی به صورت معمول اطلاعاتی را جهت رفع مشکل یا Debug برنامه تولید میکند که شامل جدول شمارهی خط برای هر متد هست و این اطلاعات باعث مصرف حافظه و حجیم شدن یونیت میشود(البته تاثیری روی حجم و سرعت فایل اجرایی ندارد).با غیر فعال کردن این ویژگی توسط رهنمود کامپایلر -D$ میتوان از تولید این اطلاعات و صرف زمان برای تولید این اطلاعات جلوگیری کرد.
نمونه، این رهنمود به کامپایلر میگوید که پیغامهای Warning Messages را تولید نکند:
{WARNINGS OFF$}
این رهنمود به کامپایلر میگوید که این بسته فقط برای زمان اجرا یا RunTime کامپایل شود، بستهای که با این رهنمود کامپایل میشود را نمیتوان در IDE دلفی نصب کرد:
{RUNONLY ON$}
Parameter directives – این رهنمودها پارامترهایی را مشخص میکنند که روی کامپایل تاثیر گذارند، مانند سایز حافظه، یا نام فایل.
نمونه، که حداقل و حداکثر سایز Stack را مشخص میکند :
{M 16384,1048576$}
Conditional directives - رهنمودهای شرطی یا Conditional directives به ما اجازه میدهند تا بخش خاصی از کد را که شرط تعیین میکند، کامپایل کنیم.
رهنمود کامپایلر IfDef$ یک بخش کامپایلشدنی شرطی را شروع میکند که این بلوک میتواند به صورت ساده با یک EndIf$ خاتمه یابد یا اینکه در داخل آن از یک Else$ نیز استفاده کرد.
Syntax آن شبیه زیر است :
{$IfDef DefName}
...
{$Else}
...
{$EndIf}
DefName به اصطلاح نماد شرطی را نمایش میدهد. دلفی چندین نماد شرطی استاندارد را تعریف کرده است. در کد بالا اگر DefName تعریف شده باشد، کد بالای Else$ کامپایل خواهد شد.
Delphi Version Symbols
بیشترین استفاده از رهنمود IfDef$ برای تست نسخهی کامپایلر دلفی هست. لیست زیر، نمادهایی از نسخههای مختلف دلفی هست که میتوان برای چک کردن یک نسخهی خاص از آنها استفاده کرد :
List
• VER80 - Delphi 1
• VER90 - Delphi 2
• VER100 - Delphi 3
• VER120 - Delphi 4
• VER130 - Delphi 5
• VER140 - Delphi 6
• VER150 - Delphi 7
• VER160 - Delphi 8
• VER170 - Delphi 2005
• VER180 - Delphi 2006
• VER180 - Delphi 2007
• VER185 - Delphi 2007
• WIN32 - Indicates that the operating environment is the Win32 API.
• LINUX - Indicates that the operating environment is Linux
• MSWINDOWS - Indicates that the operating environment is the MS Windows/li]
• CONSOLE - Indicates that an application is being compiled as a console application
با دانستن نمادهای بالا، امکان نوشتن کدهایی که در تمام نسخههای دلفی کار کنند، وجود دارد.
{$IFDEF VER130}
ShowMessage('Delphi 5!');
{$ELSE}
ShowMessage('Other version of delphi!');
{$ENDIF}
سئوالی را در فروم About Delphi مطرح کردم که چرا بورلند عدد شروع نسخهها در دلفی را از 80 (VER80) شروع کرده و چرا این عدد از 10 شروع نشده است؟ شخصی در جواب گفت حدس میزنم از اعداد قبلی در Turbo Pascal Borland استفاده شده باشد. در تائید حرف این دوست، گاجیک نظرم را به این نکته جلب کرد که در Borland Turbo Pascal 7.0 از VER70 استفاده شده است.
فایل PDF همین مقاله را از لینک زیر دریافت کنید:
اگر برنامه و طرحی برای نوشتن کد دلفی دارید که میبایست با نسخههای مختلف کامپایلر دلفی کار کند، باید بدانید که تحت کدام نسخه از کامپایلر دلفی کدتان کامپایل خواهد شد. فرض کنید یک کامپوننت شخصی-تجاری برای خودتان مینویسید. ممکن هست کاربران کامپوننت شما نسخههای متفاوتی از دلفی را داشته باشند و اگر آنها سعی کنند کد کامپوننت را دوباره کامپایل کنند، احتمالاً به دردسر خواهند افتاد. فرضاً اگر شما در یکی از توابع از پارامتری با مقدار پیشفرض استفاده کرده باشید و کاربر، کامپوننت شما را در دلفی3 کامپایل کند، با خطایی متوقف میشود به این دلیل که دلفی 3 پارامتر با مقدار پیشفرض را پشتیبانی نمیکند.
رهنمودهای کامپایلر این امکان را به شما خواهند داد تا بتوانید اطلاعاتی از این قبیل را در زمان کامپایل بدست آورید. رهنمود کامپایلر یک توضیح یا comment با ترکیبی خاص هست. محل قرارگیری رهنمودهای کامپایلر میتواند در هرجایی که یک توضیح یا comment قرار میگیرد باشد. رهنمود کامپایلر با یک علامت $ بعد از بازکردن comment آغاز میشود و بدون فاصله بعد از آن نام رهنمود قرار میگیرد.
{Compiler_Directive_Name$}
کامپایلر دلفی دارای سه نوع رهنمود یا directive هست :
Switch directives – تغییر ویژگی خاصی از کامپایلر که میتواند On یا Off باشد، مانند : $D+ یا $D-، کامپایلر دلفی به صورت معمول اطلاعاتی را جهت رفع مشکل یا Debug برنامه تولید میکند که شامل جدول شمارهی خط برای هر متد هست و این اطلاعات باعث مصرف حافظه و حجیم شدن یونیت میشود(البته تاثیری روی حجم و سرعت فایل اجرایی ندارد).با غیر فعال کردن این ویژگی توسط رهنمود کامپایلر -D$ میتوان از تولید این اطلاعات و صرف زمان برای تولید این اطلاعات جلوگیری کرد.
نمونه، این رهنمود به کامپایلر میگوید که پیغامهای Warning Messages را تولید نکند:
{WARNINGS OFF$}
این رهنمود به کامپایلر میگوید که این بسته فقط برای زمان اجرا یا RunTime کامپایل شود، بستهای که با این رهنمود کامپایل میشود را نمیتوان در IDE دلفی نصب کرد:
{RUNONLY ON$}
Parameter directives – این رهنمودها پارامترهایی را مشخص میکنند که روی کامپایل تاثیر گذارند، مانند سایز حافظه، یا نام فایل.
نمونه، که حداقل و حداکثر سایز Stack را مشخص میکند :
{M 16384,1048576$}
Conditional directives - رهنمودهای شرطی یا Conditional directives به ما اجازه میدهند تا بخش خاصی از کد را که شرط تعیین میکند، کامپایل کنیم.
رهنمود کامپایلر IfDef$ یک بخش کامپایلشدنی شرطی را شروع میکند که این بلوک میتواند به صورت ساده با یک EndIf$ خاتمه یابد یا اینکه در داخل آن از یک Else$ نیز استفاده کرد.
Syntax آن شبیه زیر است :
{$IfDef DefName}
...
{$Else}
...
{$EndIf}
DefName به اصطلاح نماد شرطی را نمایش میدهد. دلفی چندین نماد شرطی استاندارد را تعریف کرده است. در کد بالا اگر DefName تعریف شده باشد، کد بالای Else$ کامپایل خواهد شد.
Delphi Version Symbols
بیشترین استفاده از رهنمود IfDef$ برای تست نسخهی کامپایلر دلفی هست. لیست زیر، نمادهایی از نسخههای مختلف دلفی هست که میتوان برای چک کردن یک نسخهی خاص از آنها استفاده کرد :
List
• VER80 - Delphi 1
• VER90 - Delphi 2
• VER100 - Delphi 3
• VER120 - Delphi 4
• VER130 - Delphi 5
• VER140 - Delphi 6
• VER150 - Delphi 7
• VER160 - Delphi 8
• VER170 - Delphi 2005
• VER180 - Delphi 2006
• VER180 - Delphi 2007
• VER185 - Delphi 2007
• WIN32 - Indicates that the operating environment is the Win32 API.
• LINUX - Indicates that the operating environment is Linux
• MSWINDOWS - Indicates that the operating environment is the MS Windows/li]
• CONSOLE - Indicates that an application is being compiled as a console application
با دانستن نمادهای بالا، امکان نوشتن کدهایی که در تمام نسخههای دلفی کار کنند، وجود دارد.
{$IFDEF VER130}
ShowMessage('Delphi 5!');
{$ELSE}
ShowMessage('Other version of delphi!');
{$ENDIF}
سئوالی را در فروم About Delphi مطرح کردم که چرا بورلند عدد شروع نسخهها در دلفی را از 80 (VER80) شروع کرده و چرا این عدد از 10 شروع نشده است؟ شخصی در جواب گفت حدس میزنم از اعداد قبلی در Turbo Pascal Borland استفاده شده باشد. در تائید حرف این دوست، گاجیک نظرم را به این نکته جلب کرد که در Borland Turbo Pascal 7.0 از VER70 استفاده شده است.
فایل PDF همین مقاله را از لینک زیر دریافت کنید: