طبق قولی که دادم ساختار حلقه اصلی در دلفی رو می گم البته برای فهمیدم این بحث باید با پاسکال آشنا باشید اگر به آبجکت پاسکال تسلط دارید که دیگه عالیه
البته زیاد توضیح نمیدم چون اگه قرار باشه کامل بگم باید سلسه مراتب وراثت در VCL و سازکار های مدیریتی اون رو هم توضیح بدم که از حوصله این بحث خارجه
قسمت شروع هر برنامه در دلفی این طوریه
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
البته دلفی در ابتدا یه سری توابع دیگه رو فراخوانی می کنه که به اونها کاریی نداریم
آبجکت application یه شی از کلاس TApplication هست که در یونیت forms تعریف شده و VCL اون رو به طور خودکار می سازه دو خط اول مربوط به بار گذاری برنامه است که بهشون کاری نداریم اجرای حلقه الی برنامه از خط Application.Run اتفاق می افتد این متد حلقه اصلی رو تشکیل میده
این متد ابتدا توابع خروج رو بررسی می کنه فرم رو برای نمایش تنظیم می کنه و اگه لازم باشه نمایشش می ده تا به این جا برسه
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
این همون حلقه اصلی هست شرط خروج حلقه زمانی است که فیلد Terminated از این کلاس برابر true شود
درون این حلقه یک بلوک پاسخ گویی به خطا وجود دارد تا از بسته شدن برنام در صورت بروز خطا جلوگیری کند
این نوع بلوک ها مشابه C++ هست در واقع از روی C++ کپی برداری شده پس باید آشنا باشه
شما می بینید که متد handleMessage در هر بار حلقه فراخوانی می شه این متد باعث می شه تا برنامه منتظر پیغام های ویندوز بمونه و اونها رو پردازش کنه
برای اینکار از تابع WaitMessage که از سری توابع windows API هست استفاده می شه فراخوانی این تابع باعث می شه که برنامه در زمانی که پیغامی بهش نرسیده بی جهت از CPU استفاده نکنه
به این صورت این حلقه ادامه پیدا می کنه و برنامه زنده به نظر می رسه
البته زیاد توضیح نمیدم چون اگه قرار باشه کامل بگم باید سلسه مراتب وراثت در VCL و سازکار های مدیریتی اون رو هم توضیح بدم که از حوصله این بحث خارجه
قسمت شروع هر برنامه در دلفی این طوریه
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
آبجکت application یه شی از کلاس TApplication هست که در یونیت forms تعریف شده و VCL اون رو به طور خودکار می سازه دو خط اول مربوط به بار گذاری برنامه است که بهشون کاری نداریم اجرای حلقه الی برنامه از خط Application.Run اتفاق می افتد این متد حلقه اصلی رو تشکیل میده
کد:
procedure TApplication.Run;
begin
FRunning := True;
try
AddExitProc(DoneApplication);
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
end;
if FShowMainForm then
if FMainForm.FWindowState = wsMinimized then
Minimize else
FMainForm.Visible := True;
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;
این متد ابتدا توابع خروج رو بررسی می کنه فرم رو برای نمایش تنظیم می کنه و اگه لازم باشه نمایشش می ده تا به این جا برسه
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
درون این حلقه یک بلوک پاسخ گویی به خطا وجود دارد تا از بسته شدن برنام در صورت بروز خطا جلوگیری کند
این نوع بلوک ها مشابه C++ هست در واقع از روی C++ کپی برداری شده پس باید آشنا باشه
شما می بینید که متد handleMessage در هر بار حلقه فراخوانی می شه این متد باعث می شه تا برنامه منتظر پیغام های ویندوز بمونه و اونها رو پردازش کنه
برای اینکار از تابع WaitMessage که از سری توابع windows API هست استفاده می شه فراخوانی این تابع باعث می شه که برنامه در زمانی که پیغامی بهش نرسیده بی جهت از CPU استفاده نکنه
به این صورت این حلقه ادامه پیدا می کنه و برنامه زنده به نظر می رسه