TAHA
10-02-2009, 06:35 AM
):
ویندوز یک سیستم عامل چند وظیفه ای و چند کاربره گرافیکی برای کامپیوتر های شخصی است.
در زمان سیستم عامل Dos کاربران درون یک محیط متنی ساده ، تک کاربره و تک وظیفه ای کارهای خود را انجام می دادند . اما در اواسط دهه 1980 میلادی نیازهای جدیدی پیدا شد از قبیل امکان اجرای چند برنامه همزمان ، امکان دسترسی چند کاربر ، رابط کاربری زیباتر ، مدیریت کامل بر منابع و غیره. اینگونه بود که سیستم عامل Windows متولد شد.
سیستم عامل Windows به تمام نیازهای فوق پاسخ داد اما محدودیت هایی نیز بوجود آورد مخصوصا برای برنامه نویسان سیستمی.
در محیط Dos شما مجاز به استفاده از تمام قسمت های حافظه بودید. اما در Windows چنین چیزی نیست زیرا نمی توان به بخشهایی از حافظه که متعلق به برنامه دیگری است دسترسی داشت حتی نمی توان آنها را خواند. و یا استفاده از فضای حافظه مجازی تحت نظر سیستم فایل است که اجازه هیچ گونه دسترسی مستقیم به Hard Disk را به ما نمی دهد. مورد بسیار مهم دیگر این است که در Dos برنامه نویس می بایست خودش با Port ها ارتباط برقرار کند اما در Windows چنین اجازه ای ندارد. و موارد بسیار زیاد دیگر(مخصوصا در ارتباط با سخت افزار).
اما اینها هیچ کدام ضعف نیست بلکه نشان دهنده قدرت Windows است که اجازه نمی دهد برنامه ها در کارهای یکدیگر دخالت کنند . با وجود این دست برنامه نویس هم برای انجام کارهای مورد نیاز بسته نیست بلکه همان ویندوزی که تمام کارها را بدست می گیرد همان نیز امکاناتی را به برنامه نویس می دهد تا بتواند برنامه سیستمی بنویسد . این امکانات API (Application Programming Interface)نامیده می شوند . در واقع API یکسری توابع استاندارد است که شرکت Microsoft داخل یکسری فایل DLL برای برنامه نویسی سیستمی قرار داده است و بیش از 1000 تابع و رویه (Procedure) می باشد.
API را اصطلاحا قلب ویندوز می نامند ، هر کاری که در این سیستم عامل انجام می شود API است یعنی خود این سیستم عامل هم برای بسیاری از اعمال خویش نیز از آن استفاده می کند. زبانهای برنامه نویسی که تحت Windows کار می کنند (مثل Delphi) از API استفاده می نمایند . مثلا اگر یک متغیر تعریف کنید یک API بصورت خودکار اجرا شده و مقدار حافظه مورد نیاز را به برنامه شما اختصاص می دهد.
پس به زبانی می توان ادعا کرد که Windows مجموعه ای از توابع API است و می توان گفت که نه تنها این سیستم عامل ما را محدود نکرده است بلکه کار ما را ساده نموده است. مثلا اگر در Dos مجبور بودیم برای Save یک فایل ، کلی برنامه نویسی کنیم وهمه چیز را در نظر بگیریم که مثلا مبادا اطلاعاتمان روی اطلاعات دیگری Overwrite شود ، در Windows کافی است یک API را فراخوانی کنید و به همین سادگی Window تمام کارهای مربوطه را انجام می دهد.
در این Topic باز هم از API و نحوه کارکردن با آن ، DLL ها ، Message ها ، DC ها و غیره در چند روز آینده صحبت خواهد شد.
امروز برای نمونه دو سه تا از API های ساده و کارآمد را معرفی می کنیم. البته قبل از آن این مطلب را بگویم که Delphi استفاده از توابع API را ساده کرده است و ما حداکثر با Use کردن یک فایل از آنها استفاده می کنیم.
1- رویه ( Procedure ) Sleep:
با استفاده از این رویه در اجرای برنامه می توان وقفه ای ایجاد کرد.
شکل کلی این رویه به صورت زیر است. كد:
کد:
Procedure Sleep(dwMilliseconds:DWord);
همانطور که پیدا است این رویه یک ورودی از جنس DWord می گیرد. این ورودی عددی است که زمان توقف را بر حسب میلی ثانیه مشخص می کند(مثلا عدد 1000 معرف یک ثانیه است).
مثال:کد زیر مقدار Progress یک ProgressBar را از 0 تا 100 درصد در طول 10 ثانیه زیاد می کند. كد:
کد:
var
i:Byte;
begin
i:=0;
while i<100 do
begin
i:=i+10;
ProgressBar1.Position:=i;
Sleep(1000);
end;
end;
2- تابع CopyFile:
یک فایل را از محلی به محلی دیگر کپی می کند.
شکل کلی این تابع به صورت زیر است. كد:
کد:
Function CopyFile (lpExistingFilename, lpNewFilename:PChar, bFailIfExists:BOOL):BOOL;
پارامتر lpExistingFilename یک String(در حقیقت PChar که نوعی رشته است) است که مسیر و نام فایل مبدا را مشخص می کند.
پارامتر lpNewFilename یک String(در حقیقت PChar که نوعی رشته است) است که مسیر و نام فایل مقصد را مشخص می کند. دقت کنید که نام فایل مقصد نیز باید قید شود و معمولا برابر با نام فایل مبدا گرفته می شود.
پارامتر bFailIfExists یک مقدار منطقی(Boolean) است که اگر فایل در مقصد وجود داشت چه کاری انجام شود. اگر True بود و فایل مقصد قبلا موجود باشد کار تابع نیمه تمام می ماند و اگر False باشد روی فایل اول Overwrite می گردد.
خروجی تابع منطقی است و اگر کارش به درستی انجام شود، True و در غیر این صورت False است.
مثال:خط زیر یک فایل را از درایو C داخل درایو D کپی می کند و اگر فایل در مقصد وجود داشته باشد آنرا Overwrite می کند. كد:
کد:
CopyFile('C:\Chortke.jpg','D:\Chortke.jpg',False);
3- تابع GetDriveType :
این تابع نوع هر یک از درایوهای سیستم را مشخص می کند انواعی از قبیل فلاپی ، دیسک سخت ، CDROM و غیره.
شکل کلی این تابع به صورت زیر است. كد:
کد:
Function GetDriveType(lpRootPathName:PChar): LongWord;
پارامتر lpRootPathName یک رشته است و نام درایو مورد نظر را مشخص می کند مثل "C:\".
خروجی این تابع یک عدد است که می تواند مقادیر زیر باشد.
DRIVE_UNKNOWN: درایوی که معرفی شده است قابل دسترسی نمی باشد. برابر با عدد 0 می باشد.
DRIVE_NO_ROOT_DIR: درایوی که معرفی شده است وجود ندارد. برابر با عدد 1 می باشد.
DRIVE_REMOVABLE: برابر با مقدار عددی 2 می باشد و مشخص می کند که دیسک درایو مورد نظر از نوع قابل حمل می باشد.
DRIVE_FIXED: برابر با مقدار عددی 3 می باشد ومشخص می کند که درایو مورد نظر از نوع ثابت است.
DRIVE_REMOTE: برابر با مقدار عددی 4 می باشد و مشخص می کند که درایو مورد نظر از نوع درایوشبکه می باشد.
DRIVE_CDROM: برابر با مقدار عددی 5 می باشد و مشخص می کند که درایو مورد نظر از نوع CD_Drive می باشد.
DRIVE_RAMDISK: برابر با مقدار عددی 6 بوده و مشخص می کند درایو مورد نظر از نوع درایو های ساخته شده در RAM می باشد.
مثال: خط زیر مشخص کننده نوع درایو C می باشد. كد:
کد:
if GetDriveType('C:\') = DRIVE_FIXED then
ShowMessage ('It is a hard drive Partition');
یک مثال با سه تابع فوق ساخته ام که می توانید بوسیله لینک زیر آنرا همراه Source Code اش DownLoad کنید.
.: RightClick -> دانلود -> api_delphi_test1.rar :. (http://rightclick.ir/downloads/Api_Delphi_Test1_rar)
--------------------------------------------------------------------------------------
سالک: سورس بالا را دانلود کنید و نتیجه اجرا و کدها را ببینید.
حالا من کمی شرح می دهم. داریم از توابع api استفاده می کنیم که در بالا گفته شد چی هستند و اما شرح دیگر قسمتهای سورس.
در تب Dialogs در جعبه ابزار ابزاری به نام OpenDialog داریم که به مااجازه انتخاب فایل می دهد.
با نگاهی به پروژه می بینیم که دو فرم دارد. بعد اینکه کاربر فایل را انتخاب کرد با دستور :
کد:
Form2.ShowModal;
فرم دوم نمایان می شود. در سورس فوق برای دیدن فرم دوم از پروجکت منیجر استفاده کنید. این پنجره را از منوی ویو روشن کنید اگر روشن نیست.ابزاری روی این فرم هست به نام ShellTreeView . که با آن مسیر paste فایل مشخص میشه.
نکات کد نویسی:
کد:
i:=0;
while i<100 do
begin
i:=i+10;
ProgressBar1.Position:=i;
Sleep(1000);
end;
در کد بالا یک حلقه while داریم که قبلش متغیری را برابر صفر گرفته و تا این متغیر به 100 نرسیده آن را ده تا ده تا اضافه کرده. و این متغیر را در صفت پوزیشن پروگرس بار ریخته. و همین طور از تابع Sleep استفاده شده داخل حلقه.
همچنین در کد زیر:
کد:
if Edit1.Text<>'' then
begin
DRV:=Edit1.Text+':\';
Case GetDriveType(pchar(DRV)) of
DRIVE_UNKNOWN:STR:='This Drive is not accessible.';
DRIVE_NO_ROOT_DIR:STR:='This is not a real drive.';
DRIVE_REMOVABLE:STR:='It is Removable Drive'+#13+'Like Floppy Drive.';
DRIVE_FIXED:STR:='It is a hard drive Partition.';
DRIVE_REMOTE:STR:='It is a network drive.';
DRIVE_CDROM:STR:='It is CD_ROM Drive.';
DRIVE_RAMDISK:STR:='It is RAM Drive.';
end;
end
else
begin
STR:='Please Enter a Character into edit.';
Edit1.SetFocus;
end;
اولا شرط if را می بینیم که اگر داخل Edit1 خالی نباشد یعنی <> (نامساوی) دو تا کوتیشن به هم چسبیده یعنی خالی.
وقتی خالی نباشد آن Edit یا دستور Case حالات مختلفGetDriveType(pchar(DRV)) بررسی می شود و با هر حالت مقداری به STR داده می شود.
و در ادامه کد یعنی در این خط:
کد:
ShowMessage(STR);
یک کادر دیالوگی(یک پنجره کوچک) حاوی همان STR نمایان می شود.
بقیه سورس را خودتان تجزیه تحلیل کنید. از شل-تری – ویو مسیر گرفه شده و باز با دستورات if و case واکنشهای مختلفی به کاربر نشان داده شده وقتی که فایلی هم نام در مسیر مقصد موجود بوده و الی آخر.
ویندوز یک سیستم عامل چند وظیفه ای و چند کاربره گرافیکی برای کامپیوتر های شخصی است.
در زمان سیستم عامل Dos کاربران درون یک محیط متنی ساده ، تک کاربره و تک وظیفه ای کارهای خود را انجام می دادند . اما در اواسط دهه 1980 میلادی نیازهای جدیدی پیدا شد از قبیل امکان اجرای چند برنامه همزمان ، امکان دسترسی چند کاربر ، رابط کاربری زیباتر ، مدیریت کامل بر منابع و غیره. اینگونه بود که سیستم عامل Windows متولد شد.
سیستم عامل Windows به تمام نیازهای فوق پاسخ داد اما محدودیت هایی نیز بوجود آورد مخصوصا برای برنامه نویسان سیستمی.
در محیط Dos شما مجاز به استفاده از تمام قسمت های حافظه بودید. اما در Windows چنین چیزی نیست زیرا نمی توان به بخشهایی از حافظه که متعلق به برنامه دیگری است دسترسی داشت حتی نمی توان آنها را خواند. و یا استفاده از فضای حافظه مجازی تحت نظر سیستم فایل است که اجازه هیچ گونه دسترسی مستقیم به Hard Disk را به ما نمی دهد. مورد بسیار مهم دیگر این است که در Dos برنامه نویس می بایست خودش با Port ها ارتباط برقرار کند اما در Windows چنین اجازه ای ندارد. و موارد بسیار زیاد دیگر(مخصوصا در ارتباط با سخت افزار).
اما اینها هیچ کدام ضعف نیست بلکه نشان دهنده قدرت Windows است که اجازه نمی دهد برنامه ها در کارهای یکدیگر دخالت کنند . با وجود این دست برنامه نویس هم برای انجام کارهای مورد نیاز بسته نیست بلکه همان ویندوزی که تمام کارها را بدست می گیرد همان نیز امکاناتی را به برنامه نویس می دهد تا بتواند برنامه سیستمی بنویسد . این امکانات API (Application Programming Interface)نامیده می شوند . در واقع API یکسری توابع استاندارد است که شرکت Microsoft داخل یکسری فایل DLL برای برنامه نویسی سیستمی قرار داده است و بیش از 1000 تابع و رویه (Procedure) می باشد.
API را اصطلاحا قلب ویندوز می نامند ، هر کاری که در این سیستم عامل انجام می شود API است یعنی خود این سیستم عامل هم برای بسیاری از اعمال خویش نیز از آن استفاده می کند. زبانهای برنامه نویسی که تحت Windows کار می کنند (مثل Delphi) از API استفاده می نمایند . مثلا اگر یک متغیر تعریف کنید یک API بصورت خودکار اجرا شده و مقدار حافظه مورد نیاز را به برنامه شما اختصاص می دهد.
پس به زبانی می توان ادعا کرد که Windows مجموعه ای از توابع API است و می توان گفت که نه تنها این سیستم عامل ما را محدود نکرده است بلکه کار ما را ساده نموده است. مثلا اگر در Dos مجبور بودیم برای Save یک فایل ، کلی برنامه نویسی کنیم وهمه چیز را در نظر بگیریم که مثلا مبادا اطلاعاتمان روی اطلاعات دیگری Overwrite شود ، در Windows کافی است یک API را فراخوانی کنید و به همین سادگی Window تمام کارهای مربوطه را انجام می دهد.
در این Topic باز هم از API و نحوه کارکردن با آن ، DLL ها ، Message ها ، DC ها و غیره در چند روز آینده صحبت خواهد شد.
امروز برای نمونه دو سه تا از API های ساده و کارآمد را معرفی می کنیم. البته قبل از آن این مطلب را بگویم که Delphi استفاده از توابع API را ساده کرده است و ما حداکثر با Use کردن یک فایل از آنها استفاده می کنیم.
1- رویه ( Procedure ) Sleep:
با استفاده از این رویه در اجرای برنامه می توان وقفه ای ایجاد کرد.
شکل کلی این رویه به صورت زیر است. كد:
کد:
Procedure Sleep(dwMilliseconds:DWord);
همانطور که پیدا است این رویه یک ورودی از جنس DWord می گیرد. این ورودی عددی است که زمان توقف را بر حسب میلی ثانیه مشخص می کند(مثلا عدد 1000 معرف یک ثانیه است).
مثال:کد زیر مقدار Progress یک ProgressBar را از 0 تا 100 درصد در طول 10 ثانیه زیاد می کند. كد:
کد:
var
i:Byte;
begin
i:=0;
while i<100 do
begin
i:=i+10;
ProgressBar1.Position:=i;
Sleep(1000);
end;
end;
2- تابع CopyFile:
یک فایل را از محلی به محلی دیگر کپی می کند.
شکل کلی این تابع به صورت زیر است. كد:
کد:
Function CopyFile (lpExistingFilename, lpNewFilename:PChar, bFailIfExists:BOOL):BOOL;
پارامتر lpExistingFilename یک String(در حقیقت PChar که نوعی رشته است) است که مسیر و نام فایل مبدا را مشخص می کند.
پارامتر lpNewFilename یک String(در حقیقت PChar که نوعی رشته است) است که مسیر و نام فایل مقصد را مشخص می کند. دقت کنید که نام فایل مقصد نیز باید قید شود و معمولا برابر با نام فایل مبدا گرفته می شود.
پارامتر bFailIfExists یک مقدار منطقی(Boolean) است که اگر فایل در مقصد وجود داشت چه کاری انجام شود. اگر True بود و فایل مقصد قبلا موجود باشد کار تابع نیمه تمام می ماند و اگر False باشد روی فایل اول Overwrite می گردد.
خروجی تابع منطقی است و اگر کارش به درستی انجام شود، True و در غیر این صورت False است.
مثال:خط زیر یک فایل را از درایو C داخل درایو D کپی می کند و اگر فایل در مقصد وجود داشته باشد آنرا Overwrite می کند. كد:
کد:
CopyFile('C:\Chortke.jpg','D:\Chortke.jpg',False);
3- تابع GetDriveType :
این تابع نوع هر یک از درایوهای سیستم را مشخص می کند انواعی از قبیل فلاپی ، دیسک سخت ، CDROM و غیره.
شکل کلی این تابع به صورت زیر است. كد:
کد:
Function GetDriveType(lpRootPathName:PChar): LongWord;
پارامتر lpRootPathName یک رشته است و نام درایو مورد نظر را مشخص می کند مثل "C:\".
خروجی این تابع یک عدد است که می تواند مقادیر زیر باشد.
DRIVE_UNKNOWN: درایوی که معرفی شده است قابل دسترسی نمی باشد. برابر با عدد 0 می باشد.
DRIVE_NO_ROOT_DIR: درایوی که معرفی شده است وجود ندارد. برابر با عدد 1 می باشد.
DRIVE_REMOVABLE: برابر با مقدار عددی 2 می باشد و مشخص می کند که دیسک درایو مورد نظر از نوع قابل حمل می باشد.
DRIVE_FIXED: برابر با مقدار عددی 3 می باشد ومشخص می کند که درایو مورد نظر از نوع ثابت است.
DRIVE_REMOTE: برابر با مقدار عددی 4 می باشد و مشخص می کند که درایو مورد نظر از نوع درایوشبکه می باشد.
DRIVE_CDROM: برابر با مقدار عددی 5 می باشد و مشخص می کند که درایو مورد نظر از نوع CD_Drive می باشد.
DRIVE_RAMDISK: برابر با مقدار عددی 6 بوده و مشخص می کند درایو مورد نظر از نوع درایو های ساخته شده در RAM می باشد.
مثال: خط زیر مشخص کننده نوع درایو C می باشد. كد:
کد:
if GetDriveType('C:\') = DRIVE_FIXED then
ShowMessage ('It is a hard drive Partition');
یک مثال با سه تابع فوق ساخته ام که می توانید بوسیله لینک زیر آنرا همراه Source Code اش DownLoad کنید.
.: RightClick -> دانلود -> api_delphi_test1.rar :. (http://rightclick.ir/downloads/Api_Delphi_Test1_rar)
--------------------------------------------------------------------------------------
سالک: سورس بالا را دانلود کنید و نتیجه اجرا و کدها را ببینید.
حالا من کمی شرح می دهم. داریم از توابع api استفاده می کنیم که در بالا گفته شد چی هستند و اما شرح دیگر قسمتهای سورس.
در تب Dialogs در جعبه ابزار ابزاری به نام OpenDialog داریم که به مااجازه انتخاب فایل می دهد.
با نگاهی به پروژه می بینیم که دو فرم دارد. بعد اینکه کاربر فایل را انتخاب کرد با دستور :
کد:
Form2.ShowModal;
فرم دوم نمایان می شود. در سورس فوق برای دیدن فرم دوم از پروجکت منیجر استفاده کنید. این پنجره را از منوی ویو روشن کنید اگر روشن نیست.ابزاری روی این فرم هست به نام ShellTreeView . که با آن مسیر paste فایل مشخص میشه.
نکات کد نویسی:
کد:
i:=0;
while i<100 do
begin
i:=i+10;
ProgressBar1.Position:=i;
Sleep(1000);
end;
در کد بالا یک حلقه while داریم که قبلش متغیری را برابر صفر گرفته و تا این متغیر به 100 نرسیده آن را ده تا ده تا اضافه کرده. و این متغیر را در صفت پوزیشن پروگرس بار ریخته. و همین طور از تابع Sleep استفاده شده داخل حلقه.
همچنین در کد زیر:
کد:
if Edit1.Text<>'' then
begin
DRV:=Edit1.Text+':\';
Case GetDriveType(pchar(DRV)) of
DRIVE_UNKNOWN:STR:='This Drive is not accessible.';
DRIVE_NO_ROOT_DIR:STR:='This is not a real drive.';
DRIVE_REMOVABLE:STR:='It is Removable Drive'+#13+'Like Floppy Drive.';
DRIVE_FIXED:STR:='It is a hard drive Partition.';
DRIVE_REMOTE:STR:='It is a network drive.';
DRIVE_CDROM:STR:='It is CD_ROM Drive.';
DRIVE_RAMDISK:STR:='It is RAM Drive.';
end;
end
else
begin
STR:='Please Enter a Character into edit.';
Edit1.SetFocus;
end;
اولا شرط if را می بینیم که اگر داخل Edit1 خالی نباشد یعنی <> (نامساوی) دو تا کوتیشن به هم چسبیده یعنی خالی.
وقتی خالی نباشد آن Edit یا دستور Case حالات مختلفGetDriveType(pchar(DRV)) بررسی می شود و با هر حالت مقداری به STR داده می شود.
و در ادامه کد یعنی در این خط:
کد:
ShowMessage(STR);
یک کادر دیالوگی(یک پنجره کوچک) حاوی همان STR نمایان می شود.
بقیه سورس را خودتان تجزیه تحلیل کنید. از شل-تری – ویو مسیر گرفه شده و باز با دستورات if و case واکنشهای مختلفی به کاربر نشان داده شده وقتی که فایلی هم نام در مسیر مقصد موجود بوده و الی آخر.