دانلود ‫پروژه دلفی

Word 175 KB 18372 40
مشخص نشده مشخص نشده کامپیوتر - IT
قیمت قدیم:۲۴,۰۰۰ تومان
قیمت: ۱۹,۸۰۰ تومان
دانلود فایل
  • بخشی از محتوا
  • وضعیت فهرست و منابع
  • از زمانی که کامپیوترها وارد زندگی انسانها شده اند به طور پیوسته پیشرفته تر و انعطاف پذیر می شوند.

    آنها از محاسبات پیچیده گرفته تا کنترل دستگاه های پیچیده را انجام می دهند.

    یکی از ملزومات این اعمال قابلیت کامپیوتر در مبادله اطلاعات با دنیای خارج از خود است .

    یکی راه های این ملزوم پورت ها هستند که در بسیاری از کامپیوترهای کنونی به همین منظور تعبیه شده اند .

    ولی برای استفاده از این امکانات نیاز به ابزارهای نرم افزاری نیز است.
    در این پروژه ی نرم افزاری سعی شده است یک ابزار در محیط برنامه نویسی دلفی(Delphi) تهیه شود تا برنامه نویسی برای استفاده از پورت ها را ساده تر وبا سرعت تر کند.

    به همین منظور در ابتدا توضیحاتی در مورد نوشتن کلاس ها و اجزاء ساخت در دلفی وبعد توضیحاتی در مورد این جزء ساخت ذکر شود.












    تجرید داده ها و برنامه نویسی شیء گرا:
    از انجا که دلفی یک زبان شیء گرا ست و برنامه نویسی با آن مستلزم یک درکی هر چند اندک از این نوع برنامه نویسی را لازم میسازد به همین منظور در این قسمت به توضیحی مختصر در این مورد پرداخته ایم .
    تجرید داده ها به منظور توجه روی اشیاء داده ای مورد نیاز برنامه وعملیات روی اشیاء و عد¬¬¬¬¬¬¬¬¬¬م توجه به چگونگی نمایش وذخیره اشیاء
    داده ای در حافظه به وجود امد که نمایندگان ان که ابتدا زبانهایی چون C++, Turbo Pascal و بعداً با پیشرفت سیستم عامل ها و زبان های برنامه نویسی همچون زبانهایVC++, Delphi می باشد این روش به برنامه نویس اجازه میدهد قبل از پرداختن و بررسی جزئیا ت سازماندهی واقعی ان در حافظه و قبل از پیاده سازی انها بتوانند از اشیاء در برنامهها خود استفاده کند.استفاده از تجرید دادهها منتهی به مجموعه ای از واحد برنامه هایی با قابلیت استفاده مجدد می شود که میتواند پایه و اساس برای طراحی وتولید نرم افزارهای بعدی باشد.
    در بنامه نویسی شیگرا برنامه به واحد هایی به نام کلاس تقسیم میشود که هر یک دارای اشیاء داده ای مخصوص به خود و همچنین عملگرهای دستکاری این داده ها را دارا می یاشد وفقط از ان عملگرها میتوان برای دستیابی داده ها در خارج داده ها استفاده کرد و در حقیقت هر یک از این کلاسها وظایفی بر عهده دارند که باید به انجام برسانند به این خاطر کلاسها دارای مشخصه ها ی دستیابی متعددی هستند که هر یک محدودیتی را برای این داده ها به وجود می اورند.


    یکی دیگر از امکانات این نوع برنامه نویسی ارث بری میباشد که موجب می شود یک کلاس فرزند کلاس دیگری باشد و بدون برناه نویسی دوباره از امخکانات کلاس والد خود استفاده کند وبا افزودن امکانات ان را گسترش دهد.

    دلفی و برنامه نویسی شئ گرا :
    دلفی ابزارتولید سریع برنامه های کاربردی است که بر اساس ابجکت پاسکال یک زبان شئ گرا با ویژگیهای کامل تهیه شده است و به این خاطر معماری دلفی یک معماری شئ گرا ست و کلاس ریشه آن TObjectاست .

    تمام کلاسها در دلفی این کلا س را به عنوان کلاس ریشه دارند .

    آنچه که دانستن ارث بری را بیشترلازم میکندهمین موضوع است زیرا در دلفی نوشتن کلاس پایه وجود ندارد ودر حقیقت نوشتن هر نوع کلاس ، نوعی ارث بری و افزودن امکانات بیشتر است .

    دلفی کلاسهایی دارد که هر کدام برای کاربرد مخصوص به کار میرود مانند TComponent برای تولید اجزاء ساخت و Twin control برای تولید اجزاء ساختی دارای Handelدیگر نیازی به نوشتن این کلاس ها در ریشه نیست واین خود قابلیت دلفی را افزایش میدهد.




    ساختارکلاس و نحوه ى تعریف آن:
    کلا سها حاوی داده ها یا فیلدها و عملگرهاى دستیابی یا متدها هستند و کلاس در حقیقت همان اشیائی هستند که می خواهیم دربرنامه باشد.

    کلاسها در قسمت unit interfaceها معرفی میشوند و متدهای آن در قسمت Implementation پیاده سازی میشود این متدها هستند که نحوهء عملکرد برروی داده های کلاس را مشخص میکند.

    برای تعریف کلاس ابتدا بایداطلاعاتی را که میخواهیم درباره ی شیء در کلاس ذخیره شود را مشخص می کنیم وسپس اطلاعاتی که باید در بیرون از کلاس دیده شود را مشخص می کنیم در آخر متدهایی که باید روی این داده ها عمل کنند را پیاده سازی می کنیم.

    برای داده ها ومتدها مشخصه های دستیابی بوجود آمده اند تا کار پنهان سازی اطلاعات را آسان سازند که این مشخصه ها در دلفی به چهار مشخصه تقسیم میشوند:private , Public Protected, published
    مشخصه private:
    تعاریف داده ومتدی که در این بخش آورده شوند مختص این کلاس بوده و در داخل آن می توان از آنها استفاده کرد و دستیابی به آنها خارج از کلاس به طور مستقیم امکان پذیر نیست
    مشخصه public:
    در این مشخصه از همهجا می توان داده ها ومتدهای تعریف شده را استفاده کرد .

    در حقیقیت رابط بین بخش خصوصی ومحیط بیرون از کلاس این بخش است .برنامه نویس باید با استفاده از مشخصه های دیگر امکان دستیابی به داده هایی را بدهد که واقعا لازم است.
    مشخصه:published
    رفتار این مشخصه همانند مشخصه public است ولی در مورد اجزاء ساخت آنهم زمانی که لازم باشد داده های به هنگام طراحی مقدار دهی شوند، به کار می رود.تمامی داده های تعریف شده در این بخش در Object inspector نشان داده خواهند شد.
    مشخصه protected :
    با نمونه ای از یک شیء نمی توان به داده ها ومتدهای تعریف شده در این بخش دستیابی داشت .اما اگر زیر کلاس جدیدی تعریف گردد در آن صورت همان اعضای محافظت شده مستقیماً توسط کلاس جدید قابل دستیابی است.اگر نظر بر این است که دستیابی کاربر کلاس رابه داده ها یا متد ها را محدود کنیم ودر عین حال امکان امکان دستیابی به داده ها یا گسترش متدهای آن را برای برنامه نویسان دیگر فراهم کنیم ،آنها را در این بخش می آوریم.
    در نوشتن کلاس ها باید چند نکته را بخاطر داشت:
    1- محدوده ی شناخت داده ها و رویه ها را تا جایی که ممکن است محدود کنیم تا دستیابی به همان اندازه ای باشد که لازم است.
    2- حدالامکان از دستیابی private در کلاس ها استفاده کنیم .همه چیز باید خصوصی باشد مگر اینکه دلیلی بر خصوصی نبودن وجود داشته باشد.
    حدالامکان از دستیابی private در کلاس ها استفاده کنیم .همه چیز باید خصوصی باشد مگر اینکه دلیلی بر خصوصی نبودن وجود داشته باشد.

    داده ها باید همیشه خصوصی باشند ودستیابی به آنها باید از طریق خصوصیات امکان پذیر باشد.

    خصوصیات (properties): خصوصیات برای کاربر کلاس همان داده ها هستند ولی برای برنامه نویس کلاس قابلیتهای جدیدی برای هوشمند ساختن داده ها افزوده است .خصوصیات شکل مربوط به حفظ سادگی داده ها را حفظ می کنند ودر عین حال کاربرد امن داده های خصوصی را که از طریق متد های عمومی مورد استفاده قرار می گیرند،فراهم می سازد.ودر یک جمله برای دستیابی داده های خصوصی به کار می روند.

    شیوه تعریف خصوصیات به صورت زیر است: Property variublename:datatype read fieldname write fieldname; کلمه property به همان صورت نوشته می شود variablename نام خصوصیت است که برای دستیابی به فیلد مورد استفاده قرار می گیرد.datatype نوع داده ای خصوصیت را مشخص می کند read و write امکان دستیابی به فیلدها را برقرار می سازند .زمانی که مقداری در خصوصیت جایگزین می کنیم در حقیقت فیلدی که در مقابل write قرار دارد را مقداردهی می کنیم و زمانی که مقدار خصوصیت را مورد دستیابی قرار می دهیم در واقع مقدار فیلدی که در مقابل read آمده است را مورد دستیابی قرار میدهیم.

    نکته ای که قابلیت خصوصیات را افزایش می دهد ای است که توابع و رویه ها نیز در صورتی که با نوع خصوصیات سازگار باشند می توان به جای فیلد ها استفاده کرد.این قابلیت موجب می شود که اطلاعاتی که نیاز به پردازش به هنگام خواندن یا نوشتن در خصوصیات است ، امکان پذیر باشد.در این مواقع در مقابل read یک تابع با خروجی سازگار باخصوصیت نوشته می شود ودر مقابل write یک رویه با ورودی سازگار با خصوصیت نوشته می شود.دلفی به هنگام خواندن خصوصیت تابع را اجرا می کند وبه هنگام مقدار دهی مقدار وارد شده را آرگومان رویه قرار داده وآن را اجرا می کند.

    این گونه توابع و رویه ها ویژگیهایی دارند: اوٌل اینکه در بخش خصوصی کلاس تعریف می شوند که در حقیقت هدف ازبوجود آمدن خصوصیات نیز همین بوده تا جزئیات را مخفی کند و کاربر کلاس را از بکار بردن متدها برای مقدار دهی برهاند مثلا بجای بکار بردن setcolor و getcolorمقداری را در خصوصیت color قرار می دهد ویا از آن می خواند.دوم اینکه برای نام گذاری آنها قراردادی است که شرکت Borland برای سادگی وضع کرده است بدین صورت که ابتدای نام توابعی که در خصوصیات به کار می روند Get نوشته می شود و به همین صورت در اوٌل رویه ها Set نوشته می شود.

    وبالاخره اینکه اگر خصوصیات در قسمت Published معرفی شوند در Object inspector نشان داده می شوند و قابل دستیابی هستند که موجب می شود که توابع آنها نیز اجرا گردد.

    در این صورت اگر نیازی به اجرای برخی از دستورات آنها نیست باید تمهیدات آن را در داخل توابع و رویه قرار داد.

    علاوه بر معرفی محدوده های دستیابی وخصوصیات چند مطلب مهم دیگر نیز در مورد کلاس ها وجود دارد و آنها اینکه هر کلاس باید متدی برای ایجاد یک نمونه ازآن شیء وجود داشته باشد که آن را constructor می نامند.

    متدی که constructor است باید آن نمونه شیء را در حافظه ایجاد کند ومقدار اوٌلیه دهد.یک متد دیگر برای از بین بردن آن نمونه شیء لازم است که آن را destructor می نامند و کار آن از بین بردن و آزاد سازی فضای حافظه ی کلاس است.همچنین کلاس ها باید به پیام های ویندوز پاسخ دهند یا به آن پیام بفرستند.

    همانطور که قبلاًََ ذکر شد ریشه ی کلاس ها در دلفی Tobject است که یکی از دلایل این اجبار وجود این سه متد پایه ر کلاس Tobject است و بنابراین تضمین می کند که کلاس های دلفی رفتار واقعی کلاس های پایه را دارا هستند .علاوه بر این دو متد بسیار مهم دیگر نیز در Tobject طراحی شده اند .

    متد free که با زبان اسمبلی نوشته شده ویک متد بسیار قابل اطمینان برای آزاد سازی شیء است.این متد حتی در صورتی که شیء nil باشد نیز کار خود را به درستی انجام می دهد.متد دیگر Dispatch است که برای پیام رسانی بهتر ا بداع شده است .

    پیام های ویندوز مخصوص شیء های دارای Handle مانند list box و button هاست ولی در دلفی به خاطر همین متد همه ی کلاس ها می توانند آنها را دریافت کنند.

    وراثت: وراثت مفهومی است که قابلیت برنامه نویسی شیء گرا را افزایش می دهد وآن عبارت است از تعریف یک زیر کلاس که قابلیت های کلاس والد خود را داراست و میتواند قابلیت های جدیدی نیز اظافه کند ودر حقیقت قابلیت های آن را گسترش دهد.برای تعریف یک زیر کلاس به صورت زیر باید عمل کرد: New_Class=class(Parent_Class) البته برای نام کلاس نیز قرار دادی وجود دارد وآن حرف T می باشد که در اول نام هرکلاس می آید.

    چند مفهوم برای زیر کلاس وجود دارد که درباره ی نحوه ی تعریف متدها در کلاس ها و تاثیر آن در زیر کلاس هاست.

    یکی متد های مجازی است که بیشتر در کلاس های رده بالا تعریف می شوند و دومی متد های دینامیکی .

    متد هایی که به این دو صورت تعریف گردند قابل تغییر در زیر کلاس ها هستند ومثالی از آن متد Destroy موجود در کلاس Tobject است که به صورت مجازی تعریف شده .

    تفاوت این دو در این است که متد های مجازی برای سرعت بهینه می شوند در صورتی که متد های دینامیکی برای اندازه مورد نیاز بهینه می شوند.

    زمانی که دایرکتیوی برای متد تعیین نکنیم آن متد ایستا نامیده می شود.

    متد ایستا را نمی توان تغییر داد ومثال آن متد create موجود در Tobject است که به صورت ایستا تعریف شده ونمی توان آن را تغییر داد ولی می توان چندین constructor داشت مانند create(Aowner:Tcomponent) موجود در Tcomponent که به صورت مجازی تعریف شده است.

    برای تغییر یا اصلاح رفتار متدهای مجازی و دینامیکی باید آنها را Override کرد .

    یک مثال خوب از این مورد Wincontrol ها هستند که همه آنها زیر کلاس Twincontrol اند و متد paint را دارا هستند که به پیام WM_PAINT پاسخ میدهد ولی تمام wincontrol ها شکل های متفاوتی دارند پس باید این متد را برای هر کدام از آنها Override کرد تا برای هر کدام رفتار متناسبی داشته باشند.

    ممکن است رویه ای که یک متد با آن override میشودرفتار مورد نظر در زیر کلاس را کاملا تغییر دهد ولی گاهی هم لازم است که رویه همان رفتار را به اضافه ی رفتار دیگر از خود نشان دهد که با فراخوانی متد inherited در داخل متد override شده این نیز امکان پذیر می باشد.

    مفهوم دیگر در مورد وراثت کلاس های انتزاعی (Abstract)است .

    هر کلاسی که یک متد با دایرکتیو virtual و سپس Abstract را داشته باشد یک کلاس انتزاعی است.متد های انتزاعی مجازی برای تعریف کلاس هایی به کار می روند که نمونه ای از آن شیئ ایجاد نمی شوند بلکه رابطه هایی را برای زیر کلاس ها تعریف می کنند.

    این متدها فقط تعریف می شوند وپیاده سازی آنها در زیر کلاس ها انجام می شود.

    به عنوان مثال کلاس Tstrings یک کلاس انتزاعی است و فقط برای ارتباط شیء های چون Tstringlist به کار می رود.

    بررسی اجمالی چند کلاس کلیدی : کلاس Multithreading: دلفی یک کلاس انتزاعی به نام Tthread دارد که با ایجاد زیر کلاس های لازم می توان قابلیت Multithreading را به برنامه افزود .

    در این کلای متد Execute به صورت انتزاعی تعریف شده وباید آن را Override کرده وپیاده سازی کرد.

    هنگام اجرای thread متد execute اجرا خواهد شد.

    زمانی که چندین کار باید در پس زمینه اجرا شوند این کلاس بسیار مفید است.

    کلاس Tpersistent: این کلاس به صورت انتزاعی تعریف شده وهیچ نمونه ای از آن ایجاد نمی شود .

    عملی که tpersistent انجام می دهد این است که رابطی را تعریف می کند تا تصٌور قابلیت تخصیص ، شناسایی و مالکیت را برای شیء ها به وجود آورد عملکرد عمده آن همین است.این کلاس برای تمام زیر کلاس ها مشخص می کند تا خود را با یک نام قابل شناسایی کنند اینکه کلاس می تواند مالک داشته باشد یعنی یک شیء دیگر میتوان با شیء Tpersistent ارتباط داشته باشد.

    کلاس Tcomponent: این کلاس مستقیماً از Tpersistent مشتق شده است DefineProperties, GetOwner ودو خصوصیت topوleft در این کلاس پیاده سازی شده است.

    این کلاس برای پیاده سازی اجزاء ساخت بکار می رود برای اینکار باید زیر کلاسی از آن را پیاده سازی کرد.

    تمام اجزاء ساخت موجود در VCL زیر کلاسی از این کلاس به شمار می روند.

    کلاس TControl: بیشتر اجزاء ساخت موجود در VCL غیر ویژوال (non visual) هستند این بدین معناست که در زمان طراحی می توان آنها را رویت ومدیریت کرد اما در زمان طراحی قابل رویت نیستند.

    Tcontrol مستقیماً از TComponent مشتق شده است نمونه های این کلاس اشیائی هستند که در زمان اجرا می توان آنها را رویت کرد.

    کلاس Tcontrol ویژگیهایی دارد که برای کنترل شمای ظاهری و رفتارشیء کنترلی ویژال می توان آنها را در زمان اجرا وطراحی مدیریت نمود.

    خصوصیاتی که برای کنترل شمای ظاهری می باشند عبارتند از Cursor,top,left,hiegth,Weidth .

    شیء های کنترلی ناحیه ای ازصحفه نمایش که شیء در آن قرار دارد را کنترل می کنند.

    کلاس TWinControl: TWinControl زیر کلاسی از TControl است این شیء های کنترلی دارای Handle بوده و بنابراین میتوانند ورودیهایی از سیستم عامل دریافت کنند .

    معماری ویندوز به گونه ای است که فقط شیء های کنترلی دارای Handle می توانند از آن ورودی دریافت کنند معماری دلفی این امکان را می دهد تا پیامها به شیء های کنترلی فاقد handle فیلتر شوند.

    کلاس :TApplication این کلاس مستقیماً از TComponent مشتق شده است .

    تمام برنامه های دلفی در یک شیء TApplication که دارای Handle (آدرس) اصلی برنامه است،جای می گیرد.

    ویندوز با استفاده از این Handle می تئاند پیام ها را به برنامه کاربردی ارسال کند .

    تنها شیء Application مورد نیاز برنامه به طور خودکار ایجاد می شود.

    شیوه ی نوشتن اجزاء ساخت : اجزاء ساخت در دلفی کلاس هستند و تمام خصوصیات مربوط به کلاس ها را دارا می باشند انها از Tcomponent مشتق می شوند.

    این شیء ها باید یک نام داشته باشند که تمهیدات آن به کلاس TPersistentگنجانده شده ، آنها بعد از نصب باید از طریق Object inspector قابل کنترل باشند و احتمالاً دارای رویدادهایی نیز هستند.

    برای نوشتن انها باید ابتدا انتظاراتمان و کارهایی را که باید انجام دهند را مشخص کنیم و سپس از یک سطح لازم شروع به ارث بری از کلاس های والد کنیم مثلاٌ برای نوشتن یک Edit box که داده ی ورودی و خروجی آن از نوع Number است بهتر است که از Tcostumedit زیرکلاس بوجود اورده و آن را گسترش دهیم تا اینکه به سراغ TComponent برویم.

    برنامه نویسی تحت ویندوز: شیوه ی عملکرد سیستم عامل ویندوز بر تمام برنامه های تحت ویندوز تحمیل می شود.وجود برخی از موارد پایه در تمام این برنامه ها ضروری است.ویندوز یک سیستم عامل مبتنی بر پیام(message base) است که عملکردش بر اساس رویداد هاست.

    از این رو تمام برنامه های تحت ویندوز علاوه بر ضرورت داشتن رویه ها و داده ها لازم است شیوه ی پاسخ گویی به پیام هایی که در پاسخ به یک رویداد به ویندوز ارسال یا ازجانب آن ارسال می شود را بدانند.

    یک مورد دیگر معمولا در برنامه های ویندوز وجود دارد .

    همانگونه که از نام این برنامه ها پیداست ، باید دارای پنجره باشند یعنی رابط گرافیکی کاربر(GUI).

    ویندوز دارای توابع کتابخانه ای زیادی است که در فایلهایی با انشعاب DLL قرار دارند.

    هر برنامه ای می تواند از این توابع استفاده کند که دلفی از آنها به خوبی استفاده می کند.برای استفاده از آنها در دلفی باید آنها را تعریف نمود.

    به عنوان مثال تابع SendMessage در به صورت زیر در یونیت Windows.pas تعریف شده است: Function SendMessage;external 'user32.dll' name 'SendMessageA'; عبارت external نشان دهنده ی نام کتابخانه ی حاوی تابع است وname نشان دهنده ی نام تابع مورد نظر در کتابخانه است.چون دلفی این کتابخانه را تعریف کرده تنها کار برای استفاده فراخوانی آن است.

    دلفی تقریباً تمام توابع کتابخانه ای ویندوز (API) را در چند یونیت تعریف کرده که عمده آنها در یونیت windows.pas قرار دارد.

    شیوه تعریف رویداد ها: رویداد ها در دلفی خصوصیت هستند ولی نوع داده ای آنها از نوع داده های رویه ای است داده های رویه ای همان اشاره گر به رویه هاست ونحوه تعریف آن به صورت زیر است: TPrucedure_type=procedure (arguments); حال اگر یک متغیر از نوع TProcedure_type تعریف کنیم می توانیم آدرس رویه ای که سازگار با آن است را در آن قرار دهیم.

    این نوع رویه ها در خارج از کلاس ها نیز می توانند تعریف شوند ولی رویداد ها مخصوص کلاس ها هستند به همین منظور تعریف نوع داده ای رویه مخصوص رویدادها به شکل زیر است: TEvent_type=procedure (arguments) of Object; عبارت آخر نشان دهنده این است که متغیری از این نوع باید عضو یک کلاس باشد.

    پس از تعریف مغیر به عنوان فیلد برای کلاس ، باید خصوصیت آن را نیز تعریف کنیم.

    ولی در این مورد نیز قراردادی وجود دارد وآن اینکه اوٌل نام این خصوصیات با ید On باشد.

    به عنوان مثال برای فیلدی به نام FEvent از نوع TEvent_Type باید نوشت: Property onEvent : read FEvent write FEvent; حال اگر این تعریف در قسمت Published صورت گیرد پس از نصب این رویداد در قسمت رویدادهای Object inspector که با دو بار کلیک کردن بر روی آن می توان روتین پاسخگویی به آن را نوشت.از اینجا به بعد اگر عبارت onEvent(arguments) را فرا بخوانیم این رویداد اجرا می شود .

    این نحوه فراخوانی در متد های پاسخگویی به پیام ها انجام می گیرد مثلاً وقتی ویندوز یک پیام WM_CLICKED را به یک Tcontrol می فرستد متد WMclicked اجرا می شود این متد پس از رفتارهای مناسب ، در جایی مناسب رویه ی onclick(sender) را فرا می خواند تا دستورات کاربر کلاس اجرا شود.

    البته رویداد ها منحصراً پاسخگویی به پیامهای ویندوز نمی باشد و این امکان وجود دارد که بتوانیم خود رویدادهایی را تولید کنیم که ویندوز به انها پیام نمی فرستد.

    برای اصلاح یا تغییر روتین های پاسخگویی به پیام ها باید آنها را دوباره در زیر کلاس تعریف کرد این متدها آرگومانی از نوع Tmessageدارندو نام انها با برداشتن "-" از بین نام پیام تشکیل شده است مثلاٌ برای پیام WM_MOUSEMOVE داریم: Precudur wmmousemove(var massage:Tmassage); massage wm _mousemove; پس از نوشتن اجزاء ساخت باید ان را نصب نمود که با تابع Registorcomcomess انجام می شود که یک Package برای ان ایجاد می کند و سپس کامپایل و نصب می کند و این جزء ساخت در اپلت مورد نظری که در تابع مشخص است قرار می گیرد و می تواند روی فرم یا هر جزء ساختی که زیر کلاس Tcomponent است قرار گیرد.

    طراحی یک جزء ساخت برای کنترل پورت COM: این جزء ساخت باید در مقابل داده های ورودی از پورت عکس العمل نشان دهد وهمچنین بتواند داده های مورد نظر کاربر کلاس را از طریق پورت COM به خارج انتقال دهد.اهمیت کار در این است که هر چه کامپیوتر ها با محیط بیرون بیشتر ارتباط داشته باشند ، استفاده ی بهینه تری از آنها می شود.

    این جزء ساخت به کاربران کلاس کمک می کند تا برنامه های خود را برای انتقال اطلاعات از طریق پورت COM آماده سازند بدون اینکه به جزئیات پی ببرند.

    پورت COM و چگونگی دستیابی به آن: پورت COM مخفف Communication Port می باشد که در هر کامپیوتری تعدادی از آنها وجود دارد این پورت از نوع سریال است یعنی بیت ها از طریق یک خط وپشت سر هم وارد یا خارج می شوند.

    در بسیاری ازکامپیوتر ها این پورت ها به وسیله serial mouse, modem مورد استفاده قرار می گیرد.

    ولی از آنجایی که ای پورت ها اجزاء سخت افزاری هستند ، دراختیار سیستم عامل بوده و برای استفاده از آنها را از سیستم عامل درخواست نمود.

    در ویندوز نیز وضع به این صورت است و برای این کار چندین تابع کتابخانه ای وجود دارد که در دلفی در یونت Windows.pas تعریف شده اند.

    توالی کار برای کنترل پورت COM : برای کنترل پورت COM توالی مشخصی وجود دارد به این صورت که ابتدا باید آنرا از سیستم عامل درخواست کرد درصورتی که این کار امکان پذیر باشد باید تنظیماتی از قبیل اندازه ی بافرها و سرعت انتقال را تعیین کرد وبعد از آن آماده خواندن و نوشتن است.

    برای باز کردن ، خواندن و نوشتن ویندوز با پورت های COM به صورت فایل برخورد می کند چنانکه برای باز کردن از ساختار زیر استفاده می شود: Createfile('COM PORT NAME',GENERIC_READ or GENERIC_WRITE,0,NIL,OPEN_EXIISTING,FILE_ATRIBUTE_NORMAL,0); این ساختار پورتی که نام آن مشخص شده را در صورت وجود برای خواندن و نوشتن بازمی کند .

    نوع برگشتی آن آدرس این جزء سخت افزاری است که در یک THandle قرار می گیرد اگر این درخواست مورد قبول واقع نشود می توان با چک کردن آن به صورت زیر از عدم قبول درخواست اطلاع یافت: IF Comhandle=INVALID_HANDLE_VALUE THEN حال اگر درخواست مرد قبول واقع شود با استفاده از این Handle می توان پورت را کنترل کرد.

    برای فرستادن اطلاعات به پورت از تابع زیر استفاده می شود: Writefile(Handle , DataToSend , count , Writen ,NIL); این تابع اطلاعاتی که مبدا آن DataToSend است را به تعداد Count بایت به پورت می فرستد وتعداد بایت هایی که به درستی فرستاده شده اند را در متغیر Writen برمی گرداند .

    خروجی این تابع از نوع Boolean است که در صورت عدم خطا True خواهد بود .

    برای خواندن از پورت COM باید به صورت زیر عمل کرد: ReadFile(Handle , Buffer , Sizeof(Buffer) , BytesRead , NIL); این تابع اطلاعات را از پورت دریافت ودر متغیر Buffer قرار می دهد میزان اطلاعات مرد انتظار در آرگومان سوٌم مشخص می شود و تعداد بایت هایی که واقعاً دریافت می شود در متغیر BytesRead برگردانده می شود .

    این تابع نیز در صورتی که خطایی رخ ندهد مقدار True را برمی گرداند.

    ولی پورت های COM تنظیماتی نیز دارند که بخشی از آنها در ساختاری به نام DCB قرار می گیرد.

    DCB در دلفی به صورت یک رکورد تعریف شده که هرکدام از فیلدهای آن دارای یک تنظیم برای پورت هستند مثلا سرعت انتقال اطلاعات و بیت توازن وچند مورد دیگر که البته همه آنها به صورت پیش فرض به هنگام باز کردن پورت تنظیم می شوند که برای کسب اطلاع از آنها باید تابع GetCommState(Handle , DCB) را به کار برد .

    برای تغییر آنها نیز تنظیمات را باید در یک ساختار DCB ذخیره کرده وسپس از طریق تابع SetCommState(Handle , DCB) آنها را در پورت فعال کرد.

    بیشتر مواقع لازم نیست همه ی تنظیمات را تغییر دهیم که در این صورت بهتر است ابتدا با فراخوانی تابع getcommstate وضعیت پورت را در یک ساختار DCB ثبت کنیم وبعد از آن تنظیمات مورد نظر را در ساختار DCB تغییر داده ودر خاتمه از طریق تابع setcommstate آنها را فعال کنیم.

    تنظیمات دیگری که برای پورت وجود دارد ، اندازه ی بافر ورودی و خروجی است که میتوان با تابع SetupComm(Handle , ReadBufferSize,WriteBu) آنها را تعیین کرد.

    پورت های COM رویداد هایی نیز دارند ولی برای این ریدادها پیامی به برنامه ارسال نمی شود(به یاد داشته باشیم که ویندوز فقط به WinControl ها پیام ارسال می کند) برای استفاده از این رویدادها باید با تابع SetCommask(Handle , Event_Mask) آنها را تعیین کنیم این تابع رویدادهای پورت را به ریدادهای مشخص شده فیلتر می کند.

    در این جا نیز شاید لازم باشد که رویدادهای فعلی پورت را بدست آوریم که از طریق تابع GetCommask(Handle , Event_mask_variuble) امکان پذیر می باشد .

    حال برای اطلاع از اینکه رویدادی رخ داده است تابع زیر را فرا می خوانیم :WaitCommEvent(Handle , Event,Nil) این تابع منتظر وقوع یک رویداد از رویدادهای تنظیم شده می ماند وهنگام رخداد یکی از آنها ثابت آن را در متغیر Event بر می گرداند .

    برای ایجاد رویداد ها برای کنترل پورت از همین تابع استفاده می کنیم بدین صورت که این تابع را فراخوانی می کنیم سپس با اعمال شرایط رویداد اتفاق افتاده را مشخص مکنیم و روتین پاسخگویی به آن را فرا خوانی می کنیم.

    ولی از آنجا که برنامه باید همیشه از رویدادهای رخ داده مطلع باشد، باید این تابع را در یک حلقه قرار دهیم مشکل اینجاست که هنگام اجرای این تابع برنامه هیچ عمل I/O نباید انجام دهد.

    و همین جاست که مفهوم Multithreading برای این جزء ساخت لازم می شود.

    جزئیات جزء ساخت Tcomcontroler : از انجا که جزء ساخت باید پورت comرا کنترل کند اسم ان به صورت Ccontoreler انتخاب شده است و از دو بخش تشکیل شده است یک بخش که تولید کننده رویدادها ست که در اینجا فقط یک رویداد مد نظر بوده و دیگری بخش اصلی که عمیاتی چون باز کردن و تنظیم کردن را انجام میدهد برای کنترل بهتر پورتها سه نوع ترتیبی و یک نوع رویه ای تعریف شده است .

    هر کدام از انها بطوری که از نامشان پیداست اطلاعاتی در خود دارد TComRate سرعت انتقال اطلاعات ، TComDevice نام پورت مورد نظر و TComParity نوع بیت توازن را مشخص می کند .

    نوع رویه ای نیز برای رویداد رسیدن اطلاعات به کامپیوتر مورد استفاده قرار می گیرد.

    TComRate=(ComRate_110,ComRate_300,ComRate_600,ComRate_1200,ComRate_2400,ComRate_4800,ComRate_9600,ComRate_14400,ComRate_19200,ComRate_38400,ComRate_56000,ComRate_57600,ComRate_115200,ComRate_128000,ComRate_25600); /////////////////////////////////////////////////////////////////////////////////////////////// TComDevice=(COM1,COM2,COM3,COM4); TComParity=(NO,ODD,EVEN,MARK,SPACE); TReciveData=procedure(DataRecived:char) of object; TComThread: چون این جزء ساخت نمی تواند از یک نخ استفاده کند بهمین جهت یک نخ دیگری را ایجاد نموده ایم تا از وقوع رویدادهای پورت آگاهی یابیم و این کار بر روی سرعت برنامه تاثیر زیادی نداشته باشد.

    به همین منظور زیر کلاسی از TThread ایجاد و متد Execute را Override می کنیم و در درون آن حلقه ای قرار می دهیم که تا برنامه اتمام نیافته است پورت را چک کند.

    در اینجا Constructor جدیدی نیز تعریف شده تا اطمینان داشته باشیم کهHandle ناصحیح در اختیار نداریم.

    فیلدهای این کلاس بسیار کم ودر حد دو فیلد است یک فیلد از نوع THandle که برای کار با پورت لازم است ودیگری فیلدی از نوع رویه که به هنگام وقوع رویداد فراخوانی می شود .

    TComThread=class(TThread) private FDevice:THandle; public FReciveData:TReciveData; Constructor create(handel:THandle;createSuspended:Boolean); procedure execute;override; end; حال برای پیاده سازی Constructor باید ابتدا متد inherited را فراخواند تا دستورات لازم برای ایجاد یک نمونه از TThread را اجرا کند وسپس FDevice را مقدار دهی کرد.

    این Constructor زمانی که پورت باز می شود فراخوانی خواهد شد تا این TThread ایجاد شود.گ constructor TComThread.create(handel:THandle;createsuspended:Boolean); begin inherited create(createSuspended); FDevice:=handel; end; متد Execute متن اصلی Thread را در بر دارد زمانی که Thread اجرا می شود در واقع همین متد در حال اجراست .

    روال کار چنین است که حلقه ای وجود دارد که منتظر است رویداد اتفاق افتد پس از اتفاق روتین پاسخگویی به آن فرخوانده می شود.

    فیلد رویه ای در خارج از این کلاس ودر کلاس اصلی مقدار دهی می شوند تا آدرس روتین پاسخگویی در آن قرار گیرد .

    این روتین، داده ای که از طریق پورت دریافت شده را نیز به عنوان آرگومان دریافت می کند.

    procedure TComThread.execute; var Event:THandle; RecivedData:Char; CountRecived:Cardinal; begin if Assigned(FReciveData) then begin while not Terminated do begin if WaitCommEvent(FDevice,Event,nil) then begin if Event=EV_RXCHAR then begin If ReadFile(FDevice,RecivedData,1,CountRecived,nil) then begin if CountRecived=1 then FReciveData(RecivedData); end; end; end; end; end; TComControler: این کلاس متن اصلی جزء ساخت وهمین طور به کار گیرنده TComThread می باشد .

    در این کلاس باید امکاناتی چون تنظیم ، بازکردن و فرستادن اطلاعات به پورت وجود داشته باشد .

    در پیاده سازی آن یک خصوصیت برای تعیین نام پورت ویک خصوصیت از نوع Boolean برای تعیین اتصال یا عدم اتصال به پورت استفاده شده است .

    زمانی که اتصال تعیین می گردد متد open فراخوانی می شود تا پورت تعیین شده باز گردد وآدرس آن در فیلد خصوصی قرار گیرد .

    property connect:Boolean read FConnected write setconnect; /// procedure TComControler.setconnect(value:Boolean); begin if (csDesigning in Componentstate) then begin FConnected:=value; exit; end; if value then begin if (not FConnected) then begin FConnected:=open; end else begin close; FConnected:=open; end end else begin close; FConnected:=False; end; end; هنگام باز کردن پورت در صورتی که با موفقیت انجام شود فیلد FcomThread مقدار دهی می شود ولی قبل از اجرای آن باید داده ی رویه ای آن نیز مقدار دهی شود.

    بعد از باز کردن وتنظیم، پورت آماده نوشتن است دو متد برای این کار در نظر گرفته شده که یکی برای فرستادن رشته ودیگری برای فرستادن کاراکتر است هر دو متد با استفاده از فیلد آدرس پورت (FHandle) این کار را انجام می دهند.

    در فرستادن رشته ، رشته ای که باید فرستاده شود به عنوان آرگومان دریافت می شود وبا استفاده از تابع WriteFile به اتمام می رسد.

    در صورتی که انتقال به طور کامل انجام شد مقدارTrue برگردانده می شود.

    function TComControler.Writestring(DataToSend:String):Boolean; var writen:DWORD; begin result:=WriteFile(FHandel,DataToSend[1],length(DataToSend),writen,nil); end; حال در هنگام تنظیم بافر های ورودی وخروجی در صورتی که پورت قبلا باز شده باشد از طریق تابع setupcom آنرا انجام می دهیم در غیر این صورت فقط مقدار فیلد را در متغیر خود قرار می دهد .

  • مقدمه
    برنامه نویسی شیء گرا
    تجرید داده ای و برنامه نویسی شیء گرا
    دلفی و برنامه نویسی شیء گرا
    ساختار کلاس و نحوه ی تعریف آن
    خصوصیات
    وراثت
    بررسی چند کلاس کلید
    شیوه نوشتن اجزاء ساخت
    برنامه نویسی تحت ویندوز
    شیوه تعریف رویداد ها
    طراحی جزء ساختی برای کنترل پورت COM
    پورت COM وچگونگی دستیابی به آن
    توالی کار برای کنترل پورت COM
    جزئیات جزء ساخت TComControler
    کلاس TComThread
    کلاس TComControler
    نحوه ی نصب و استفاده از TComControler
    پیوست
    منابع

