M_Maskout
جمعه 12 فروردین 1390, 20:33 عصر
مقدمه
شیئ Application، ویژگیها، متدها و وقفههای جالبی داره که به کمک اونا میشه خیلی از مدیریتها رو روی کل برنامه انجام داد.
مثلاً برای فارسی کردن کیبورد، هرچند میشه از کد زیر استفاده کرد
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
اما همینطور میشه از ویژگی BiDiKeyboard بصورت
Application.BiDiKeyboard := '00000429';
استفاده کرد. یا مثلاً متدهای ProcessMessages و HandleMessage که برای جلوگیری از قفل شدن کنسول برنامه و یا حتی کل ویندوز در زمان اجرای حلقهها بسیار مفیدن.
یکی از کارهایی میشه با شیء Application انجام داد، مدیریت خطاهای کل برنامه توسط متد OnException از این شیئه. اصولاً اینکار (مدیریت خطاها) برای اجرای هر چه روانتر برنامه لازمه و به عقیده من باید انجام بشه. مخصوصاً تو برنامههای فارسی مدیریت خطاهای پیش بینی نشده علاوه بر روانتر شدن محیط کاربری، برنامه رو حرفهایتر و قابل استفادهتر میکنه. به شکل زیر توجه کنید:
68144
".tblTemp: Missing TableName property"؛ شاید حتی دوستان کاملاً حرفهای هم نتونن به درستی تشخیص بدن که این پیام از چه شرایطی نشأت گرفته.
این خطا در زمانی پیش اومده که من میخواستم یه Table رو باز کنم در حالیکه اتصال اون به بانک اطلاعاتی برقرار نشده.
ADOConnection.Connected := False;
tblTemp.Active := True;
پر واضحه که از متن پیام چنین مطلبی برداشت نمیشه. حالا پیام زیر رو در نظر بگیرین
68145
در اینجا علاوه بر اینکه میشه از یه MessageBox کاملاً شخصی استفاده کرد، میتونید پیام مناسب رو به فارسی نشون بدین، حتی با کمی صرف وقت بیشتر و به منظور داشتن کنترل بیشتر میشه نام Tabel، نام یا caption فرمی که خطا در اون اتفاق افتاده و یا خیلی چیزای دیگه رو به کاربر نشون داد.
در نظر بیارین زمانی رو که برنامه رو به یه کاربر تو یه شهر دیگه دادین، بعد یه روز با شما تماس میگیره و پیام اول رو میخونه؛ قطعاً چندتا مشکل رو باید پشت سر بذارین تا بشه یه کم به اون راهنمایی بدین. (کاربر، توان خوندن انکلیسی نداره، کامپیوتر هم بلد نیست، غرورش هم اجازه نمیده از کس دیگهای همونجا کمک بگیره و ...). ولی پیام دوم رو به راحتی میتونه بفهمه، حتی با یه آموزش نیم بند، شاید بتونه مشکلات اینچنینی بعدی رو هم رفع کنه.
دوستانی که با QBasic و همینطور نسخههای حرفهایتر بعدی اون (مثلاً Quick Basic و یا VB6) آشنایی دارن، میدونن که توی این زبان با استفاده از دستور
ON ERROR GOTO line-number
میشه به راحتی خطاهای پیش بینی نشده رو مدیریت کرد. اما دلفی هم ابزارهای بسیار قدرتمندی برای این منظور داره. هرچند به نظر من حتی QBasic هم این کار رو بسیار روانتر انجام میده ولی با داشتن دانش و تسلط کافی روی دلفی، مدیریت خطاها (در کل برنامه) کار خیلی ساده و جذابی خواهد بود.
---------------------------------------------------------------------
برای مدیریت خطاهای پیش بینی نشده در برنامه، لازمه یه روتین برای وقفهی OnException از شیء Application بنویسین و توی اون روتین، خطاهای پیش اومده در کل برنامه رو مدیریت کنین. در اینجا دست شما برای کنترل انواع خطا در زمان رویدار اون باز هست.
مثلاً در وقفه FormCreate از فرم اصلی برنامه دستور
Application.OnException := MyException;
رو قرار بدین بعد هم روتین MyException رو در ادامه به عنوان یکی از متدهای همین فرم تعریف کنین. یه چیزی مثل این:
TfrmMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure MyException(Sender: TObject; E: Exception);
end;
procedure TfrmMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := MyException;
end;
procedure TfrmMainForm.MyException(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;
از پارامتر E برای تشخیص نوع خطا میتونید استفاده کنین. وقتی خطایی در برنامه رخ میده، دلفی یه فرزند از کلاس TObject میسازه و خطای بوجود اومده رو با اون نمایش میده.
با استفاده از پارامتر E و تبدیل اون به کلاس ساخته شدهی توسط دلفی، میشه خطای بوجود اومده رو مدیریت کرد.
در اینجا اگر بجای دستور
ShowMessage(E.Message);
از دستور
ShowMessage(E.Message+' ('+E.ClassName+')');
استفاده بشه، در زمان بروز خطا، عبارت داخل پرانتز در MessageBox نمایش داده شده، نام کلاس خطا نمایش داده میشه.
خطاها یا استثنائات در دلفی چند دسته هستند. که من در اینجا به تعداد از اونا اشاره میکنم و از سایر دوستان خواهش میکنم علاوه بر اعلام اشکالات متن حاضر، مطالب جا افتاده و تکمیلی رو در این تاپیک بیان کنند.
ضمناً در ادامه واژه استثنا معادل خطا به کار رفته و این به دلیل این هست که دلفی از کلمه Exception استفاده میکنه.
استثنائات ریاضی:
استثنائاتی که در زمان عملیات ریاضی بوجود میان. مثل تقسیم بر صفر این استثنائات عبارتند از:
EDivByZero : (علت وقوع) تقسیم یک عدد صحیح بر صفر.
ERangeError : (علت وقوع) عدد مورد نظر از دامنهی تعریف شده خارج است (out of range).
EIntOverflow : (علت وقوع) سرریزی (overflow) در عملیات بر روی عدد صحیح.
EZeroDivide : (علت وقوع) تقسیم یک عدد حقیقی (اعشاری) بر صفر.
استثنائات ورودی / خروجی:
EInOutError : (علت وقوع) اشکال در عملیات I/O.
در این نوع از استثنا میشه بوسیله ویژگی ErrorCode کنترل بیشتری بر روی خطای بوجود آمده انجام داد.
لیست کدهای خطاهای I/O خارج از حوصله این بحثه.
استثنائات پایگاه داده:
EDatabaseError : تمامی خطاهای مربوط به دسترسی به پایگاه داده را پوشش میدهد.
------------------------------------------------------------
برای مطالعه بیشتر به تاپیک زیر سری بزنین:
http://barnamenevis.org/showthread.php?169337-کاربرد-Raise-چیست؟&p=761790&viewfull=1#post761790
شیئ Application، ویژگیها، متدها و وقفههای جالبی داره که به کمک اونا میشه خیلی از مدیریتها رو روی کل برنامه انجام داد.
مثلاً برای فارسی کردن کیبورد، هرچند میشه از کد زیر استفاده کرد
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
اما همینطور میشه از ویژگی BiDiKeyboard بصورت
Application.BiDiKeyboard := '00000429';
استفاده کرد. یا مثلاً متدهای ProcessMessages و HandleMessage که برای جلوگیری از قفل شدن کنسول برنامه و یا حتی کل ویندوز در زمان اجرای حلقهها بسیار مفیدن.
یکی از کارهایی میشه با شیء Application انجام داد، مدیریت خطاهای کل برنامه توسط متد OnException از این شیئه. اصولاً اینکار (مدیریت خطاها) برای اجرای هر چه روانتر برنامه لازمه و به عقیده من باید انجام بشه. مخصوصاً تو برنامههای فارسی مدیریت خطاهای پیش بینی نشده علاوه بر روانتر شدن محیط کاربری، برنامه رو حرفهایتر و قابل استفادهتر میکنه. به شکل زیر توجه کنید:
68144
".tblTemp: Missing TableName property"؛ شاید حتی دوستان کاملاً حرفهای هم نتونن به درستی تشخیص بدن که این پیام از چه شرایطی نشأت گرفته.
این خطا در زمانی پیش اومده که من میخواستم یه Table رو باز کنم در حالیکه اتصال اون به بانک اطلاعاتی برقرار نشده.
ADOConnection.Connected := False;
tblTemp.Active := True;
پر واضحه که از متن پیام چنین مطلبی برداشت نمیشه. حالا پیام زیر رو در نظر بگیرین
68145
در اینجا علاوه بر اینکه میشه از یه MessageBox کاملاً شخصی استفاده کرد، میتونید پیام مناسب رو به فارسی نشون بدین، حتی با کمی صرف وقت بیشتر و به منظور داشتن کنترل بیشتر میشه نام Tabel، نام یا caption فرمی که خطا در اون اتفاق افتاده و یا خیلی چیزای دیگه رو به کاربر نشون داد.
در نظر بیارین زمانی رو که برنامه رو به یه کاربر تو یه شهر دیگه دادین، بعد یه روز با شما تماس میگیره و پیام اول رو میخونه؛ قطعاً چندتا مشکل رو باید پشت سر بذارین تا بشه یه کم به اون راهنمایی بدین. (کاربر، توان خوندن انکلیسی نداره، کامپیوتر هم بلد نیست، غرورش هم اجازه نمیده از کس دیگهای همونجا کمک بگیره و ...). ولی پیام دوم رو به راحتی میتونه بفهمه، حتی با یه آموزش نیم بند، شاید بتونه مشکلات اینچنینی بعدی رو هم رفع کنه.
دوستانی که با QBasic و همینطور نسخههای حرفهایتر بعدی اون (مثلاً Quick Basic و یا VB6) آشنایی دارن، میدونن که توی این زبان با استفاده از دستور
ON ERROR GOTO line-number
میشه به راحتی خطاهای پیش بینی نشده رو مدیریت کرد. اما دلفی هم ابزارهای بسیار قدرتمندی برای این منظور داره. هرچند به نظر من حتی QBasic هم این کار رو بسیار روانتر انجام میده ولی با داشتن دانش و تسلط کافی روی دلفی، مدیریت خطاها (در کل برنامه) کار خیلی ساده و جذابی خواهد بود.
---------------------------------------------------------------------
برای مدیریت خطاهای پیش بینی نشده در برنامه، لازمه یه روتین برای وقفهی OnException از شیء Application بنویسین و توی اون روتین، خطاهای پیش اومده در کل برنامه رو مدیریت کنین. در اینجا دست شما برای کنترل انواع خطا در زمان رویدار اون باز هست.
مثلاً در وقفه FormCreate از فرم اصلی برنامه دستور
Application.OnException := MyException;
رو قرار بدین بعد هم روتین MyException رو در ادامه به عنوان یکی از متدهای همین فرم تعریف کنین. یه چیزی مثل این:
TfrmMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure MyException(Sender: TObject; E: Exception);
end;
procedure TfrmMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := MyException;
end;
procedure TfrmMainForm.MyException(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;
از پارامتر E برای تشخیص نوع خطا میتونید استفاده کنین. وقتی خطایی در برنامه رخ میده، دلفی یه فرزند از کلاس TObject میسازه و خطای بوجود اومده رو با اون نمایش میده.
با استفاده از پارامتر E و تبدیل اون به کلاس ساخته شدهی توسط دلفی، میشه خطای بوجود اومده رو مدیریت کرد.
در اینجا اگر بجای دستور
ShowMessage(E.Message);
از دستور
ShowMessage(E.Message+' ('+E.ClassName+')');
استفاده بشه، در زمان بروز خطا، عبارت داخل پرانتز در MessageBox نمایش داده شده، نام کلاس خطا نمایش داده میشه.
خطاها یا استثنائات در دلفی چند دسته هستند. که من در اینجا به تعداد از اونا اشاره میکنم و از سایر دوستان خواهش میکنم علاوه بر اعلام اشکالات متن حاضر، مطالب جا افتاده و تکمیلی رو در این تاپیک بیان کنند.
ضمناً در ادامه واژه استثنا معادل خطا به کار رفته و این به دلیل این هست که دلفی از کلمه Exception استفاده میکنه.
استثنائات ریاضی:
استثنائاتی که در زمان عملیات ریاضی بوجود میان. مثل تقسیم بر صفر این استثنائات عبارتند از:
EDivByZero : (علت وقوع) تقسیم یک عدد صحیح بر صفر.
ERangeError : (علت وقوع) عدد مورد نظر از دامنهی تعریف شده خارج است (out of range).
EIntOverflow : (علت وقوع) سرریزی (overflow) در عملیات بر روی عدد صحیح.
EZeroDivide : (علت وقوع) تقسیم یک عدد حقیقی (اعشاری) بر صفر.
استثنائات ورودی / خروجی:
EInOutError : (علت وقوع) اشکال در عملیات I/O.
در این نوع از استثنا میشه بوسیله ویژگی ErrorCode کنترل بیشتری بر روی خطای بوجود آمده انجام داد.
لیست کدهای خطاهای I/O خارج از حوصله این بحثه.
استثنائات پایگاه داده:
EDatabaseError : تمامی خطاهای مربوط به دسترسی به پایگاه داده را پوشش میدهد.
------------------------------------------------------------
برای مطالعه بیشتر به تاپیک زیر سری بزنین:
http://barnamenevis.org/showthread.php?169337-کاربرد-Raise-چیست؟&p=761790&viewfull=1#post761790