m-khorsandi
یک شنبه 06 اسفند 1385, 08:23 صبح
درکِ تولد، زندگی و مرگ یک فرم دلفی
دوره زندگی یک فرم دلفی
در ویندوز ، بیشتر عناصر رابط کاربر (User Interface) به صورت "پنجره" وجود دارد. در دلفی ، هر پروژه حداقل یک پنجره دارد؛ پنجره اصلی برنامه. همه پنجرههای برنامههایی که با دلفی نوشته میشوند بر پایه شیئ TForm بنا شدهاند.
Form
شیئ فرم، بلوک اصلی ساختن برنامههای دلفی ست. فرمها property ها ، event ها و متدهای خودشان را دارند و توسط اینها میتوانید ظاهر و رفتار فرمها را کنترل کنید. یک فرم واقعاً یک کامپوننت دلفی هست ، اما متفاوت با سایر کامپوننتها؛ یک فرم در پلت کامپوننتها ظاهر نمیشود.
معمولاً ما برای ساخت یک فرم با new application شروع میکنیم (File | New Application) . به این شکل ، یک فرم جدید ساخته میشود و به عنوان فرم اصلی برنامه شناخته میشود (به صورت پیش فرض) و هم اولین فرمی ست که در زمان اجرای برنامه ساخته میشود.
نکته : برای اضافه کردن فرمهای بیشتر به برنامه میتوانید از File | New Form استفاده کنید.
تولد فرم – Birth
OnCreate
این رویداد فقط و فقط یکبار، زمانی اتفاق میافتد که یک شیئ از TForm در حافظه ساخته میشود . البته بعد از بسته شدن ، اگر حافظه مورد استفاده این فرم از بین برود، در تلاش بعدی برای ساختن فرم، دوباره این رویداد اتفاق میافتد. دستوراتی در فایل پروژه وجود دارد که وظیفهشان ساختن فرم هست (البته این دستورات فقط برای فرمهایی هستند که قرار هست به صورت خودکار ساخته شوند). زمانی که ساختن فرم آغاز میشود اگر ویژگی Visible فرم True باشد، رویدادهای زیر به ترتیب اجرا میشوند :
OnCreate, OnShow, OnActivate, OnPaint
از رویداد OnCreate برای مقداردهی اولیه بعضی عناصر میتوانید استفاده کنید، مثلاً ، مقداردهی لیستهای رشته ای.
هر شیئی که در رویداد OnCreate فرم ساخته میشود باید در رویداد OnDestroy هم آزاد شود.
OnShow
این رویداد مشخص میکند که فرم شروع به نمایش میکند.در حالت عادی رویداد OnShow زمانی اتفاق میافتد که ویژگی Visible فرم True باشد یا به عبارتی فرم قابل مشاهده باشد . این رویداد در ازای هر بار اجرای دستورات Form.Show یا Form.ShowModal اجرا میشود.
نکته : جالب ست بدانید در حالتی که Visible فرم False باشد، اگر دستور Form2.Visible := True را اجرا کنید، باعث نمایش فرم به صورت modaless میشود و رویداد OnShow هم اجرا خواهد شد، پس در چنین وضعیتی دستور Form2.Visible := True برابر ست با Form2.Show .
OnActivate
این رویداد زمانی فراخوانی میشود که فرم مورد نظر در برنامه فعال شود. اگر دو فرم به نامهای Form1 و Form2 داشته باشید که همزمان در دسترس هستند و Form1 فعال باشد، با کلیک روی Form2 ، این رویداد اجرا خواهد شد. ناگفته نماند که بعد از ساختن (Create, OnCreate) و نمایش (Show, OnShow) فرم یکبار این رویداد اجرا خواهد شد. اگر Form2 فعال باشد و روی پنجرهای خارج از برنامه (مثلاً Desktop) کلیک کنید و دوباره روی Form2 کلیک کنید، این رویداد اجرا نخواهد شد، چون از نظر ویندوز، فرم فعال در برنامه ، قبل از فعال کردن برنامه ای دیگر، Form2 بوده ، پس دلیلی ندارد که دوباره این رویداد را فراخوانی کند.
OnPaint و OnResize
رویدادهایی مانند OnPaint و OnResize بعد از ساختن فرم ، همیشه و مکرراً فراخوانی میشوند. برای مثال با تغییر سایز فرم ، رویداد OnResize اجرا خواهد شد.
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint ...
زندگی فرم – Life
زمانی که فرم ساخته شده و کامپوننتهای روی فرم در انتظار عملی از سوی کاربر هستند تا رویدادی اتفاق بیفتد و آن را کنترل کنند، در واقع، برنامه، بدون مشکل، در حال اجراست، تا یک نفر فرم را ببندد. به این دوره (از نمایش فرم تا بستن فرم)، دوره زندگی فرم میگویند.
مرگ فرم – Death
اجرای یک برنامه ویندوز زمانی متوقف میشود که همه فرمهای آن بسته شود (به غیر از سرویسها و ...) و کدی برای اجرا وجود نداشته باشد. اگر بعد از بستن آخرین فرم قابل مشاهده ، هنوز یک فرم مخفی وجود داشته باشد، برنامه خاتمه پیدا میکند چون هیچ فرم قابل مشاهده ایی وجود ندارد.
... OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy
وقتی ما با استفاده از متد Close یا هر روش دیگری (Alt + F4) سعی میکنیم فرمی را ببندیم، رویداد OnCloseQuery فراخوانی میشود. به این معنی که این رویداد جایی ست برای جلوگیری از بسته شدن فرم. ما از این رویداد برای پرسیدن سئوال از کاربر که "آیا مطمئن هستید که میخواهید فرم را ببندید؟" استفاده میکنیم.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean) ;
begin
if MessageDlg('Really close this window?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then
CanClose := False;
end;
این رویداد متغیری به نام CanClose دارد ، که مشخص میکند آیا فرم اجازه بسته شدن دارد یا خیر؟ میتوان این متغیر را با False مقداردهی کرد تا متد Close بینتیجه بماند و فرم بسته نشود.
OnClose
اگر در OnCloseQuery مشخص شد که فرم باید بسته شود، رویداد OnClose فراخوانی میشود. این رویداد آخرین فرصت را برای جلوگیری از بسته شدن فرم به ما میدهد یا اینکه میتوانیم راه دیگری را انتخاب کنیم . در این رویداد پارامتری به نام Action وجود دارد که میتواند شامل یکی از چهار مقدار زیر باشد:
caNone : فرم اجازه بسته شدن ندارد، در واقع این مقدار برابر ست با مقدار False برای متغیر CanClose در رویداد OnCloseQuery.
caHide : قبل از بستن مخفی میشود.
caFree : فرم ، بسته شده و حافظه تخصیص داده شده به آن توسط دلفی آزاد میشود.
caMinimize : فرم ، minimize میشود. این مقدار، پیش فرضی ست برای MDI child form ها.
نکته : موقعیکه کاربر ویندوز را shutdown میکند، رویداد OnCloseQuery فعال میشود و نه OnClose . اگر میخواهید از shutdown شدن ویندوز جلوگیری کنید میتوانید کدتان را در این رویداد بنویسید و البته ، CanClose = False حقهی کارآمدی نیست و از shutdown شدن جلوگیری نخواهد کرد.
نکته : از رویداد OnClose زمانی استفاده کنید که میخواهید حین بسته شدن فرم، فرآیند خاصی انجام و فرم بسته شود. از رویداد OnCloseQuery زمانی استفاده کنید که باید مشخص شود که فرم میتواند بسته شود یا خیر، البته با هر نوع شرطی. از نظر من، نوع استفاده ی OnCloseQuery، از نام این رویداد پیداست : Query و Close .
OnDestroy
بعد از اجرای متد OnClose و در حالیکه فرم بسته شده، رویداد OnDestroy فراخوانی میشود. از این رویداد برای عملی، مخالف با آنچه در رویداد OnCreate انجام دادید استفاده کنید. عموماً از OnDestroy برای آزاد کردن حافظه ی عناصر مرتبط با فرم استفاده میشود. فرض کنید، اشیائی را در زمان اجرا ساخته اید یا بخشی از حافظه را برای انجام عمل خاصی مصرف کردهاید، این رویداد محلی ست برای آزاد کردن حافظه مربوطه.
دوره زندگی یک فرم دلفی
در ویندوز ، بیشتر عناصر رابط کاربر (User Interface) به صورت "پنجره" وجود دارد. در دلفی ، هر پروژه حداقل یک پنجره دارد؛ پنجره اصلی برنامه. همه پنجرههای برنامههایی که با دلفی نوشته میشوند بر پایه شیئ TForm بنا شدهاند.
Form
شیئ فرم، بلوک اصلی ساختن برنامههای دلفی ست. فرمها property ها ، event ها و متدهای خودشان را دارند و توسط اینها میتوانید ظاهر و رفتار فرمها را کنترل کنید. یک فرم واقعاً یک کامپوننت دلفی هست ، اما متفاوت با سایر کامپوننتها؛ یک فرم در پلت کامپوننتها ظاهر نمیشود.
معمولاً ما برای ساخت یک فرم با new application شروع میکنیم (File | New Application) . به این شکل ، یک فرم جدید ساخته میشود و به عنوان فرم اصلی برنامه شناخته میشود (به صورت پیش فرض) و هم اولین فرمی ست که در زمان اجرای برنامه ساخته میشود.
نکته : برای اضافه کردن فرمهای بیشتر به برنامه میتوانید از File | New Form استفاده کنید.
تولد فرم – Birth
OnCreate
این رویداد فقط و فقط یکبار، زمانی اتفاق میافتد که یک شیئ از TForm در حافظه ساخته میشود . البته بعد از بسته شدن ، اگر حافظه مورد استفاده این فرم از بین برود، در تلاش بعدی برای ساختن فرم، دوباره این رویداد اتفاق میافتد. دستوراتی در فایل پروژه وجود دارد که وظیفهشان ساختن فرم هست (البته این دستورات فقط برای فرمهایی هستند که قرار هست به صورت خودکار ساخته شوند). زمانی که ساختن فرم آغاز میشود اگر ویژگی Visible فرم True باشد، رویدادهای زیر به ترتیب اجرا میشوند :
OnCreate, OnShow, OnActivate, OnPaint
از رویداد OnCreate برای مقداردهی اولیه بعضی عناصر میتوانید استفاده کنید، مثلاً ، مقداردهی لیستهای رشته ای.
هر شیئی که در رویداد OnCreate فرم ساخته میشود باید در رویداد OnDestroy هم آزاد شود.
OnShow
این رویداد مشخص میکند که فرم شروع به نمایش میکند.در حالت عادی رویداد OnShow زمانی اتفاق میافتد که ویژگی Visible فرم True باشد یا به عبارتی فرم قابل مشاهده باشد . این رویداد در ازای هر بار اجرای دستورات Form.Show یا Form.ShowModal اجرا میشود.
نکته : جالب ست بدانید در حالتی که Visible فرم False باشد، اگر دستور Form2.Visible := True را اجرا کنید، باعث نمایش فرم به صورت modaless میشود و رویداد OnShow هم اجرا خواهد شد، پس در چنین وضعیتی دستور Form2.Visible := True برابر ست با Form2.Show .
OnActivate
این رویداد زمانی فراخوانی میشود که فرم مورد نظر در برنامه فعال شود. اگر دو فرم به نامهای Form1 و Form2 داشته باشید که همزمان در دسترس هستند و Form1 فعال باشد، با کلیک روی Form2 ، این رویداد اجرا خواهد شد. ناگفته نماند که بعد از ساختن (Create, OnCreate) و نمایش (Show, OnShow) فرم یکبار این رویداد اجرا خواهد شد. اگر Form2 فعال باشد و روی پنجرهای خارج از برنامه (مثلاً Desktop) کلیک کنید و دوباره روی Form2 کلیک کنید، این رویداد اجرا نخواهد شد، چون از نظر ویندوز، فرم فعال در برنامه ، قبل از فعال کردن برنامه ای دیگر، Form2 بوده ، پس دلیلی ندارد که دوباره این رویداد را فراخوانی کند.
OnPaint و OnResize
رویدادهایی مانند OnPaint و OnResize بعد از ساختن فرم ، همیشه و مکرراً فراخوانی میشوند. برای مثال با تغییر سایز فرم ، رویداد OnResize اجرا خواهد شد.
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint ...
زندگی فرم – Life
زمانی که فرم ساخته شده و کامپوننتهای روی فرم در انتظار عملی از سوی کاربر هستند تا رویدادی اتفاق بیفتد و آن را کنترل کنند، در واقع، برنامه، بدون مشکل، در حال اجراست، تا یک نفر فرم را ببندد. به این دوره (از نمایش فرم تا بستن فرم)، دوره زندگی فرم میگویند.
مرگ فرم – Death
اجرای یک برنامه ویندوز زمانی متوقف میشود که همه فرمهای آن بسته شود (به غیر از سرویسها و ...) و کدی برای اجرا وجود نداشته باشد. اگر بعد از بستن آخرین فرم قابل مشاهده ، هنوز یک فرم مخفی وجود داشته باشد، برنامه خاتمه پیدا میکند چون هیچ فرم قابل مشاهده ایی وجود ندارد.
... OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy
وقتی ما با استفاده از متد Close یا هر روش دیگری (Alt + F4) سعی میکنیم فرمی را ببندیم، رویداد OnCloseQuery فراخوانی میشود. به این معنی که این رویداد جایی ست برای جلوگیری از بسته شدن فرم. ما از این رویداد برای پرسیدن سئوال از کاربر که "آیا مطمئن هستید که میخواهید فرم را ببندید؟" استفاده میکنیم.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean) ;
begin
if MessageDlg('Really close this window?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then
CanClose := False;
end;
این رویداد متغیری به نام CanClose دارد ، که مشخص میکند آیا فرم اجازه بسته شدن دارد یا خیر؟ میتوان این متغیر را با False مقداردهی کرد تا متد Close بینتیجه بماند و فرم بسته نشود.
OnClose
اگر در OnCloseQuery مشخص شد که فرم باید بسته شود، رویداد OnClose فراخوانی میشود. این رویداد آخرین فرصت را برای جلوگیری از بسته شدن فرم به ما میدهد یا اینکه میتوانیم راه دیگری را انتخاب کنیم . در این رویداد پارامتری به نام Action وجود دارد که میتواند شامل یکی از چهار مقدار زیر باشد:
caNone : فرم اجازه بسته شدن ندارد، در واقع این مقدار برابر ست با مقدار False برای متغیر CanClose در رویداد OnCloseQuery.
caHide : قبل از بستن مخفی میشود.
caFree : فرم ، بسته شده و حافظه تخصیص داده شده به آن توسط دلفی آزاد میشود.
caMinimize : فرم ، minimize میشود. این مقدار، پیش فرضی ست برای MDI child form ها.
نکته : موقعیکه کاربر ویندوز را shutdown میکند، رویداد OnCloseQuery فعال میشود و نه OnClose . اگر میخواهید از shutdown شدن ویندوز جلوگیری کنید میتوانید کدتان را در این رویداد بنویسید و البته ، CanClose = False حقهی کارآمدی نیست و از shutdown شدن جلوگیری نخواهد کرد.
نکته : از رویداد OnClose زمانی استفاده کنید که میخواهید حین بسته شدن فرم، فرآیند خاصی انجام و فرم بسته شود. از رویداد OnCloseQuery زمانی استفاده کنید که باید مشخص شود که فرم میتواند بسته شود یا خیر، البته با هر نوع شرطی. از نظر من، نوع استفاده ی OnCloseQuery، از نام این رویداد پیداست : Query و Close .
OnDestroy
بعد از اجرای متد OnClose و در حالیکه فرم بسته شده، رویداد OnDestroy فراخوانی میشود. از این رویداد برای عملی، مخالف با آنچه در رویداد OnCreate انجام دادید استفاده کنید. عموماً از OnDestroy برای آزاد کردن حافظه ی عناصر مرتبط با فرم استفاده میشود. فرض کنید، اشیائی را در زمان اجرا ساخته اید یا بخشی از حافظه را برای انجام عمل خاصی مصرف کردهاید، این رویداد محلی ست برای آزاد کردن حافظه مربوطه.