دلفي RAD است ! ممکن است همچون يک نوجوان هياهوانگيز به نظر آيم، اما لازم است که منظور کاربران دلفي از RAD بسيار فراتر از اين است که دلفي يک محصول بزرگ است. واژه جديد RAD ازکلمات Rapid Application Development گرفته شده است. RAD واژه جديدي است که براي

در اينجا لازم به ذکر است برخي ويژگي هاي نرم افزار را بررسي کنيم . مدتها پيش برنامه نويسان از زبانهاي ساده مثل بيسيک يا پيچيده چون اسمبل استفاده مي کردند . اما turbo pascal با داشتن کامپايلر قوي توانست جاي خود را در برنامه ها تثبيت کند و به خوبي جلوه

مقدمه ای بر برنامه نویسی شی گراء در دات نت برنامه نویسی شی گراء، بدون شک مهمترین تحول در دنیای نرم افزار طی سالیان گذشته بوده که بیشترین تاثیر را در پیشبرد نرم افزار بدنبال داشته و ما امروز در صنعت گسترده نرم افزار از دستاوردهای وسیع آن بهره مند هستیم . در این مقاله قصد داریم ، به بررسی برنامه نویسی شی گراء پرداخته و از این زاویه نگاهی به دات نت داشته باشیم . بمنظور شناخت برنامه ...

++C ++C يک زبان برنامه نويسي همه منظوره و سطح بالا است. ++C يک زبان چندرگه است که از برنامه نويسي رويه‌اي، تجريد داده‌ها و برنامه نويسي شئ گرا پشتيباني مي‌‌کند. ++C به همراه جد خود C از پرطرفدارترين زبانهاي برنامه نويسي تجاري هستند. زبان برنامه‌

COM ابزاري است که قابليتهاي برنامه هاي موجد تحت محيطهاي ويندوز را افزايش مي دهد.اجزاء COM را با زبانهاي مختلفي ميتوان نوشت که دلفي يکي از قويترين آنهاست. COM سرنام Component Object Model است ، يعني مجموعه مشخصاتي که ميکروسافت براي ساختن اجزاء نرم اف

اجرا و عملي ساختن الگوريتم‌هاي انتزاعي وابسته به هم به‌وسيله براي توليد يک برنامه رايانه‌اي مشخص با ابزار زبان برنامه‌نويسي ممکن است. گرچه نزديک‌ترين راه براي بازسازي اين قوانين در رايانه کار روي مدارهاي الکترونيکي سخت‌افزار آن است. اما اين کاري طاق

مقدمه مدیریت پایگاه های داده یکی از کاربردی ترین شاخه های علوم کامپیوتر می باشد و برای انجام این کار ابزار های مختلفی موجود می باشدکه access یکی از آنها به شمار می آید. پایگاه داده های رابطه ای یکی از مدل های متداول برای طراحی بانک اطلاعاتی است که در اینجا درباره آن بحث خواهد شد.accessبه عنوان یکی از قوی ترین نرم افزار های سیستم مدیریت پایگاه داده(DBMS)طرفداران زیادی در دنیا ...

دِلفی (Delphi) یا به تعبیری ویژوآل پاسکال – یک زبان برنامه‌ نویسی است و بستری برای توسعهٔ نرم‌افزار که شرکت بورلند آن را تولید کرده است. این زبان، در بدو انتشار خود در سال ۱۹۹۵، به عنوان یکی از نخستین ابزارهایی مطرح شد که از توسعهٔ نرم‌افزار بر مبنای متدولوژی RAD((Rapid Application Developmentپشتیبانی می‌کردند؛ یعنی تولید و توسعهٔ سریع برنامه‌های کاربردی این نرم افزار بر مبنای ...

: مفاهيم شيء گرايي مقدمه شئ گرايي براي توسعه نرم افزار اولين بار در سال 1960 پيشنهاد شد، اين روش پس از 20 سال به طور گسترده مورد استفاده جامعه نرم افزاري قرار گرفت. توسعه دهندگان نرم افزار در دهه 1980 توجه جدي خو د را روي شئ گرايي معطوف کردند. تکنول

تاريخچه کمتر کاربر اينترنت را مي‌توان يافت که تاکنون با صفحاتي با پسوندPHP برخورد نکرده باشد و البته اين پسوند نامي آشنا براي طراحان و برنامه ‌نويسان وب است. پي اچ پي (PHP) يکي از محبوب‌ترين و رايج‌ترين زبان‌هاي برنامه ‌نويسي براي ايجاد صفحات پويا د

ثبت سفارش
تعداد
عنوان محصول