تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

این مقاله نحوه ایجاد قابلیتی را می آموزد که ضوابط فیلتر کردن را از طریق یک فرم جدولی اکسس 2003 وارد کنید و دکمه ای بنام Query داشته باشید تا فیلتر اعمال شود.
این فیلتر 4 تکست باکس بنام های txtFirstName ، txtMiddleInitial ، txtLastName وtxtSSN دارد که جدول دیتابیس member نام دارد و فیلد هایی بنام های First ، Mi ، Last و SSNدارد .
فانکشن AttachAnd که برای ساخت جمله فیلتر کننده SQL استفاده میشود :
"First='David' and Last='Nishimoto'".
ساخت فانکشن :
Option Compare Database
Dim ssql
1- کاربر دکمه query را فشار داد
2-یا اینکه شما میتوانید یک دکمه برای رویداد exit قرار دهید.
Private Sub cmdQuery_Click()
BuildQueryCommand
End Sub
3- فانکشن BuildQueryCommand یک فیلتر با ضوابطی که از تکست باکس ها دریافت کرده میسازد
4 – قوانین فیلتر اعمال شد .
Private Function BuildQueryCommand()
sSQL = ""
Call AttachAnd("First", "'" & txtFirstName & "'")
Call AttachAnd("Mi", "'" & txtMiddleInitial & "'")
Call AttachAnd("Last", "'" & txtLastName & "'")
Call AttachAnd("SSN", "'" & txtSSN & "'")
Filter = sSQL
FilterOn = True
End Function
ضوابط چندگانه یا تکی را بررسی کنید
Single: "first='David'"
Multiple:"First='David' and Last='Nishimoto'"
Private Function AttachAnd(sField, sValue)
If sValue = "''" Or sValue = "" Then
Exit Function
End If
If Occurances(sSQL, "=") = 0 Then
sSQL = sSQL & sField & "=" & sValue
Else
sSQL = sSQL & " and " & sField & "=" & sValue
End If
End Function
رخدادهای یک طرح را در عبارت SQL بشمارید
Private Function Occurances(sSQL, sOperator)
Dim offset
Dim iCount
offset = 1
While offset 0
offset = InStr(offset + 1, sSQL, sOperator)
If offset > 1 Then
iCount = iCount + 1
End If
Wend
Occurances = iCount
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

در ابتدای پیدایش علوم کامپیوتر، برنامهنویسان کدهایی در سطح ماشین مینوشتند. به همین دلیل بیشتر توجه آنان معطوف به مجموعه دستورات ماشین بود. به تدریج زبانهای سطح بالا ایجاد شد و در نتیجه توجه برنامهنویسان بیشتر به اصل مسئله معطوف گردید. اکنون سطح انتزاعی بر روی کامپیوترهای مختلف ایجاد شده است. یعنی برنامهی نوشته شده روی هر ماشین اجرا میشود.
در زبانهای ساختیافته ، برنامه را به تعدادی روال تقسیم مینمودند، بدین صورت که هر روال کار خاصی را انجام میداد. برنامهنویسی شیگرایی اجازه میدهد تا سیستمی دارای اشیای مرتبط و همکار داشته باشید. کلاس ها این امکان را فراهم میکنند که جزییات پیادهسازی را پشت واسط برنامهنویسی پنهان نمایید. چندشکلی یا چندریختی ، رفتار و واسط مشترکی را برای مفاهیم مشابه نشان میدهد. بدین وسیله قادر خواهید بود تا پیمانههای خاص و جدیدی را بدون نیاز به دستکاری در پیادهسازی مفاهیم پایه ایجاد نمایید.
روشهای برنامهنویسی و زبانها در واقع راه ارتباط با ماشین را تعریف میکنند. هر روش جدید، شیوههای نو را برای تجزیهی مساله ارائه میدهد که عبارتند از: کد ماشین، کد مستقل از ماشین، روالها، کلاسها و غیره. هر شیوهی جدید، نگرشی تازه جهت تبدیل نیازهای سیستم به زیرساختهای برنامهنویسی ارائه میدهد. تکامل این نوع شیوههای برنامهنویسی امکانی را فراهم مینماید تا سیستمهای پیچیدهتری ایجاد کنید. عکس این مطلب نیز صادق میباشد. یعنی سیستمهای پیچیده میتوانند پیادهسازی شوند.
اکنون، برنامهنویسی شیگرا به عنوان روش ایجاد پروژههای نرمافزاری استفاده میشود. این شیوه قدرت خود را در مدلسازی رفتارهای معمولی نشان داده است. اما این روش به خوبی نمیتواند بر روی رفتارهایی که بین چندین پیمانه مشترک وجود دارند، کار کند. برعکس، شیوهی جنبهگرا تا حد قابل توجهی این مشکل را برطرف میکند.
در سال 1972 پارانز مفهومی به نام جداسازی دغدغهها را مطرح کرده که امروزه جزء مفاهیم اساسی در فرآیند مهندسی نرمافزار به شمار میآید. این مفهوم به صورت زیر تعریف شده است:
"قابلیت تشخیص، کپسولهسازی و کار با دغدغه، هدف و یا مقصود هستند"
دغدغه را میتوان به عنوان محرکی برای تقسیم نرمافزار به بخشهای قابل مدیریت درنظر گرفت. برای نمونه، یک وظیفهمندی خاص نرم افزار و مسائلی که به خواستههای غیروظیفهمندی مرتبط میشوند مانند ثبت وقایع، امنیت و غیره، همگی به عنوان دغدغه هستند، البته با توجه به جداسازی دغدغهها آنها را در قالب واحدهای مستقل کپسوله کردهاند.
در سال 1997، مشهورترین رویکرد زبان جنبهگرا به نام AspectJ ابتدا توسط گروهی درXerox PARC عمومیت یافت. این گروه روی پروتکلها و ایدهی مدلسازی دغدغههای مشترک کار میکردند. در همان حال، گروهی در شرکت IBM برنامهنویسی موضوعگرا را مطرح کردند. برنامهنویسی موضوعگرا و عناوین بعدی آن، تحت نام "جداسازی چندبعدی دغدغهها"، به جداسازی و ادغام پیمانههای مختلف برنامهنویسی بر پایهی دغدغههایی در ابعاد مختلف پرداختهاند. [1]
نخستین کار در دانشگاه Twente هلند انجام یافت که در مورد فیلترهای ادغامسازی کار میکردند. به طوری که در پیادهسازی فیلترهایی که رفتار شی را در اجرا پیشرفت میدادند دخیل بودند. در دانشگاه Northeastern نیز انتزاعی از ساختار کلاسها انجام گرفت که پشتیبانی بهتری از مفهوم دانش و رفتار عملیاتی ارائه میداد. در سال 1997، کریستیانا لوپز از هر دو مقاله استفاده کرد و زبان D-Java را به عنوان اولین مجموعهی رسمی از زبان جنبهگرا ارائه نمود.
شیوهی موضوعی اولین روشی بود که مفاهیم جنبهگرایی را با زبان مدلسازی یکپارچه ادغام کرد. این کار مشترکی از چندین گروه با گروه برنامهنویسی موضوعگرا است. برنامهنویسی موضوعگرا به طراحی موضوعگرا تبدیل شده و در سال 2001 به Theme/UML تبدیل گردید. تعریف و نمایش دغدغهها برای نخستین بار در مستندات الیسا و گیل مورفی از دانشگاه British Columbia ارائه شد و در سال 2003 به عنوان بخشی از شیوهی موضوعی طراحی جنبهگرا به نام Theme/Doc مطرح گردید.
حدود یک دههی قبل، به دنبال موفقیت درخور توجه ابزار CASE ، چیکوفسکی و کراس مبحث مهندسی معکوس و بازیابی طراحی را مطرح نمودند. تعریفی که آنها از مهندسی معکوس داشتند در زیر ارائه شده است:
"مهندسی معکوس، تحلیل یک سیستم به منظور تشخیص اجزا، ترکیبات فعلی، روابط بینابین آنها، استخراج و تولید تجریدهای موجود در سیستم و دادههای مربوط به طراحی است." [2]
در دو دههی قبل، محققان امکاناتی را به منظور کشف، اعمال تغییر، تحلیل، جمعبندی، تولید، تجزیه و به تصویر کشیدن محصولات نرمافزاری ابداع کردند. این امکانات شامل تهیهی اسناد نرمافزاری در شکلهای گوناگون، نمایش کد میانی، داده و معماری بود. اغلب ابزارهای مهندسی معکوس بر استخراج ساختار درونی سیستم موجود با هدف انتقال آن به ذهن مهندس نرم افزار تمرکز دارد. در هر صورت، این ابزارها راه زیادی در پیش دارند تا به مرحلهای برسند که مورد استفادهی روزانهی مهندسان نرمافزار قرار گیرند. مطالعه و درک برنامه در صنعت نرمافزار به منظور کنترل هزینه و ریسک چرخهی تحولات سیستمهای نرمافزاری از اهمیت بالایی برخوردار میباشد.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

UML شامل تعدادی عنصر گرافیكی است كه از تركیب آنها نمودارهای UML شكل می گیرند . هدف استفاده از نمودارهای مختلف در UML ، ارائه دیدگاه های گوناگون از سیستم است. همانطور كه مهندسین عمران جهت ساختن یك ساختمان پلانهای مختلفی از ساختمان تهیه می كنند ، ما با استفاده از نمودارهای UML نماهای مختلفی از نرم افزار مورد نظر را تهیه می كنیم.
نكته ای كه باید حتما به آن توجه كنید این است كه : مدل UML آنچه كه یك سیستم باید انجام دهد را توضیح می دهد، ولی چیزی درباره نحوه پیاده سازی سیستم نمی گوید.
با توجه به رشد نرم افزارهای پشتیبانی كننده UML امروزه با استفاده از نرم افزارهایی مانند Visio ، Enterprise Architecture و rational rose شما می توانید بعد از كشیدن نمودارهای UML مستقیما نمودارهای خود را به بانك اطلاعاتی و كد تبدیل كنید (البته این نرم افزارها ساختار كد شما را برایتان تولید می كنند!) این نرم افزارها همچنین كد برنامه شما را گرفته و نمودارهای UML برنامه را تولید می كنند. پس از آشنایی با مفاهیم شیء گرایی، در اینجا زبان مدلسازی UML را معرفی کرده و خواهیم دید چگونه این زبان مفاهیم شیء گرایی را پشتیبانی می كند.
مقدمه
زبان مدل سازی یكنواخت ( Unified Modeling Language ) یا UML یك زبان مدلسازی است كه برای تحلیل و طراحی سیستم های شی گرا به كار میرود. UML اولین بار توسط شركت Rational ارائه شد و پس از آن از طرف بسیاری از شركت های كامپیوتری و مجامع صنعتی و نرم افزاری دنیا مورد حمایت قرار گرفت؛ به طوریكه تنها پس از یك سال، توسط گروه Object Management Group، به عنوان زبان مدلسازی استاندارد پذیرفته شد. UML توانایی ها و خصوصیات بارز فراوانی دارد كه میتواند به طور گستردهای در تولید نرمافزار استفاده گردد. در ادامه این مقاله ابتدا به تاریخچة UML و در ادامه به معرفی، ویژگی ها و نمودارهای آن پرداخته می شود.
تاریخچة UML :
دیدگاه شی گرایی (Object Oriented) از اواسط دهه 1970 تا اواخر دهه 1980 در حال مطرح شدن بود. در این دوران تلاش های زیادی برای ایجاد روش های تحلیل و طراحی شی گرا صورت پذیرفت. در نتیجه این تلاش ها بود كه در طول 5 سال یعنی 1989 تا 1994، تعداد متدولوژی های شی گرا از كمتر از 10 متدولوژی به بیش از 50 متدولوژی رسید. تكثر متدولوژی ها و زبانهای شی گرایی و رقابت بین اینها به حدی بود كه این دوران به عنوان "دوران جنگ متدولوژیها" لقب گرفت.
از جمله متدولوژی های پركاربرد آن زمان می توان ازBooch، OOSE، OMT، Fusion، Coad-Yourdan، Shlayer-Mellor و غیره نام برد. فراوانی و اشباع متدولوژیها و روشهای شی گرایی و نیز نبودن یك زبان مدلسازی استاندارد، باعث مشكلات فراوانی شده بود. از یك طرف كاربران از متدولوژیهای موجود خسته شده بودند، زیرا مجبور بودند از میان روشهای مختلف شبیه به هم كه تفاوت كمی در قدرت و قابلیت داشتند یكی را انتخاب كنند. بسیاری از این روشها، مفاهیم مشترك شی گرایی را در قالب های مختلف بیان می کردند كه این واگرایی و نبودن توافق میان این زبانها، كاربران تازه كار را از دنیای شی گرایی زده می کرد و آنها را از این حیطه دور میساخت. عدم وجود یك زبان استاندارد، برای فروشندگان محصولات نرم افزاری نیز مشكلات زیادی ایجاد كرده بود.
اولین تلاشهای استانداردسازی از اكتبر 1994 آغاز شد، زمانی كه آقای Rumbaurgh صاحب متدولوژی OMT به آقای Booch در شركت Rational پیوست و این دو با تركیب متدولوژیهای خود، اولین محصول تركیبی خود به نام "روش یكنواخت" را ارائه دادند. در سال 1995 بود كه با اضافه شدن آقای Jacobson به این دو، روش یكنواخت ارائه شده با روش OOSE نیز تركیب شد و این خود سبب ارائه UML نسخة 0.9 در سال 1996 گردید. سپس این محصول به شركتهای مختلفی در سراسر جهان به صورت رایگان ارائه شد و استقبال شدید شركت ها از این محصول و تبلیغات گسترده شركت Rational، سبب آن شد كه گروه OMG، نسخة 1.0 UML را به عنوان زبان مدلسازی استاندارد خود بپذیرد. تلاشهای تكمیلی UML استاندارد ادامه پیدا كرد و نسخة 1.1 آن در سال 1997 و نسخه 1.3 آن در سال 1999 ارائه گردید.
UML یا زبان مدلسازی یكنواخت، زبانی است برای مشخص كردن (Specify)، مصورسازی (Visualize)، ساخت (Construction) و مستندسازی (Documenting) سیستمهای نرم افزاری و غیر نرم افزاری و نیز برای مدلسازی سیستمهای تجاری.
اما چرا مدل و مدلسازی ؟
ایجاد یك مدل برای سیستمهای نرم افزاری قبل از ساخت یا بازساخت آن، به اندازه داشتن نقشه برای ساختن یك ساختمان ضروری و حیاتی است. بسیاری از شاخه های مهندسی، توصیف چگونگی محصولاتی كه باید ساخته شوند را ترسیم می كنند و همچنین دقت زیادی می كنند كه محصولاتشان طبق این مدلها و توصیفها ساخته شوند. مدلهای خوب و دقیق در برقراری یك ارتباط كامل بین افراد پروژه، نقش زیادی می توانند داشته باشند. شاید علت مدل كردن سیستمهای پیچیده این باشد كه تمامی آن را نمی توان یك باره مجسم كرد، بنابراین برای فهم كامل سیستم و یافتن و نمایش ارتباط بین قسمتهای مختلف آن، به مدلسازی میپردازیم. UML زبانی است برای مدلسازی یا ایجاد نقشه تولید نرم افزار.
به عبارت دیگر، یك زبان، با ارائه یك فرهنگ لغات و یك مجموعه قواعد، امكان می دهد كه با تركیب كلمات این فرهنگ لغات و ساختن جملات، با یكدیگر ارتباط برقرار كنیم. یك زبان مدلسازی، زبانی است كه فرهنگ لغات و قواعد آن بر نمایش فیزیكی و مفهومی آن سیستم متمركزند. برای سیستمهای نرم افزاری نیاز به یك زبان مدلسازی داریم كه بتواند دیدهای مختلف معماری سیستم را در طول چرخه تولید آن، مدل كند.
فرهنگ واژگان و قواعد زبانی مثل UML به شما می گویند كه چگونه یك مدل را بسازید و یا چگونه یك مدل را بخوانید. اما به شما نمی گویند كه در چه زمانی، چه مدلی را ایجاد كنید. یعنی UML فقط یك زبان نمادگذاری (Notation) است نه یك متدولوژی. (توضیحات بیشتر در سایر مقالات سایت میکرو رایانه) یك زبان نمادگذاری شامل نحوه ایجاد و نحوه خواندن یك مدل می باشد، اما یك متدولوژی بیان می كند كه چه محصولاتی باید در چه زمانی تولید شوند و چه كارهایی با چه ترتیبی توسط چه كسانی، با چه هزینهای، در چه مدتی و با چه ریسكی انجام شوند.
UML دارای ویژگیهای بارز فراوانی است كه در این قسمت به آنها می پردازیم. UML یك زبان مدلسازی است اما چیزی فراتر از چند نماد گرافیكی است. به طوریكه در ورای این نمادها، یك سمانتیك (معناشناسی) قوی وجود دارد، به طوریكه یك تولیدكننده میتواند مدلهایی تولید كند كه تولیدكننده های دیگر و یا حتی یك ماشین آن را بخواند و بفهمد. بنابراین یكی دیگر از نقش های مهم UML "تسهیل ارتباط" بین اعضای پروژه و یا بین تولیدكنندگان مختلف می باشد. این ارتباط بسیار مهم است. شاید دلیل اصلی اینكه تولید نرم افزار به صورت فریبنده ای دشوار است، همین عدم ارتباط مناسب بین اعضای پروژه باشد و اگر در تولید نرم افزار، بین اعضای پروژه گزارشهای هفتگی و مداوم وجود داشته باشد، بسیاری از این دشواریها برطرف خواهد شد.
البته این را هم باید در نظر گرفت كه UML كمی پیچیده است و این به خاطر آن است كه سعی شده است نمودارهایی فراهم شود كه در هر موقعیتی و با هر ترتیبی قابل استفاده باشند. دلیل دیگر پیچیدگی از آنجا ناشی می شود كه UML تركیبی است از زبانهای مختلف، كه برای حفظ سازگاری و جمع كردن خصوصیات مثبت آنها، ناگزیر از پذیرش این پیچیدگی می باشد.
UML موفقیت طرح را تضمین نمی كند، اما در عین حال خیلی چیزها را بهبود میبخشد. به عنوان مثال استفاده از UML، تا حد زیادی، هزینه های ثابتی نظیر آموزش و استفاده مجدد از ابزارها را در هنگام ایجاد تغییر در سازمان و طرحها كاهش می دهد.
مساله دیگر اینكه، UML یك زبان برنامه نویسی بصری (visual) نیست، اما مدلهای آن را میتوان مستقیماً به انواع زبانهای مختلف ارتباط داد. یعنی امكان نگاشت از مدلهای UML به كد زبانهای برنامه نویسی مثل Java و ++C وجود دارد كه به این عمل "مهندسی رو به جلو" می گویند.
عكس این عمل نیز ممكن است؛ یعنی این امكان وجود دارد كه شما بتوانید از كد یك برنامه زبانی شی گرا، مدلهای UML معادل آن را به دست آورید. به این عمل "مهندسی معكوس" می گویند. مهندسی رو به جلو و معكوس از مهمترین قابلیت های UML به شمار می روند، البته نیاز به ابزار Case مناسبی دارید كه از این مفاهیم پشتیبانی كنند.
اگر با زبانهای مدلسازی دیگر كار كرده باشید، برای كار با UML مشكل چندانی نخواهید داشت. اما برای شروع كار با UML به عنوان اولین زبان مدلسازی، بهتر است فقط با نمودارهای خاصی كار كنید. برای این كار بهتر است ابتدا با نمودارهای مورد كاربرد و تعامل كار كنید و پس از مدتی كار و آشنا شدن با ویژگیهای اولیه آن، به یادگیری و استفاده از نمودارها و اجزای دیگر بپردازید. در مقایسه با زبانهای مدلسازی دیگر مثل ER و زبان فلوچارتی DR، زبان UML نمودارهای قوی تر و قابل فهم تری را ارائه می دهد كه شامل تمامی مراحل چرخه حیات تولید نرم افزار (تحلیل، طراحی، پیاده سازی و تست) میشود.
یكی دیگر از ویژگی های مهم UML این است كه مستقل از متدولوژی یا فرایند تولید نرم افزار می باشد و این بدان معنی است كه شما برای استفاده از UML، نیاز به استفاده از یك متدولوژی خاص ندارید و می توانید طبق متدولوژی های قبلی خود عمل كنید با این تفاوت كه مدلهایتان را با UML نمایش می دهید. البته مستقل بودن از متدولوژی و فرایند تولید، یك مزیت برای UML میباشد؛ زیرا بسیاری از انواع پروژه ها و سیستمها نیاز به متدولوژی خاص خود دارند. اگر UML در پی پیاده كردن همه اینها بر می آمد، یا بسیار پیچیده می شد و یا استفاده خود را محدود می كرد. البته متدولوژیهایی براساس UML در حال شكل گیری می باشند.
از دیگر ویژگیهای UML می توان به پشتیبانی از مفاهیم سطح بالای شی گرایی مثل Collaboration، Framework، Pattern و Component اشاره كرد. همچنین UML با استفاده از یك سری مكانیزم های گسترش پذیر امكان می دهد كه بتوان زبانهای مدلسازی جدیدتری (با گسترش مفاهیم پایه ای موجود) ایجاد كرد.
روند حركت به سمت UML در جهان:
قبل از ارائه UML، زبان مدلسازی استانداردی وجود نداشت و استفاده كنندگان مجبور بودند از میان زبانهای مختلف موجود كه تقریباً هیچ کدام كامل نبودند و تفاوتهایی با هم داشتند، یكی را انتخاب كنند. تفاوتهای زبانهای مدلسازی، چندان قدرت مدلسازی را افزایش نداده بود، اما در عوض باعث افول صنعت شی گرایی و سردرگمی كاربران شده بود. در چنین شرایطی طبیعی بود كه استقبال زیادی از چنین زبان مدلسازی استانداردی بشود كه ویژگیهای بارز زیادی داشت. بسیاری از شركتها در همان اوایل كار به UML روی آوردند و تعداد دیگری نیز پس از تثبیت UML، آن را به عنوان استراتژی تولید و مستندسازی خود پذیرفتند.
OMG كه كنسرسیومی است متشكل از 700 شركت معتبر آمریكا، از UML حمایت كرد و آن را به عنوان زبان مدلسازی استاندارد خود اعلام كرد. البته علاوه بر استاندارد شدن، حمایت جداگانه شركت های بزرگ دنیا مثل Hewlett-Packard، I-Logix، Microsoft، IBM، Oracle و بسیاری دیگر، خود سبب افزایش كاربرد آن در محافل صنعتی و نرم افزاری دنیا گردید.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

کاردینال بیگلز، اریک بی ایمان را بیش از چهار ساعت روی صندلی راحتی نشاند تا سرانجام این اعترافات را از او گرفت ...
اولین نگاه من به پیتون یک تصادف بود، و علاقه چندانی به چیزی که در آن زمان دیدم پیدا نکردم. اوایل سال 1997 بود و کتاب "برنامه نویسی پیتون" نوشته مارک لوتز از انتشارات
O'reilly
به تازگی بیرون آمده بود. کتابهای
O'reilly
به ندرت به در خانه من می رسند، که در آن مورد هم توسط یک فرد ذینفع درون سازمان طی یک فرآیند تصادفی که من تصمیم گرفته ام دیگر سعی در فهمیدن آن نکنم، از بین تازه های چاپ برای من فرستاده می شوند.
یکی از این کتابها "برنامه نویسی پیتون" بود. از آنجا که من زبان های رایانه ای را جمع آوری می کنم، این موضوع برایم جالب بود. من بیش از دوجین زبان همه منظوره بلدم، برای تفریح مفسر و مترجم های زیادی نوشته ام و شخصا تعدادی زبان های یک منظوره و فرمهای نشانه گذاری (
Markup
) مختلف طراحی کرده ام. تازه ترین پروژه ای که من در زمان نوشتن این مقاله به پایان رسانده ام، یک زبان یک منظوره به نام
SNG
برای کار کردن روی تصاویر
PNG
یا
Portable Network Graphics
است. خوانندگان علاقمند می توانند صفحات خانگی
SNG
را در آدرس
http://www.catb.org/~esr/sng
مشاهده کنند. من همچنین چند نسخه پیاده سازی شده از چند زبان همه منظوره عجیب را در صفحه
Retrocomputing Museum
خود به آدرس
http://www.catb.org/retro
قرار داده ام.
من قبلا آنقدر درباره پیتون شنیده بودم که بدانم از آن چیزهایی است که امروزه به آنها زبانهای اسکریپت می گویند، یک زبان تفسیری با مدیریت داخلی (built-in ) حافظه و تسهیلاتی خوب برای فراخوانی و همکاری با دیگر برنامه ها. بنابراین در هنگام شروع پیتون یک سوال بالاتر از همه مسائل برای من مطرح بود: این زبان چه چیزی دارد که پرل ندارد؟
البته، پرل گوریل ۸۰۰ کیلویی زبان های اسکریپت امروزی است. این زبان تا حدی به لطف کتابخانه های یونیکس و اعلان های جامع خود و تا حدی به دلیل مجموعه بزرگ ماژول های به وجود آمده توسط جامعه برنامه نویسان پرل ، به نسبت زیادی جایگزین زبانهای اسکریپت انتخابی مدیران و ناظران سیستم ها شده است. این زبان، زبان CGI پنهان در پشت حدود ۸۵% محتوای "زنده" بر روی شبکه به شمار می رود. سازنده آن، Larry Wall ، به درستی یکی از مهمترین رهبران جامعه متن باز به شمار می رود و اغلب پس از Linus Torvalds و Richard Stallaman در مکان سوم جایگاه خدایان قرار می گیرد.
در آن زمان من پرل را برای تعدادی از پروژه های کوچک استفاده کرده بودم. من این زبان را بسیار قدرتمند یافتم گرچه به نظر من می رسید سینتکس و بعضی جنبه های دیگر این زبان می توانند تا حدی برای شخصی که به آن عادت نداشته باشد، خطرناک باشند. به نظر من می رسید که پیتون به عنوان یک زبان اسکریپت باید گام مهم دیگری بردارد، بنابراین درحال خواندن به دنبال چیزی می گشتم که به نظر برسد آن را از زبان پرل مجزا می کند.
من به سرعت مطالب غیرعادی اصلی ای که ممکن است در پیتون به نظر هر کسی برسد را مرور کردم: این واقعیت که فضای خالی (indentation ) در سینتکس این زبان بامعنی است؛ این زبان هیچ سنخیتی با ساختار آکولادی C و پرل ندارد، در عوض تغییرات در توگذاری (indentation ) محدودیت گروه های عبارات را از بین می برند؛ و مثل اکثر هکرها پس از فهمیدن این مطلب با بی علاقگی عقب کشیدم.
آنقدر از عمر من گذشته است که برای چند ماهی در دهه ۷۰ با FORTRAN برنامه نویسی کرده باشم. اکثر هکرهای این دوره چنین نیستند ولی به نظر می رسد فرهنگ ما به گونه ای ، خاطره ای دقیق وسنتی از اینکه آن زبان های قدیمی با محدوده ثابت چقدر عذاب آور بودند حفظ کرده باشد. "فرمت آزاد"، که درآن زمان برای توصیف حالت جدیدتر سینتکس token-oriented زبان های C و پاسکال استفاده می شد، تقریبا فراموش شده است؛ چندین دهه است تمامی زبان ها اینگونه طراحی شده اند، یا تقریبا تمام زبان ها. بسیار سخت است کسی را، پس از دیدن این ویژگی پیتون، به خاطر عکس العمل اولیه ای مانند اینکه به صورت غیرمنتظره در انبوهی از بی ادبی! دایناسور قدم گذاشته است سرزنش کرد.
این احساس من در آن زمان بود. من بدون علاقه چندانی از کنار بقیه توضیحات این زبان گذاشتم. من دلیل چندان دیگری برای توصیه پیتون پیدا نکردم به جز اینکه احتمالا سینتکس آن تا حدی شسته و رفته تر از پرل بود و امکانات موجود برای اجرای CGI های ابتدایی مانند دکمه ها و منوها بسیار خوب به نظر می رسید.
من کتاب را با این یادآوری ذهنی که باید زمانی یک پروژه کوچک با محوریت GUI انجام دهم، تا مطمئن شوم که واقعا این زبان را می فهمم، در قفسه گذاشتم. ولی باور نداشتم چیزی که دیده ام هرگز بتواند به طور موثر با پرل رقابت کند.
اتفاقات زیادی باعث شدند این یادآوری ذهنی ماه ها در فهرست اولویت های من در مکان آخر قرار بگیرد. بقیه سال ۱۹۹۷ برای من پر از اتفاقات بود، در کنار بقیه اتفاقات، این سالی بود که من نسخه اصلی "کلیسای اعظم و بازار" را نوشته و منتشر کردم. در عین حال من فرصت یافتم تا چندین برنامه پرل بنویسم، از جمله دو برنامه با حجم و پیچیدگی قابل توجه. یکی از آنها، keeper ، برنامه دستیاری است که همچنان برای بایگانی پرونده های ارسالی وارده در شرکت نرم افزاری Metalab به کار می رود. این برنامه تولیدکننده صفحات وبی است که شما در http://metalab.unc.edu/pub/Linux/!INDEX.html مشاهده می کنید. برنامه دیگر، anthologize ، با هدف تولید خودکار PostScript برای ششمین ویرایش لینوکس از آرشیو "چگونه ها" ی پروژه مستندسازی لینوکس استفاده شد. هر دوی این برنامه ها در Metalab موجود هستند.
نوشتن هر دوی این پروژه ها مرا بیشتر و بیشتر از پرل ناراضی کرد. به نظر می رسید پروژه های با اندازه بزرگتر یک نارضایتی ساده از پرل را تبدیل به مشکلات جدی و مداوم می نمایند. سینتکسی که در صد خط ابتدایی بسیار راضی کننده به نظر می رسید، با گذشت زمان تبدیل به توده ای از خارهای غیرقابل نفوذ می شد. "بیش از یک راه برای انجام کار" که حال و هوا و تاثیرگذاری خاصی به آن می بخشید، نگهداری یک استیل خاص در یک محدوده کد وسیعتر را به مقدار قابل توجهی مشکل می ساخت. و بسیاری قابلیت هایی که بعدا به منظور جوابگویی به نیاز برای کنترل پیچیدگی در برنامه های بزرگتر (اشیاء، lexical scoping ،use strict و ...) به پرل اضافه شده بودند حالتی شکننده و نه چندان دلچسب داشتند.
تمامی این مشکلات دست به دست یکدیگر داده بودند تا خواندن و درک حجم زیادی از کدهای پرل به عنوان یک کلیت را تنها پس از چند روز به صورت غیرمنطقی ای مشکل کنند. علاوه بر این، من دریافتم که روز به روز زمان بیشتری را به جای ور رفتن با برنامه خود، صرف ور رفتن با قابلیت های این زبان می کنم و بدتر از همه اینکه کد من زشت شده بود ، ... این مساله واقعی بود. برنامه های زشت مثل پل هایِ معلقِ زشت هستند، واژگون شدن آنها بسیار محتمل تر از انواع زیبای آنها است، زیرا نحوه ادراک انسان ها (به خصوص مهندس- انسانها) از زیبایی رابطه بسیار نزدیکی با قابلیت ما برای پردازش و فهم پیچیدگی دارد. زبانی که کار نوشتن کد باوقار و باشکوه را سخت کند در حقیقت نوشتن کد خوب را مشکل کرده است.
با وجود یک دو جین زبان که به آنها تسلط داشتم، من می توانستم به تمامی علامات مشهود یک طراحی زبان که به منتهای قابلیت خود رسیده است و چیز بیشتری برای عرضه ندارد پی ببرم. من فکر کردم "باید راه بهتری وجود داشته باشد" و شروع به گشتن به دنبال یک زبان اسکریپت باشکوه تر کردم.
موردی که من حتی به آن فکر نکردم بازگشت به C به عنوان یک زبان پیش فرض بود. دوره ای که انجام مدیریت حافظه در یک برنامه به صورت شخصی معنا داشت، به جز در بعضی زمینه ها مانند طراحی هسته سیستم عامل (kernel hacking ) ، برنامه نویسی علمی و گرافیک ۳ بعدی که در آنها شما نیاز دارید بیشترین سرعت و کنترل کامل بر روی استفاده از حافظه به منظور حداکثر استفاده از سخت افزار را داشته باشید، مدتهاست که گذشته است.
در اکثر موارد دیگر پذیرفتن بار اضافه debug کردن [ چندین اصطلاح را در این قسمت حذف کردم م.] و دیگر مشکلات از این دست در ماشین های امروزی دیوانگی است. بسیار عاقلانه تر است که چندین چرخه و چندین کیلوبایت حافظه برای نیازهای مدیر حافظه یک زبان اسکریپت فدا کنیم و در وقت گرانبهای انسان صرفه جویی کنیم. در حقیقت استفاده از این راهبرد (استراتژی) دقیقا همان چیزی است که باعث رشد انفجاری پرل از اوایل دهه ۹۰ شده است.
مدتی با Tcl ور رفتم تا متوجه شدم که در مقیاس های بالا حتی از پرل هم ضعیفتر عمل می کند. به عنوان یک برنامه نویس قدیمی LISP ، همچنین نگاهی به اشکال ( dialects ) مختلف رایج LISP و Scheme انداختم ولی همانگونه که از نظر تاریخی در مورد LISP معمول است، طراحی های هوشمندانه متعدد آن به دلیل عدم وجود یا ناقص بودن مستندات، دسترسی ناقص به امکانات POSIX/UNIX و یک جامعه کوچک و در عین حال بسیار پراکنده کاربران، بی استفاده شده بودند. پرطرفدار بودن پرل به هیچ عنوان یک تصادف نیست؛ اکثر رقبای آن یا برای پروژه های بزرگ بدتر از پرل هستند یا اصلا و ابدا به آن مفیدی که ساختار نظری برتر آنها انتظارش را ایجاد می کند نیستند.
نگاه دومی من به پیتون تقریبا همانقدر تصادفی بود که نگاه اول. در اکتبر ۱۹۹۷، یک سری سوالات در فهرست نامه های الکترونیک افراد استفاده کننده از fetchmail این موضوع را کاملا مشخص کرد که افراد برای ایجاد فایل های تنظیمات برنامه fetchmail دچار مشکلات فزاینده ای می شوند. این فایل دارای ساختاری ساده و کلاس به سبک فرمت آزاد یونیکس است ولی می تواند هنگامی که کاربر دارای چندین حساب از نوع POP3 و IMAP باشد، به شدت پیچیده شود. به عنوان نمونه، برای دیدن یک مثال ساده شده از برنامه من به لیست ۱ نگاه کنید.
Listing 1. fetchmail Configuration File
set postmaster ``esr ''
set daemon 300
poll imap.ccil.org with proto IMAP and options no dns
aka snark.thyrsus.com locke.ccil.org ccil.org
user esr there is esr here options fetchall dropstatus warnings 3600
poll imap.netaxs.com with proto IMAP
user "esr" there is esr here options dropstatus warnings 3600
skip imap.21cn.com with proto IMAP
user esr here is tranxww there options fetchall
skip pop.tems.com with proto POP3 :
user esr here is ed there options fetchall
skip mail.frequentis.com with proto IMAP :
user esr here is imaptest there with options fetchall
من تصمیم گرفتم برای حل مشکل از یک ویرایشگر تنظیمات با حالتی کاربر پسند ( End-User-Friendly ) به نام fetchmailconf استفاده کنم. هدف از طراحی fetchmail مشخص بود؛ پنهان کردن کامل سینتکس فایل کنترل در پشت ظاهر شیک و صحیح از نظر ارگونومی یک رابط گرافیکی کاربر ( GUI ) با کلیدهای انتخاب، منوهای کشویی و فرم های مختلف.
فکر پیاده کردن این برنامه با پرل چندان مرا ذوق زده نکرد. من کدهای GUI را در پرل دیده بودم که ترکیبی ناهمگون بود از پرل و Tcl که حتی از کد پرل خود برنامه هم زشت تر بود. در این لحظه بود که قولی را که ۶ ماه قبل داده بودم یادم آمد. این می توانست فرصتی برای کسب یک تجربه عملی با پیتون باشد.
البته این موضوع مجددا من را با بامعنی بودن فضای خالی در پیتون روبرو کرد. البته این بار تخته گاز پیش رفتم و مقداری کد برای انبوهی از عناصر GUI نوشتم. جدا ّ حیرت آور بود که تنها پس از ۲۰ دقیقه، استفاده پیتون از فضای سفید دیگر امر عجیبی به نظر نمی آمد. من همانقدر از فرورفتگی متن در پیتون استفاده می کردم که امکان داشت در C از آن استفاده کنم و این روش جواب هم می داد.
این اولین حیرت من بود. حیرت دومی ، حدود ۲ ساعت بعد (با احتساب زمان های توقفی که برای نگاه کردن به قابلیت های پیتون در کتاب Learning Python صرف شد) ، وقتی پیش آمد که متوجه شدم با همان سرعتی مشغول نوشتن برنامه های به دردبخور هستم که می توانم تایپ کنم. وقتی متوجه این موضوع شدم تقریبا مبهوت شدم. یکی از معیارهای مهم عملکرد در برنامه نویسی تعداد دفعاتی است که شما چیزی می نویسید که واقعا با درک شما از مساله همخوانی ندارد و ناچارید پس از فهمیدن این موضوع که چیزی که تایپ کرده اید، به زبان آنچه را شما فکر می کنید نمی گوید به عقب برگردید. یکی از معیارهای مهم طراحی مناسب زبان اینست که درصد چنین اشتباهاتی با تجربه پیدا کردن شخص در آن زبان با چه سرعتی کاهش می یابند.
هنگامی که شما با بیشترین سرعتی که قادرید تایپ کنید، برنامه به دردبخور می نویسید و اشتباهات شما در انتخاب مسیر تقریبا صفر است، این به آن معناست که شما در آن زبان به استادی رسیده اید. ولی این بی معنی بود، چون به زحمت یک روز از این موضوع گذشته بود و من هنوز مجبور بودم امکانات مربوط به زبان و کتابخانه ها را از روی کتاب نگاه کنم.
این اولین چیزی بود که به من فهماند من در پیتون با یک طراحی عالی سروکار دارم. اکثر زبانها آنقدر دارای تداخل و ضعف در طراحی خود هستند که شما قبل از اینکه ضریب اشتباهاتتان در آنها حتی نزدیک به صفر شود بسیاری از امکانات آنها را فرا گرفته اید. پیتون تنها زبان همه منظوره ای بود که من تا آن روز استفاده کرده بودم و این فرآیند را معکوس می کرد.
البته یادگیری مجموعه امکانات آن نیز چندان وقت گیر نبود. من یک برنامه fetchmailconf کارآ و قابل استفاده، به همراه GUI ، را در ۶ روز کاری نوشتم که از این ۶ روز احتمالا ۲ روز آن تماما صرف یادگیری خود پیتون شد. این موضوع نشان دهنده یک خاصیت مفید دیگر این زبان است: این زبان حالت اختصاری دارد، شما می توانید تمامی مجموعه امکانات آن (حداقل یک ایده فهرست وار از کتابخانه های آن) را در ذهن نگه دارید. C زبانی است که به اختصار معروف است. پرل در این زمینه شهرت خوبی ندارد. یکی از چیزهایی که عبارت معروف "بیش از یک راه برای انجام آن وجود دارد!" قربانی می کند توانایی مختصر بودن پرل است.
ولی هنوز رویایی ترین کشف من باقی مانده بود. طراحی من یک مشکل داشت: من قادر بودم به راحتی فایل های تنظیم را با استفاده از عملهای GUI کاربر تولید کنم ولی ویرایش آنها مشکل بزرگتری بود. یا بهتر است بگویم خواندن آنها به یک شکل قابل ویرایش کار مشکلی بود.
Parser به کار رفته برای سینتکس فایل تنظیماتfetchmail بسیار کاربر بود. این برنامه در حقیقت با استفاده از YACC و Lex ، دو ابزار کلاسیک یونیکس برای تولید کد parsing زبان در C ، نوشته شده بود. تصور من این بود که برای اینکه قادر به ویرایش فایلهای تنظیمات در fetchmail باشم ناچار به تکرار همان parser وقت گیر در پیتون خواهم بود. من برای انجام این کار بسیار دودل بودم، تا حدودی به دلیل حجم کار و تا حدودی هم به دلیل اینکه نمیدانستم از کجا باید مطمئن باشم که دو parser در دو زبان مختلف مثل یکدیگر عمل خواهند کرد. کار فوق العاده زیاد همخوان نگاه داشتن دو parse آخرین چیزی بود که ممکن بود من با تحول زبانها به آن نیاز داشته باشم.
این مشکل برای مدتی مرا متوقف کرد. بعد از این فکری به ذهنم رسید: من به fetchmailconf اجازه می دادم از parser خود استفاده کند. من یک گزینه –configdump به fetchmail اضافه کردم و نتیجه را در یک خروجی استاندارد با فرمت یک initializer پیتون تخلیه کردم. برای فایل بالایی، نتیجه تقریبا شبیه به لیست ۲ بود (برای صرفه جویی در فضا بعضی داده های غیرمرتبط با مثال حذف شده اند).
Listing 2. fetchmailrc
fetchmailrc = {
'poll_interval':300 ,
"logfile":None ,
"postmaster":"esr ",
'bouncemail':TRUE ,
"properties":None ,
'invisible':FALSE ,
'syslog':FALSE ,
# List of server entries begins here
'servers’:[
# Entry for site `imap.ccil.org' begins :
{
"pollname":"imap.ccil.org ",
'active':TRUE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':FALSE ,
"aka":["snark.thyrsus.com", "locke.ccil.org", "ccil.org " ]
'users’: [
{
"remote":"esr ",
"password":"Malvern ",
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `imap.netaxs.com' begins :
{
"pollname":"imap.netaxs.com ",
'active':TRUE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': [
{
"remote":"esr ",
"password":"d0wnthere ",
'localnames':["esr " ] ,
'fetchall':FALSE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `imap.21cn.com' begins :
{
"pollname":"imap.21cn.com ",
'active':FALSE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': [
{
"remote":"tranxww ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `pop.tems.com' begins :
{
"pollname":"pop.tems.com ",
'active':FALSE ,
"via":None ,
"protocol":"POP3 ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
'uidl':FALSE ,
"aka":None ,
'users ': [
{
"remote":"ed ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, [
}
,
# Entry for site `mail.frequentis.com' begins :
{
"pollname":"mail.frequentis.com ",
'active':FALSE ,
"via":None ,
"protocol":"IMAP ",
'port':0 ,
'timeout':300 ,
'dns':TRUE ,
"aka":None ,
'users ': ]
{
"remote":"imaptest ",
"password":None ,
'localnames':["esr " ] ,
'fetchall':TRUE ,
'keep':FALSE ,
'flush':FALSE ,
"mda":None ,
'limit':0 ,
'warnings':3600 ,
}
, ]
}
]
}
پیتون سپس قادربود خروجی fetchmail--configdump را ارزیابی کند و سپس تنظیمات را به صورت مقدار متغیر "fetchmail " ارائه کند.
حتی این هم آخرین حرکت رقص من نبود. چیزی که من می خواستم صرفا این نبود که fetchmail تنظیمات فعلی خود را داشته باشد بلکه می خواستم آن را تبدیل به یک ساختار درختی از اشیا زنده (live objects ) کنم. احتمالا در این درخت سه نوع شی وجود داشت: تنظیمات ( که شیء واقع در بالاترین مرتبه و نشان دهنده کل تنظیمات بود)؛ سایت (نشان دهنده یکی از سایتهایی که باید به رای گذاشته می شد.) و کاربر ( نشان دهنده داده های کاربران که به سایت متصل می شود). فایل های مثال پنج شیء از نوع سایت که به هر کدام یک شیء از نوع کاربر متصل شده است را نشان می دهد.
تا اینجا من سه شیء کلاس را طراحی کرده و نوشته بودم (این همان چیزی بود که چهار روز از وقت من را گرفت که اکثر آن هم صرف چیدن درست و مناسب کنترلهای صفحه شد). هر یک از این کلاسها یک متد داشت که باعث می شد برای ویرایش داده های آن instance خاص یک صفحه GUI باز شود. تنها مشکل باقیمانده من یافتن روشی برای تبدیل اشیاء مرده این برنامه initializer پیتون به اشیاء زنده بود.
چیزی که به نظر من رسید نوشتن کدی بود که به وضوح راجع به ساختار هر سه کلاس بداند و از این دانش برای پلکیدن در initializer و ایجاد اشیایی که پاسخگوی نیازها باشند استفاده کند ولی این ایده را رد کردم زیرا اعضای این کلاس جدید احتمالا با اضافه شدن امکانات جدید به تنظیمات زیاد می شدند. اگر من کد ایجاد اشیا را با این روش مشهود می نوشتم، احتمال زیادی وجود داشت که کد حالت شکننده پیدا کند و با تغییر تعریفهای کلاس یا ساختار initializer از حالت به روز خارج شود.
چیزی که من واقعا به دنبالش بودم کدی بود که شکل و اعضای initializer را تجزیه و تحلیل کند، از تعریفهای کلاس برای پرس و جو درباره اعضای آن کلاس استفاده کند و سپس خودش را با این دو مجموعه هماهنگ کند.
به این گونه چیزها در اصطلاح هک کردن metaclass گفته می شود و در حالت عمومی چیزی به ترسناکی جادوی سیاه به شمار می روند. اکثر زبانهای برنامه نویسی شیءگرا مطلقا از این قابلیت پشتیبانی نمی کنند و در آنهایی که این کار را می کنند (که پرل هم یکی از آنهاست)، این موضوع امری پیچیده و ظریف و شکننده است. تا همان زمان من از ضریب بسیار پایین اشکال سازی پیتون متعجب شده بودم ولی این یک آزمایش واقعی بود. برای اینکه این زبان را مجبور به انجام چنین کاری کنم چقدر باید با آن کشتی می گرفتم؟ با استفاده از تجربیات قبلی می دانستم که ، حتی با این فرض که من ببرم، این می تواند تجربه دردناکی باشد ولی روی کتاب شیرجه رفتم و شروع به مطالعه امکانات metaclass پیتون کردم. تابع به دست آمده در لیست ۳ نشان داده شده است و کدی که فراخوانی می کند در لیست ۴ آمده است.
Listing 3. Metaclass Function
def copy_instance(toclass, fromdict) :
# Initialize a class object of given type from a conformant dictionary .
class_sig = toclass.__dict__.keys(); class_sig.sort ()
dict_keys = fromdict.keys(); dict_keys.sort ()
common = intersect(class_sig, dict_keys)
if 'typemap' in class_sig :
class_sig.remove('typemap ' )
if tuple(class_sig) != tuple(dict_keys) :
print "Conformability error "
# print "Class signature: " + `class_sig `
# print "Dictionary keys: " + `dict_keys `
print "Not matched in class signature: " + `setdiff(class_sig, common) `
print "Not matched in dictionary keys: " + `setdiff(dict_keys, common) `
sys.exit(1)
else :
for x in dict_keys :
setattr(toclass, x, fromdict[x])
Listing 4. Code that Calls Metaclass Function
# The tricky part--initializing objects from the
# configuration global
# `Configuration' is the top level of the object
# tree we're going to mung
Configuration = Controls ()
copy_instance(Configuration, configuration)
Configuration.servers = [];
for server in configuration[`servers ' ] :
Newsite = Server ()
copy_instance(Newsite, server)
Configuration.servers.append(Newsite)
Newsite.users = [];
for user in server['users ' ] :
Newuser = User ()
copy_instance(Newuser, user)
Newsite.users.append(Newuser)
برای جادوی سیاه چندان بد به نظر نمی رسد، اینطور نیست ؟ سی و دو خط با احتساب توضیحات. فقط با توجه به چیزهایی که من درباره ساختار کلاسها گفتم، حتی کد فراخوان نیز قابل خواندن است. ولی اندازه این کد موضوع شوکه کننده نیست. خودتان را کنترل کنید: نوشتن این کد تنها ۹۰ دقیقه وقت گرفت و در اولین باری که من آن را اجرا کردم به خوبی کار کرد.
تنها گفتن این که من حیرت زده شده بودم می تواند کم لطفی باشد. درست و به خوبی کار کردن پیاده سازی حتی ساده ترین تکنیکها در اولین بار همانگونه که انتظار می رفته می تواند امری قابل توجه باشد؛ ولی اولین هک کردن metaclass من تنها پس از ۶ روز از یک شروع بی مقدمه؟ حتی اگر به اغراق بگوییم که من یک هکر با استعداد هستم این یک موفقیت بزرگ برای پیتون در زمینه شفافیت و شکوه و عظمت طراحی است.
تقریبا هیچ راهی وجود نداشت که من بتوانم با وجود تجربه بسیار زیادترم در پرل عمل مشابهی را با استفاده از آن انجام دهم. در این زمان بود که احساس کردم که احتمالا پرل را ترک خواهم کرد.
این رویایی ترین لحظه من در پیتون بود. ولی حالا که همه اینها تمام شده باید بگویم تمام اینها یک هک هوشمندانه بود. مفید بودن یک زبان برنامه نویسی در بلند مدت بستگی به پشتیبانی آنها از هک های هوشمندانه ندارد بلکه به چند و چون پشتیبانی آن از امور روزمره برنامه نویسی مرتبط است. کار روزمره برنامه نویسی اکثرا به جای نوشتن برنامه های جدید، از خواندن و تغییر دادن برنامه های موجود تشکیل می شود.
مساله تکان دهنده اینجاست: هفته ها و ماه ها پس از نوشتن fetchmailconf ، من هنوز قادر بودم کد آن را بخوانم و بدون هیچ تلاش فکری جدی ای متوجه بشوم که چکار می کند و دلیل واقعی این موضوع که من دیگر برای هیچ چیزی جز پروژه های کوچک از پرل استفاده نمی کنم این است که این موضوع هرگز در مورد پرل صادق نبود. من حتی از تصور این موضوع که زمانی ناچار شوم keeper یا anthologize را تغییر دهم به وحشت می افتم در حالیکه برای انجام چنین کاری در مورد fetchmailconf ککم هم نمی گزد.
پرل همچنان کاربردهای خود را دارد. برای پروژه های کوچک (۱۰۰ خط یا کمتر) که شامل مقدار زیادی جور کردن الگوی متن است، من احتمالا بیشتر از یک راه حل با استفاده از پرل استقبال می کنم تا پیتون. برای دیدن چندین مثال خوب، برنامه های timeseries و growplot را در فهرست توزیع fetchmail مشاهده کنید. در حقیقت، این ها تا حد زیادی شبیه کاری هستند که پرل در نقش اصلی خود، قبل از اینکه دارای توابع و دسترسی مستقیم به API سیستم عامل باشد، به عنوان نوعی ترکیب awk/sed/grep/sh انجام می داد. برای هر چیز بزرگتر یا پیچیده تر، من عادت کرده ام که ارزشهای لطیف پیتون را ترجیح بدهم و فکر کنم شما نیز همین کار را انجام بدهید.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri
C# توسط شرکت مایکروسافت ارائه شده که همچون دیگر زبان های برنامهنویسی دارای دو نوع کامپایلر است یک نوع آنcommand line نام دارد که محیطی شبیه محیط Dos را داراست و دیگری Visual است
که محیط ویندوز مانندی دارد یعنی درحقیقت محیط گرافیکی است شاید برایتان جالب باشد که بدانید چنانچه شایع شده است مایكروسافت در مصاف با جاوا، به ارائه برنامه نویسی به زبان #C پرداخته و جالب تر آن است که شباهت های بین این دو زبان بسیار چشمگیر است مایكروسافت در رابطه با میزان استفاده و گسترش زبان فوق ابراز امیدواری نموده بود که گسترش چشمگیر در میان جامعه برنامه نویسان حکایت از صحت پیش بینی ها دارد. این زبان بگونه ای طراحی شده كه نه تنها وابستگی به یك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی Runtime نیز ندارد.
در برخی از نسخه های اولیه كامپایلر زبان #C كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بایت كدهای جاوا كمپایل می كنند.
نکته جالب توجه دیگر آن است که انجمن تولیدكنندگان كامپیوتر اروپا (ECMA) زبان #C را در سوم اكتبر سال 2001 بعنوان یك استاندارد پذیرفتند
طراحان زبان#C سعی کرده اند که نقص های زبان های ++C , C را برطرف نمایند و یا یک سری از نقاط ضعف را کنار گذاشته و یا برخی از امکاناتی را که سبب افزایش "باگدهی" برنامه می شود را حذف نمایند
یادگیری این زبان برای افرادی كه دارای سابقه آشنائی با یكی از زبانهای برنامه نویسی ++C، C و یا جاوا باشند كار مشكلی نیست، حتی افرادی كه دارای آشنائی اولیه با جاوااسكریپت و یا دیگر زبانهای برنامه نویسی همچون Visual Basic می باشند نیز امكان پذیر است ولی اگر شما تاکنون برنامه نویسی نکرده اید هم می توانید با #C آغاز کنید چون زبان ساده و روانی است ، برنامه نویسی مثل یاددادن بستن بند کفش به یک بجه است در صورتی که تمامی مراحل آن کامل آموزش داده نشود بسیار مشکل به نظر می رسد ولی اگر شما به سمت یادگیری این مهم می پردازید مراحل را از ابتدا با نظم و دقت دنبال کنید
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri
در هنگام نوشتن یک برنامه در مواقعی بایستی مقداری را در یک مکان از سیستم کاربر ذخیره کنیم . انتخاب برنامه نویسان در این گونه موارد معمولا از بین سه گزینه ی زیر می باشد :
1- DataBase2- فایل های INI3- رجیستری ( تنها در برنامه نویسی برای سیستم های ویندوزی کاربرد دارد )
استفاده از DataBase : به منظور نگهداری تعداد زیادی از مقادیر ، بهترین گزینه است . همچنین در صورتی که پای امنیت اطلاعات ذخیره شده در میان است ، در انجام این روش شک نکنید . در این روش میتوانید از قابلیت Password Protection که در تمامی بانک های اطلاعاتی وجود دارد ، استفاده کنید .
استفاده از فایل های INI : در بعضی موارد هم میتوان از این روش استفاده کرد . البته این روش همراه با پیچیدگی و امنیت پایین میباشد .
استفاده از رجیستری : روشی که قصد توضیح آن را داریم ، همین روش است . این روش دارای امنیت نسبتا پایینی ست . پس امنیت اطلاعات خود را با این روش به خطر نیاندازید . البته میتوانید اطلاعات خود را به صورت Encrypt شده در رجیستری قرار دهید ( مثلا مواقعی که قصد ذخیره یک رمز عبور ، در یک برنامه ساده را دارید ) . یکی از مزایای این روش سادگی و راحتی آن است .
اگر موافق باشید ، به سراغ مراحل عملی کار برویم :
یک پروژه ی جدید سی شارپ باز کنید و اسم آن را Registry in CS بگذارید .
حالا وارد قسمت کد نویسی شده و Name Space زیر را در قسمت General تعریف کنید :
using Microsoft.Win32;
حالا میتوانید خیلی راحت در هر جایی از برنامتان از کلاس Registry استفاده کنید .
در قسمت زیر اجزای این کلاس را مورد بررسی قرار خواهیم داد :
1- Registry.ClassesRoot
از این قسمت میتوانید برای انجام عملیات مختلف بر روی شاخه HKEY_CLASSES_ROOT استفاده کنید .
چون متدها به صورت Alphabetic مرتب شده اند ، بنده هم آنها را به ترتیب توضیح میدهم . البته در یک مورد استثنا وجود دارد . آن هم متد OpenSubKey هست که باید در ابتدا توضیح بدهم ، چون تعداد زیادی از متدها به این متد وابستگی دارند .
1-1 : OpenSubKey
بوسیله این متد میتوانید یک زیر کلید را باز کنید . برای مثال به کد زیر دقت کنید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
در این کد نکات زیادی وجود دارد .
خط اول : یک متغییر از نوع RegistryKey تعریف کردیم .
خط دوم : مقدار متغییر reg را که در بالا تعریف کرده بودیم ، برابر کلید بازشده ( GC ) قرار دادیم تا بتوانیم عملیات مورد نظر خود را روی کلید باز شده انجام دهیم .
البته اگر خواستید زیر کلیدهای بیشتری را باز کنید ، باید از کد زیر استفاده کنید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GCClsid”,true);
در همان خط دوم یک کلمه true می بینید . شاید بپرسید این کلمه چه معنایی دارد ؟! این کلمه به برنامه میگوید که کاربر دسترسی به این کلید را تایید میکند ( در بعضی مواقع دسترسی باید تایید شود ) .
1- 2 : Close
این متد کلید قبلی را که توسط متد OpenSubKey باز شده بود ، میبندد . بهتر است بعد از هر بار که متد OpenSubKey را به کار میگیرید ، در پایان کارتان متد Close را اجرا کنید .
1- 3 : CreateSubKey
وظیفه این متد ساخت یک زیر کلید است . کد زیر را ببینید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
reg.CreateSubKey(“NewSubKey”);
1- 4 : DeleteSubKey
اگر خواستید یک زیر کلید را حذف کنید ، میتوانید از این متد استفاده کنید . کد زیر همان کلید قبلی را که ساختیم پاک میکند :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
reg.DeleteSubKey(“NewSubKey”);
1- 5 : DeleteSubKeyTree
این متد یک کلید با تمام زیر کلیدهایش و مقادیر زیر مجموعه اش را پاک میکند :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
reg.DeleteSubKeyTree(“NewSubKey”);
1- 6 : DeleteValue
این متد هم که از نامش پیداست . پاک کردن یک مقدار کار این متد است . به کد زیر توجه کنید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
reg.DeleteValue(“Your Value”);
1- 7 : Flush
خوب است در هر قسمتی که کارتان با رجیستری تمام شد ، یک بار این متد را فراخوانی کنید . البته متد Close کار این متد ( Flush ) را هم انجام خواهد داد .
Registry.ClassesRoot.Flush();
1- 8 : GetAccessControl
به MSDN مایکروسافت مراجعه کنید .
1- 9 : GetSubKeyName
با استفاده از این کد میتوانید زیر کلیدهای یک کلید رجیستری را بدست بیاورید . فقط قبل از اینکه کد زیر را اجرا کنید ، یک لیست باکس به فرمتان اضافه کنید و خاصیت Name آن را برابر با listBox قرار دهید :
RegistryKey Reg;
Reg = Registry.CurrentUser.OpenSubKey(“Software”);
//————-
foreach (string strSubKeysName in Reg.GetSubKeyNames())
{
listBox.Items.Add(strSubKeysName);
}
1- 10 : GetValue
این متد میتواند مقدار یک Value را برگرداند . کد زیر را ببینید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
MessageBox.Show(reg.GetValue(“Your Value”).ToString());
1- 11 : GetValueKind
با این متد میتوانید نوع یک Value را دریافت کنید .
انواع Value عبارتنداز :
1- String
2- Binary
3- DWORD
4- Multi-String
5- Expandable
به این کد توجه کنید :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
MessageBox.Show(reg.GetValueKind(“Your Value”).ToString());
1- 12 : GetVlaueNames
با این کد هم میتوانید مقادیر موجود در یک کلید را بدست بیاورید . کد زیر :
RegistryKey Reg;
Reg = Registry.CurrentUser.OpenSubKey(“SoftwareMy APPSettings”);
//————-
foreach (string strSubKeysName in Reg.GetValueNames())
{
listBox1.Items.Add(strSubKeysName);
}
1- 13 : Name
این یکی هم مسیر جاری رجیستری را برمیگرداند :
RegistryKey reg;
reg = Registry.ClassesRoot.OpenSubKey(“GC”,true);
MessageBox.Show (reg.Name);
1- 14 : SetAccessControl
به MSDN مایکروسافت مراجعه کنید .
1- 15 : SetValue
بوسیله این متد میتوانید یک مقدار را در رجیستری بنویسید :
RegistryKey Reg;
Reg = Registry.LocalMachine.OpenSubKey(“SOFTWARE”, true);
//————-
Reg.SetValue(“My Value”, “Program”,RegistryValueKind.String);
یک نکته در این کد وجود دارد . در خط سوم کدها آنجا که نوشته شده RegistryValueKind.String ، اینجا نوع متغییر تنظیم شده است . انواع متغیر ها را میتوانید در راهکار 1- 11 مشاهده کنید .
1- 16 : SubKeyCount
این یکی هم تعداد زیر کلیدهای یک کلید رجیستری را بازگشت خواهد داد :
RegistryKey Reg;
Reg = Registry.LocalMachine.OpenSubKey(“SOFTWARE”, true);
//————-
MessageBox.Show(Reg.SubKeyCount.ToString());
1- 17 : ValueCount
و اما آخرین مورد . بوسیله این تابع میتوانید تعداد متغییرهای داخل یک کلید را بدست بیاورید .
RegistryKey Reg;
Reg = Registry.LocalMachine.OpenSubKey(“SOFTWARE”, true);
//————-
MessageBox.Show(Reg.ValueCount.ToString());
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

تاریخچه زبان دلفی
دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borland از زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsberg در 15 سال پیش به بازار عرضه کرد.
برنامه نویسی به زبان پاسکال در سالیان سال از استواری و ثبات، زیبایی و ظرافت و البته سرعت بالای کامپایل سود برده است. دلفی هم از این قاعده مستثنی نیست. کامپایلر دلفی ترکیبی از بیش از یک دهه تجربه طراحی کامپایلر پاسکال و معماری بهبود یافته کامپایلر های 32 بیتی است. اگرچه قابلیت های کامپایلرها با گذشت زمان پیشرفت قابل توجهی داشته است ولی سرعت آن چندان کاهش نیافته و همچنان از سرعت بالایی برخوردار است. به علاوه استحکام و قدرت کامپایلر دلفی معیاری برای سنجش دیگر کامپایلر هاست.
در اینجا به بررسی تفصیلی روند حرکتی دلفی در هر یک از نسخه های آن می پردازیم و مشخصات مهم آن را بررسی می کنیم.
سال 1995 - Delphi1
در زمان استفاده از سیستم عامل DOS برنامه نویسان مجبور بودند از بین زبان پر قدرت ولی کم سرعت Basic و زبان کارآمد ولی پیچیده و نامفهوم Assembly یکی را انتخاب کنند. پاسکال با ارائه یک زبان ساخت یافته و یک کامپایلر سریع و کم نقص این شکاف را پرکرد. برنامه نویسان Windows 3.1 هم با تصمیم گیری مشابهی رو برو شدند. یکی زبان قدرتمند و سنگین ++C و یکی زبان ساده و محدود کننده Visual Basic .
ارائه Delphi1 در این مورد هم راه حل خوبی برای برنامه نویسان بود. دلفی مجموعه متفاوتی برای برنامه نویسی بود . طراحی و توسعه برنامه های کاربردی، ایجاد DLL ها، پایگاههای داده و ... که یک محیط ویژوال وسیع را تشکیل می داد. Delphi1 اولین ابزار برنامه نویسی ویندوز بود که محیط طراحی ویژوال، کامپایلر بهینه کد برنامه و دسترسی قوی به پایگاههای داده را در یک جا جمع کرد که آن را به یکی از بهترین ابزارهای روش نوین توسعه سریع نرم افزار (Rapid Application Development ) تبدیل کرد. این مجموعه قدرتمند باعث شد که در همان زمان بسیاری از برنامه نویسان زبانهای دیگر به Delphi روی بیاورند و این موفقیت بزرگی برای Borland به حساب می آمد. همچنین بسیاری از برنامه نویسان پاسکال دلفی را ابزاری یافتند که توسط آن هم از توانایی و تجربه خود در برنامه نویسی پاسکال استفاده می کردند و هم توانایی کار در ویندوز را به دست آوردند. همچنین زبانی که در آن زمان با نام پاسکال شیئی (ObjectPascal ) در دانشگاهها ایجاد شده بود یک زبان بسیار خشک و محدود کننده بود که اصلاٌ حالت کاربردی پیدا نکرد.
ویژگیهای دلفی مثل طراحی ظاهری حساب شده و کاربر پسند آن باعث شد که زبان پاسکال شیئی عملاٌ از رده خارج شود. تیم طراحی VB در Microsoft قبل از حضور دلفی هیچ رقیب مهمی برای خود نمی دید. VisualBasic در آن زمان زبانی نا کارآ ، کم سرعت و کند ذهن بود. Visual Basic 3 در عمل اصلا توانایی رقابت با Delphi 1 را نداشت. در این سال شرکت Borland گرفتار یک سری مشکلات قضائی با شرکت Lotus بود که در نهایت هم متخلف شناخته شد. همچنین درگیری مشابهی هم با Microsoft بر سر تلاش در تغییر دادن فضای نرم افزار های Microsoft پیدا کرد. همچنین Borland مشغول طراحی و فروش طرح Quatro به شرکت Novell و طراحی پایگاه های داده dBase و Paradox بود که با استقبال قابل توجهی مواجه نشد.
در این زمان که Borland مشغول فعالیتهای قضایی و تجاری بود Microsft توانست گوی سبقت را از Borland برباید و قسمت اعظم بازار ابزار های برنامه نویسی تحت Windows را در اختیار بگیرد و سعی می کرد تا این طرز فکر را اشاعه دهد که چون Windows را طراحی کرده صلاحیت و توانایی تهیه بهترین ابزار های برنامه نویسی تحت آن را نیز در دست دارد. در این شرایط Borland با عرضه Delphi و نسخه جدید ++Borland C سعی کرد خدشه ای در فرمانروایی Microsoft وارد کند و سهمی در بازار بزرگ این محصولات داشته باشد.
سال 1996 - Delphi2
یک سال بعد Delphi2 تمام مزایای نسخه قبلی را تحت سیستم های جدید 32 بیتی (Windows 95,Windows NT ) ارائه داد. همچنین Delphi2 با ارائه خصوصیات اضافه و کارکرد های قویتری نسبت به Delphi1 توانایی های خود را افزایش داد. (ازجمله ارائه کامپایلر 32 بیتی که سرعت بالایی به نرم افزار ها می بخشید، کتابخانه بزرگ و کاملی از اشیای مختلف، شیوه جدید و تکامل یافته ای برای اتصال به پایگاه های داده مختلف، ادیتور پیشرفته، پشتیبانی از OLE ، توانایی وراثت در فرمهای ویژوال و سازگاری با پروژه های 16 بیتی Delphi1 ). Delphi2 به معیاری برای سنجش و مقایسه همه ابزارهای توسعه نرم افزار در آن زمان تبدیل شد.
در آن زمان با ارائه سیستم 32 بیتی Windows95جهش بزرگی در سیستم عامل Windows رخ داد و Borland بسیار مشتاق بود که Delphi را به بهترین ابزار برنامه نویسی سیستم جدید تبدیل کند. نکته این که در آن زمان به منظور تاثیر در افکار عمومی و تاکید بر قدرت Delphi در سیستم عامل 32 بیتی قرار بود که نرم افزار با نام جدید Delphi32 به بازار عرضه شود ولی در آخرین مراحل به خاطر اینکه نشان دهند این زبان زبانی رشد یافته و تکامل یافته نسخه قبلی یعنی Delphi1 است نام Delphi2 را برای آن انتخاب کردند.
Microsoft تلاش کرد که با Visual Basic 4 با Delphi مقابله کند ولی از ابتدا کیفیت پایین آن و ضعف آن در انتقال برنامه های 16 بیتی به سیستم 32 بیتی و بروز اشکالات ساختاری در طراحی آن موجب شکست زودهنگام Visual Basic 4 شد. در این زمان هنوز تعداد زیادی از برنامه نویسان به Visual Basic وفادار بودند. Borland هنچنین روشها و ابزارهای قدرتمندی همچون PowerBuilder برای طراحی نرم افزار های Client/Server ارائه داد ولی Delphi هنوز آن قدر قدرتمند نشده بود که بتواند نرم افزارهایی که جایی در بین توسعه گران پیدا کرده اند را براندازد.
سال 1997 - Delphi3
از زمان تهیه و توسعه Delphi1 تیم توسعه Delphi در فکر گسترش و ایجاد یک زبان قدرتمند جهانی بود. برای Delphi2 این تیم تمام نیروی خود را صرف اعمال مربوط به انتقال تواناییها و کارکرد ها به سیستم 32 بیتی و همچنین اضافه کردن خصوصیات Client/Server و پایگاه داده کرد. در زمان تهیه Delphi3 تیم توسعه فرصت لازم برای گسترش مجموعه ابزار موجود را یافت و در این راستا کیفیت و کمیت ابزارهای Delphi بهبود یافت. به علاوه راه حل هایی برای مشکلات عمده و قدیمی برنامه نویسان تحت ویندوز ارائه شد. به ویژه استفاده از برخی فناوری های پیچیده و نا مفهوم (مثل COM و ActiveX وتوسعه نرم افزار های تحت Web وکنترل پایگاههای داده چند کاربره). روش نمایش کد برنامه همچنین توانایی کامل کردن خودکار کد (Code Completion ) عملیات کد نویسی را راحت تر کرد. ضمن این که همچنان در بیشتر موارد اساس و متدولوژی برنامه نویسی مانند Delphi1 بود و بر پایبندی به قوانین اصولی Pascal تاکید می شد.
در این زمان رقابت شرکت های تولید کننده ابزار های برنامه نویسی بسیار تنگاتنگ شده بود. Microsoft با ارائه Visual Basic 5 به پیشرفت های خوبی دست یافت ازجمله پشتیبانی قوی از COM و ActiveX و ایجاد برخی خصوصیات و تغییرات کلیدی و اساسی در کامپایلر VB . ضمن این در همین سال Borland با پشتوانه قوی Delphi و با استفاده از ساختار موفق آن ابزارهای دیگری همچون Forte و BC++ Builder به بازار عرضه کرد.
تیم Delphi در زمان طراحی Delphi3 چند تن از اعضای کلیدی خود را از دست داد. Andres Hejlsberg معمار اصلی Delphi در اقدام غیر منتظره ای Borland را ترک کرد و تصمیم گرفت به رقیب دیرینه یعنی Microsoft بپیوندد. اما حرکت تیم Delphi متوقف نشد و معاون Hejlsberg که سالها تجربه همکاری با او را داشت توانست رهبری این تیم را به خوبی در دست بگیرد. همچنین مسئول فنی تیم (Paul Gross ) هم در اقدام مشابهی به گروه Microsoft ملحق شد. این تغییرات بیشتر به خاطر اختلافات شخصی بین افراد تیم بود و نه به خاطر مسائل حرفه ای.
سال 1998 - Delphi4
Delphi4 بیشتر بر روی راحتتر کردن کار با دلفی متمرکز شد. مرورگر روال ها (Module Explorer ) بهبود یافت و مرور و ویرایش Unit ها را راحت تر کرد. کنترل کد و کامل کردن خودکار کلاسها این فرصت را به کاربر داد که فکر و زمان خود را روی ساختار اصلی برنامه بگذارد و در وقت صرفه جویی کند. طراحی رابط کاربر هم کاملاٌ عوض شد و بهبود یافت و اشکال زدا (Debugger ) نیز پیشرفت قابل توجهی داشت. Delphi4 قابلیتهای برنامه نویسان را در استفاده از تکنولوژیهای چند منظوره خارجی مثل MIDAS ، DCOM ، MIS و Corba افزایش داد.
در این سال Delphi جایگاه خود را در رقابت با دیگران مستحکم کرده بود و کم کم به سمت دست یابی به سودآوری مالی مورد نظر خود پیش می رفت. در واقع در این زمان بود که حاصل کار سنگین چند ساله تیم نمایان می شد. بعد از سالها آزمایش Delphi شهرت و محبوبیت خاصی پیدا کرد و دیگر برنامه نویسان Delphi توانایی جدا شدن از آن را نداشتند. در این زمان Borland به کار سوٌال برانگیزی دست زد و به منظور تبلیغ بیشتر و برتری در جنگ روانی با دیگر شرکتها نام Inprise را برای فعالیتهای تجاری خود برگزید.
ابزار های مربوط به فن آوری Corba را گسترش داد تا راه جدیدی برای سودآوری ایجاد کند. برای موفقیت در این زمینه Corba نیاز به رابط کاربر قدرتمندی داشت که در کنار توانایی های آن کار کردن با آن نیز راحت باشد. دقیقاٌ همان کاری که در سالهای قبل در مورد COM و برنامه نویسی تحت Web انجام شده بود و به موفقیت دست یافته بود. با این وجود بنا به دلایل مختلفی این گسترش و توسعه Corba هیچ وقت تکامل و موفقیتی که مورد نظر بود را به دست نیاورد و بر خلاف تبلیغات و سرمایه گذاری های انجام شده فن آوری Corba تنها توانست نقش کوچکی در روند رو به جلوی Delphi ایفا کند.
سال 1999 - Delphi5
Delphi5 در برخی زمینه ها پیشرفت های قبلی را ادامه داده است. اولاٌ مسیری را که Delphi4 با اضافه کردن ویژگیهای زیادی شروع کرده بود ادامه داد. Delphi4 باعث شد کارهایی که قبلاٌ به صرف وقت زیادی احتیاج داشت بسیار سریعتر انجام شود. Delphi به شکل امیدوار کننده ای به برنامه نویس این امکان را می دهد که بیشتر به برنامه ای که میخواهد بنویسد توجه کند و نه به قواعد برنامه نویسی و نوشتن کد های تکراری و خسته کننده. این ویژگیهای سودمند شامل رابط کاربر بهبودیافته و سیستم اشکال زدایی(Debugger ) توانمند ، امکانات برنامه نویسی تیمی و ابزار های ترجمه می شود.
ثانیا Delphi5 خصوصیات جدیدی را در بر می گیرد که توسعه برنامه های تحت وب را واقعاٌ راحت کرده است. این ویژگیها شامل طراح اشیای مربوط به ASP برای ساختن صفحات (Active Server Page )، اشیایی موسوم به Internet Express برای پشتیبانی از XML و خصوصیات جدید MIDAS که آن را به یک ابزار همه کاره در پایگاه های داده تحت Web تبدیل کرد. در نهایت با صرف وقت ، هزینه و صبر زیاد توانست Delphi5 قدرتمند را عرضه کند. این فعالیت مدتها به طول انجامید و قبل از عرضه عمومی، Delphi5 بارها در بازبینی ها و آزمایشهای داخلی قسمتهای مختلف آن تغییر کرد و بهبود یافت.
Delphi5 در نیمه دوم سال 1999 به بازار عرضه شد و به نفوذ و تسلط بر بازار ادامه داد. در این زمان Visual Basic که کم کم به عضوی تحقیر آمیز برای Microsoft تبدیل می شد هم با پیشرفتهایی توانست در رقابت دوام بیاورد و از صحنه خارج نشود. در اقدام درست و به جایی نام Inprise دوباره به Borland بازگشت. این اقدام از سوی طرفداران و مشتریان قدیمی Borland با استقبال خوبی مواجه شد.
سال 2001 – Delphi6
در هنگام تهیه Delphi6 ساختار Delphi در زمینه های مختلف شکل گرفته بود و به یک تکامل نسبی رسیده بود. این مسئله باعث شد که تیم طراحی بتواند وقت خود را بر روی طرحی که مدتها تنها در حد یک نظریه بود بگذارد و آن را بسیار زودتر از آن که انتظار می رفت عملی کند: گام نهادن به محیط های فراتر از Windows . بیشتر نیروی توسعه گران Delphi در این مدت صرف رهانیدن Delphi از بند Windows شد که این خود در درجه اول مبارزه ای آشکار با سلطه Microsoft بود و ثانیاٌ راه برنامه نویسان را به سوی فضا های دیگر برنامه نویسی باز کرد. در ابتدا این عمل ریسک بزرگی بود و بیم آن می رفت که جایگاه Delphi در Windows هم به خطر بیفتد ولی در نهایت به نقطه رشد و قوتی بدل شد که Delphi را به یکی از بهترین ابزار برنامه نویسی Multi Platform تبدیل کرد.تکنولوژی CLX روالهای مختلف Delphi را با Kylix (عضو جدید خانواده Borland که در فضای Linux کار می کند) به اشتراک گذاشت و استفاده از سیستم بایت Java باعث شد که Delphi حتی از قید سخت افزار هم رها شود.
به نظر می رسد که این فعالیتها باعث ثبات Delphi در دنیای برنامه نویسان شود و نگرانی های Borland و برنامه نویسان که همیشه می ترسیدند که مبادا با ضعیف شدن Windows جایگاه خود را از دست بدهند حال به افتخار و آرامش برای آنان و نگرانی برای طرفداران Microsoft تبدیل شده است.
مدیریت حافظه در دلفی
تخصیص خودکار حافظه
وقتی شما از نوع های پایه (Integer ،real ،word و…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
var
Name : String; {256 Bytes}
X, Y : Integer; {4 + 4 = 8 Bytes}
List : array [0..10] of Double; {8 * 11 = 88 Bytes}
Today : TDay; {1 Byte}
دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.
تخصیص حافظه دینامیکی
در این حالت برنامه نویس احتیاج دارد تا انباره حافظه را شخصا" تخصیص و آزاد کند.
نوع Pointer
اشاره گرها در دلفی می توانند شکل های مختلفی را در برگیرد. نخست، نوع اشاره گری که یک آدرس حافظه را برای نوع ویژه ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed
Pointer ()
var
Number : ^Integer;
Name : ^String;
دوم، اشاره گرهای بدون نوع. اشاره گرهای بدون نوع (Untyped Pointers ) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت هایی مثل اینکه باید به نوع خاصی اشاره (Point ) کند را ندارد.
var
Something : Pointer;
حال اشاره گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه ای تخصیص نمیشود.
begin
New(Something) ;
Dispose(Something) ;
end ;
برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:
type
IntPtr = ^Integer ;
var
Something : Pointer ;
begin
Something := New(IntPtr) ;
Integer(Something^) := 10 ;
Dispose(Something) ;
end ;
تخصیص بلاکی از حافظه
ما می توانیم از اشاره به بلاک هایی از تخصیص حافظه در سیستم استفاده کنیم. این کار را با رویه های GetMem و FreeMem برای تخصیص و آزاد سازی حافظه استفاده میکنیم.
var
Something : Pointer
begin
GetMem(Something, 100) ;
FreeMem(Something, 100) ;
end ;
اشاره به حافظه از قبل تخصیص داده شده
هر دو نوع اشاره گرها می توانند به هر جایی از حافظه اشاره بکنند. این بدان معناست که آنها می توانند اشاره به فضای اشغال شده با داده هایی که در حال حاضر موجودند داشته باشند. این نمونه اشاره گر احتیاجی به تخصیص حافظه ندارد.
var
Something : Pointer ;
MyString : PChar; // type PChar = ^Char ;
begin
GetMem(Something, 100) ;
MyString := Something ;
StrCopy(Something, 'Hello World’) ;
FreeMem(Something, 100) ;
end ;
حافظه Heap
Heap شامل قسمتی از حافظه موجود در یک برنامه است که آنرا حافظه پویا می نامیم. Heap بخشی است که در آن تخصیص و تعریف حافظه به صورت تصادفی (Random ) اتفاق می افتد. این به آن معناست که اگر شما سه بلاک از حافظه را به طور متوالی تخصیص دهید، می توانید بعد از هر دستور آنرا از بین ببرید. مدیر Heap جزئیات را برای شما نگهداری می کند. بنابراین شما به سادگی می توانید یک حافظه جدید را با GetMem و یا بوسیله صدا زدن constructor هنگام ساختن یک شی درخواست کنید و دلفی به شما یک بلاک جدید را برخواهد گرداند. Heap یکی از سه فضای موجود در برنامه کاربردی را استفاده کرده و دوتای دیگر به صورت فضای یکپارچه (Global ) و پشته قرار می گیرند.
حافظه Stack
Stack شامل قسمتی از یک بخش از حافظه موجود یک برنامه است که دینامیکی است اما برای تخصیص و آزادسازی فرامین مخصوص دارد. تخصیص Stack به صورت LIFO می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین های نوعی استفاده می شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

نكات مفید كار در محیط دلفی
محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی IDE آنهم قدرت بسیار زیادی دارد که باعث شده یکی از بهترین ادیتورها باشد. در این مقاله من سعی بر این داشته ام تا با ارائه یک سری از نکات و کلیدهای میانبر که می توانند برای کار در دلفی بسیار مفید و کارا باشند، کمک کنم تا شما بتوانید با قدرت بیشتر به برنامه نویسی و کار در این محیط قدرتمند ادامه دهید.
جستجو در متن بصورت مستقیم:
برای اینکار کلیدهای Ctrl+E را بفشارید و بدنبال آن شروع به تایپ کلمه مورد نظر کنید نتیجه آن را خود ببینید. برای اینکه به کلمه بعدی بروید کافیست کلید F3 را بزنید.
ایجاد فرورفتگی در کد:
بعضی اوقات - که خیلی هم پیش می آید - لازم است که یک مقداری از متن را بصورت بلوک شده به جلو و یا عقب ببریم. منظور دندانه دار کردن متن است که به خوانایی برنامه کمک می کند. برای اینکار می تونید از کلید Ctrl +Shift+I برای جلو بردن و Ctrl+Shift+U برای عقب برگرداندن متن بلوک شده استفاده کنید.
پرش به قسمت تعریف یک شی (Object ):
ببنید شی مورد نظرتون (از قبیل VCL, Procedure, Function ,...) در کجا و چطور تعریف شده می توانید کلید Crtl رو پایین نگه داشته و روی شی مورد نظر Click کنید.
برای تغییر حالت کاراکترها:
شما می توانید یک قسمت از متن (که ممکن است با حروف بزرگ و یا کوچک تایپ شده باشد) را انتخاب کنید و با زدن کلیدهای Ctrl+O+U به ترتیب تمامی حروف کوچک آن قسمت از متن را به حروف بزرگ و تمامی حروف بزرگ آنرا به حروف کوچک تبدیل کنید. برای تعییر حالت یک کلمه نیز میتوانید روی کلمه مورد نظر رفته و کلیدهای Ctrl+K+F برای بزرگ کردن و کلیدهای Ctrl+K+E را برای کوچک کردن حروف آن کلمه بکار برد.
درست کردن ماکرو متنی:
این امکان بسیار مفید است و می تواند بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای Ctrl+Shift+R را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای Ctrl+Shift+R را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید.
انتخاب متن بصورت مربعی:
اگر شما از کهنه کارهای کامپیوتر باشید حتما از زمان داس یادتون هست که برنامه ای بود به نام PE2 که یکی از امکانات بسیار جالبش این بود که یک مربع از متن رو میتوانستین انتخاب کنید و آنرا کپی یا حذف کنید. بله درست متوجه شدید در محیط دلفی هم شما اینکار را میتوانید انجام دهید اما نه به مشکلی PE2 بلکه اینکار را میتوانید فقط با گرفتن کلید Alt و کشیدن موس روی متن انجام دهید. هر چند ممکن است در نگاه اول زیاد این امکان مفید به نظر نیاید ولی بعضی وقتهای خیلی کار را راحت میکنه، که حتماً تجربه خواهید کرد.
گذاشتن علامت روی متن:
این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای Ctrl+Shift را نگه دارید و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.
ایجاد کلاس مورد نظر:
شما هنگامی که در قسمت Private و یا Public یک type ، روال یا تابع درست کردید لازم دارید که قسمتی را برای قرار دادن کدهای مربوط به آن روال یا تابع را ایجاد کنید. برای اینکار شما پس از اینکه نام تابع را تایپ کردید می توانید کلیدهای Ctrl+Shift+C را فشار دهید تا دلفی یک قسمت برای نوشتن کدهای مورد نظرتان ایجاد کند.
ظاهر کردن پنجره Code insight :
شما حتما به اهمیت و مفید بودن این قسمت دلفی واقفید که در هنگام کد نویسی تا چه حد می تواند کارها را راحت کند. بله در هنگام وارد کردن کدها بعد از وارد کردن نام یک کلاس و یا Object با زدن یک نقطه (.) پنجره Code Insight ظاهر می شود. حال در بعضی وقتها شما ممکن است که نقطه را قبلا وارد کرده باشید و یا در مواقع دیگر این پنجره ظاهر نشود. در این صورت برای اینکه پنجره را ظاهر کنید باید دوباره نقطه را وارد کنید ولی راه آسانتری هم وجود دارد و آن اینست که کلیدهای Ctrl+Speacebar را فشار دهید.
ظاهر کردن پنجره Code Parameter :
همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنمای توابع که معمولاً بعد از گذاشتن پرانتز مربوط ظاهر میشود و در مورد پارامترهای لازم می باشد نیز می توانید از کلیدهای Ctrl+Shift+SpaceBar استفاده کنید.
رفتن از قسمت تعریف توابع و روالها به قسمت کد آنها:
همیشه این نیاز وجود خواهد داشت که شما در هنگامی که دارید به دنبال یک روال در قسمت type میگردید بعد از پیدا کردن نام آن می خواهید که خود آن تابع یا روال را نیز ببنید. برای اینکار خوب حتما نام آن را جستجو میکنید ولی یک راه آسانتر اینست که شما روی نام آن تابع قرار گیرید و کلیدهای Ctrl+Shift+Up/Down را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.
آرایه ها در دلفی
دلفی به ما امکان می دهد آرایه هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
var
array[indexType1, ..., indexTypen] of baseType ;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
d(.i.):= 3 + i; // Equivalent d:= 3 + i ;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
var
A : array [Boolean] of integer ;
begin
A[True] := 50 ;
A[False] := 100 ;
end ;
نکته: توابع Low و High کران های پایین وبالای یک متغییر آرایه ای یا نوعی یا ترتیبی را بر میگردانند:
for I := 0 to High(X) do S := S + X ;
آرایه های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) ;
const
DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday’ ,
'Wednesday', 'Thursday’ ,
'Friday', 'Saturday’) ;
var
Today : TDay ;
begin
Today := TDay(DayOfWeek(Date) – 1) ;
ShowMessage('Today is ' + DayNames[Today] + '!' ) ;
end ;
آرایه های دینامیکی:
آرایه های دینامیکی، آرایه های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
var MyFlexibleArray: array of Real ;
قبل از به کار گیری آرایه های دینامیکی، ابتدا باید از رویه SetLength برای تخصیص حافظه آرایه استفاده کرد:
SetLength (MyFlexibleArray, 2) ;
نکته: آرایه های دینامیکی همیشه مبتنی بر صفر می باشند.
نکته: شما می توانید آرایه های دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:
MyFlexibleArray := nil ;
نکته: مقدار حافظه ای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایه ای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص می یابد.
فشرده سازی آرایه ها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید می توانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید:
type TNumbers = packed array[1..100] of Real ;
نکته: استفاده از packed سرعت دسترسی به اطلاعات را کند میکند. در مورد آرایه ای از کاراکترها این مورد سازگارتر می باشد.
آرایه های چند بعدی دینامیکی:
برای تعریف آرایه های چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال:
type
TMessageGrid = array of array of string ;
var
Msgs: TMessageGrid ;
این تعریف یک آرایه دو بعدی از رشته ها می باشد. سپس باید به آرایه خود فضا نسبت داد:
SetLength(Msgs, I, J) ;
شما می توانید آرایه های چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular ) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید:
var
Ints: array of array of Integer ;
SetLength(Ints, 10) ;
ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازه های مختلف) تخصیص دهید:
SetLength(Ints[2], 5) ;
تغییر Hint برای هر ستون از DBGrid در دلفی
ابتدا باید یک عنصر جدید مبتنی بر TDBGrid ایجاد کنید و رویداد OnMouseMove را فراخوانی کنید:
type
TMyDBGrid = class(TDBGrid)
published
property OnMouseMove ;
end ;
اگرچه شما در رویداد OnMouseMove مختصات X و Y را بدست خواهید آورد، اما شما باید ستون مورد نظر را پیدا کنید. برای ادامه کار لازم است که سطر زیر را در قسمت protected قرار دهید:
procedure WMMouseMove(var Message : TWMMouse); message WM_MOUSEMOVE ;
همچنین متغیر های زیر را در قسمت public اضافه نمایید:
MouseRow : integer ;
MouseCol : integer ;
بنابراین متد WMMouseMove بصورت ریر خواهد بود:
procedure TMyDBGrid.WMMouseMove(var Message : TWMMouse) ;
var
t : TGridCoord ;
begin
t := MouseCoord(Message.XPos, Message.YPos) ;
MouseCol := t.x ;
MouseRow := t.y ;
inherited ;
end ;
ما ابتدا فیلدهای XPost و YPos را از ساختار WMMouseMove تنظیم میکنیم:
procedure TForm2.MyDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y :
Integer) ;
begin
if (((dgIndicator in MyDBGrid1.Options) and (MyDBGrid1.MouseCol > 0)) or
((not (dgIndicator in MyDBGrid1.Options)) and (MyDBGrid1.MouseCol <> -1)))
and (MyDBGrid1.MouseCol <> OldMouseCol) then begin
OldMouseCol := MyDBGrid1.MouseCol ;
if dgIndicator in MyDBGrid1.Options then
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol - 1].FieldName
else
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol].FieldName ;
end ;
end ;
حالا مجددا" تعریف زیر را در قسمت public قرار دهید:
HintMouseMessage(Control : TControl; var Message : TMessage)
در قسمت OnMouseMove از TDBGrid نیز فرامین زیر را اضافه نمایید:
var
r : TMessage ;
begin
Application.HintMouseMessage(self, r) ;
TWMMouse(r).XPos := X ;
TWMMouse(r).YPos := Y ;
Application.HintMouseMessage(MyDBGrid1, r) ;
end ;
همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

نمایش میزان كپی شدن فایل با ProgressBar در دلفی
چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBar نمایش داد؟
برای انجام این کار ابتدا بر روی یک فرم یک ProgressBar اضافه کنید سپس تابع زیر را تایپ کنید:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string) ;
var
FromF, ToF: file of byte ;
Buffer: array[0..4096] of char ;
NumRead: integer ;
FileLength: longint ;
begin
AssignFile(FromF, Source) ;
reset(FromF) ;
AssignFile(ToF, Destination) ;
rewrite(ToF) ;
FileLength := FileSize(FromF) ;
with Progressbar1 do
begin
Min := 0 ;
Max := FileLength ;
while FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead) ;
FileLength := FileLength - NumRead ;
BlockWrite(ToF, Buffer[0], NumRead) ;
Position := Position + NumRead ;
end ;
CloseFile(FromF) ;
CloseFile(ToF) ;
end ;
end ;
در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا یک دکمه اضافه کرده کد زیر رو اضافه نمایید:
procedure TForm1.Button1Click(Sender: TObject) ;
begin
CopyFileWithProgressBar1('c:Welcome.exe', 'c:tempWelcome.exe’) ;
end ;
چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟
برای این کار نیز میتوانید از تابع زیر استفاده کنید:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string) ;
var
FromF, ToF: file of byte ;
Buffer: array[0..4096] of char ;
NumRead: integer ;
FileLength: longint ;
t1, t2: DWORD ;
maxi: integer ;
begin
AssignFile(FromF, Source) ;
reset(FromF) ;
AssignFile(ToF, Destination) ;
rewrite(ToF) ;
FileLength := FileSize(FromF) ;
with Progressbar1 do
begin
Min := 0 ;
Max := FileLength ;
t1 := TimeGetTime ;
maxi := Max div 4096 ;
while FileLength > 0 do
begin
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead) ;
FileLength := FileLength - NumRead ;
BlockWrite(ToF, Buffer[0], NumRead) ;
t2 := TimeGetTime ;
Min := Min + 1 ;
// Show the time in Label1
label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100) ;
Application.ProcessMessages ;
Position := Position + NumRead ;
end ;
CloseFile(FromF) ;
CloseFile(ToF) ;
end ;
end ;
در این تابع ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.
((t2 - t1) / min * maxi - t2 + t1) / 100
نصب ProgressBar روی StatusBar در دلفی
انجام این کار بسیار ساده است. برای این کار کافی است بر روی فرم خود یک StatusBar اضافه نمایید حالا در قسمت تعاریف متغیر های عمومی کد زیر را بنویسید:
ProgressBar1: TprogressBar ;
در ادامه دستورات زیر را در خاصیت OnCreate فرم خود بنویسید:
var
ProgressBarStyle: LongInt ;
begin
{create a run progress bar in the status bar}
ProgressBar1 := TProgressBar.Create(StatusBar1) ;
ProgressBar1.Parent := StatusBar1 ;
{remove progress bar border}
ProgressBarStyle := GetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE) ;
ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE ;
SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE, ProgressBarStyle) ;
{set progress bar position and size - put in Panel[2]}
ProgressBar1.Left := StatusBar1.Panels.Items[0].Width +
StatusBar1.Panels.Items[1].Width + 4 ;
ProgressBar1.Top := 4 ;
ProgressBar1.Height := StatusBar1.Height - 6 ;
ProgressBar1.Width := StatusBar1.Panels.Items[2].Width - 6 ;
{set range and initial state}
ProgressBar1.Min := 0 ;
ProgressBar1.Max := 100 ;
ProgressBar1.Step := 1 ;
ProgressBar1.Position := 0 ;
end ;
حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در قسمت OnDestroy در Event فرمتان دستور زیر را اضافه نمایید:
ProgressBar1.free ;
استفاده از DLLها در دلفی
ایجاد یک DLL
با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید. باید در فایل DLL بصورت زیر کد نویسی نمایید:
library demodll ;
{Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.}
uses
SysUtils ,
Classes ,
UDemo in 'UDemo.pas' {Demo} ;
{ $R *.res}
procedure ShowdemoForm;stdcall ;
begin
Demo :=Tdemo.Create(nil) ;
demo.Show ;
end ;
function ShowdemoFormModal:integer;stdcall ;
begin
demo :=Tdemo.Create(nil) ;
Result := demo.ShowModal ;
end ;
Exports
ShowDemoForm ,
ShowdemoFormModal ;
begin
end .
دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره گردیده است.
حال بر روی فرم موجود تمام دکمه ها و آبجکت های مورد نظرتان را اضافه و کد نویسی کنید (اختیاری). در پایان در منو Project گذینه Build DemoDll را انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dll ایجاد می گردد که برای استفاده آماده است.
استفاده از یک DLL بصورت دینامیکی
برای استفاده از یک DLL بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود است بصورت زیر تعریف نمایید:
unit UMain ;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ,
Dialogs, StdCtrls, ExtCtrls ;
type
TShowdemoFormModal= Function :integer ;
.
.
.
دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:
var
hndDLLHandle:THandle ;
ShowdemoFormModal:TShowdemoFormModal ; procedure TFMain.Button1Click(Sender: TObject) ;
begin
try
hndDLLHandle:=LoadLibrary('Demodll.dll’) ;
if hndDLLHandle <> 0 then begin
@ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal’) ;
if addr(ShowdemoFormModal) <> nil then begin
ShowdemoFormModal ;
end
else
showmessage ('function not exists …’) ;
end
else
showMessage('Dll Not Found!’) ;
finally
freelibrary(hndDLLHandle) ;
end ;
end ;
محدودكردن تغییر اندازه فرم در دلفی
گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages ، تابع WM_GetMinMaxInfo میباشد.
unit MinMax ;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls ,
Forms, Dialogs ;
type
TForm1 = class(TForm)
private
{Private declarations}
procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo ;
public
{Public declarations}
end ;
var
Form1: TForm1 ;
implementation
{ $R *.DFM}
procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage) ;
Begin
inherited ;
with PMinMaxInfo(MSG.lparam)^ do
begin
with ptMinTrackSize do
begin
X := 300 ;
Y := 150 ;
end ;
with ptMaxTrackSize do
begin
X := 350 ;
Y := 250 ;
end ;
end ;
end ;
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ : پنجشنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

یک برنامه کامپیوتری ، از مجموعه ای دستورالعمل که نوع و نحوه انجام یک فعالیت را برای کامپیوتر مشخص می نمایند ، تشکیل می گردد.
دستورالعمل های نوشته شده بعنوان نمونه ممکن است به کامپیوتر اعلام نمایند که تعدادی از اعداد را با یکدیگر جمع و یا دو عدد را بایکدیگر مقایسه و بر اساس نتیجه بدست آمده ، اتخاذ تصمیم نماید. دستورالعمل های نوشته شده ، صرفا" برای کامپیوتر قابل فهم و اجراء خواهند بود.
کامپیوتر دستورالعمل های نوشته شده را اجراء و ماحصل آن رسیدن به اهدافی خواهد بود که بر اساس آن برنامه طراحی و پیاده سازی شده است . دستورالعمل ها ، می بایست با استفاده از یکی از زبانها ی برنامه نویسی نوشته شده ( کد ینگ ) و در ادامه در اختیار کامپیوتر قرار داده شوند.
زبانهای برنامه نویسی متعددی نظیر : فرترن ، بیسیک ، کوبال ، پاسکال، ،C ، جاوا ، ویژوال بیسیک و ... وجود دارد .
برنامه نویسی کامپیوتر ، مشابه آموزش گره زدن کفش به کودکان است . برای نیل به هدف فوق ، می بایست تمامی مراحل لازم بصورت شفاف به کودکان آموزش داده شود . کودکان با دنبال نمودن دستورالعمل های ارائه شده ، قادر به گره زدن کفش خود خواهند بود ( روش انجام این کار برای آنان مشخص شده و بر اساس آن ، امکان نیل به هدف مورد نظر توسط کودکان فراهم می گردد ).
VB.NET زبانی است که می توا ن نحوه نیل به یک خواسته را بکمک آن بصورت شفاف ( نظیر آموزش گره زدن کفش به کودکان ) مشخص و کامپیوتر با دنبال نمودن مراحل مشخص شده ، خواسته مورد نظر را محقق نماید.
با استفاده از VB.NET ، می توان محصولاتی راایجاد که زمینه استفاده از آنان در محیط ویندوز و اینترنت ، وجود خواهد داشت . فراموش نکنیم در زمان فراگیری یک تکنولوژی در ابتدا می بایست شیوه راه رفتن را بیاموزیم و در ادامه اقدام به دویدن نمود .
VB.NET یکی از زبان های حمایت شده در دات نت می باشد . با استفاده از زبان فوق علاوه بر اینکه می توان برنامه های مبتنی بر ویندوز را پیاده سازی نمود ، امکان استفاده از آن بعنوان زبان مورد نظر در زمان ایجاد برنامه های مبتنی بر وب که از تکنولوژی ASP.NET استفاده می نمایند ، نیز وجود خواهد داشت . با توجه به اهمیت و جایگاه خاص این زبان در دات نت ، مجموعه مقالاتی در رابطه با آموزش اصولی این زبان آماده شده که بتدریج بر روی سایت قرار خواهند گرفت .
در اولین مقاله از این مجموعه به معرفی اولیه VB.NET خواهیم پرداخت . در ابتدا لازم است با ویژگی های منحصر بفرد برنامه های مبتنی بر ویندوز در قیاس با برنامه های مبتنی بر DOS ، آشنا شده و پس از مروری مختصر به روند شکل گیری نسخه های متعدد ویژوال بیسیک ، با نحوه نصب آن نیز آشنا شویم .
برنامه نویسی مبتنی بر DOS در مقابل ویندوز
برنامه نویسی مبتنی بر ویندوز دارای تفاوت های عمده ای نسبت به برنامه نویسی سنتی در محیط DOS است.برنامه های DOS ، مسیری دقیق و مشخص را ازابتدا تا پایان دنبال می نمایند .
رویکرد فوق ، باعث بروز محدودیت هائی در رابطه با عملکرد برنامه ها از یکطرف و تحمیل محدودیت هائی به کاربران در طی نمودن مسیر مشخص شده ، می گردد. از زاویه ای خاص می توان عملکرد یک برنامه مبتنی بر DOS را مشابه قدم زدن در یک راهرو ( سالن )، در نظر گرفت . بمنظور رسیدن به نقطه انتهائی سالن ، می بایست طول سالن طی تا به انتهای آن رسید .
در این راستا از موانع متعدد موجود در مسیر ، می بایست عبور تا سرانجام به مقصد مورد نظر رسید . در زمان پیمودن مسیر ، صرفا" امکان بازنمودن درب های خاصی ، وجود خواهد داشت . ویندوز ، دنیای جدیدی از برنامه نویسی مبتنی بر "رویداد" را ایجاد نموده است .
کلیک نمودن موس ، تغییر اندازه پنجره ، تغییر محتویات یک Textbox ، نمونه هائی از یک "رویداد" می باشند. کدهای نوشته شده ، نحوه برخورد با یک رویداد را مشخص می نماید. برای رسیدن به انتهای یک سالن کافی است بر روی "انتهای سالن " ، کلیک نمود و دیگر ضرورتی به پیمودن تمامی مسیر تا رسیدن به انتهای سالن نخواهد بود . درصورتیکه به انتهای سالن رسیده باشیم و متوجه گردیم که این مکان ، محلی نیست که انتظار آن را داشته ایم ، بسادگی می توان مقصد جدیدی را برای خود انتخاب ، بدون اینکه ضرورتی به برگشت در نقطه آغازین مسیر وجود داشته باشد.
برنامه نوشته شده عکس العمل های لازم در ارتباط با حرکت شما را بهمراه عملیات مربوطه بمنظور تکمیل فعالیت ها ی مورد نظر انجام خواهد داد . با استفاده از VB.NET ، می توان کدهای لازم بمنظور ارائه عکس العمل لازم در زمان تحقق یک رویداد را نوشت .
در این راستا ، برنامه نویسان می توانند کدهای لازم در رابطه با رویدادهائی که امکان تحقق آنها وجود دارد را نوشته تا در زمان بروز رویداد مورد نظر ، عکس العمل لازم از طرف برنامه صورت پذیرد.در این زمینه می توان از نوشتن کدهای دیگر بمنظور برخورد با رویدادهای غیرضروری ، صرفنظر کرد. مثلا" ویندوز قادر به تشخیص رویداد"کلیک " از "کلیک مضاعف " است .
این بدان معنی است که اگر می خواهید برنامه مورد نظر شما ،عکس العمل لازم در ارتباط با رویداد "کلیک" را داشته باشد ، می بایست صرفا" کد مربوط به رویداد " کلیک"، نوشته گردد و الزامی به نوشتن کدهای لازم بمنظور برخورد با رویداد "کلیک مضاعف" ، وجود نخواهد داشت . در دنیای برنامه نویسی DOS ، کاربر عکس العمل لازم را نسبت به برنامه انجام می دهد در صورتیکه در ویندوز ، برنامه ها عکس العمل لازم را با توجه به رفتار کاربران ، انجام خواهند داد . یکی دیگر از مزایای مهم برنامه های ویندوز ، عدم وابستگی برنامه ها به یک سخت افزار خاص است . ویندوز تمهیدات لازم در خصوص ارتباط با سخت افزار را پیش بینی و برنامه نویسان نیاز به آگاهی از نحوه عملکرد یک دستگاه سخت افزاری خاص بمنظور استفاده از آن ، نخواهند داشت . مثلا " برنامه نویسان ضرورتی به آگاهی از نحوه عملکرد هر نوع چاپگر لیزری، بمنظور ایجاد خروجی مورد نظر خود در برنامه ها ، نخواهند داشت. ویندوز، امکانات لازم در این خصوص را از طریق ارائه روتین های عمومی که با درایورهای مورد نظر مرتبط می گردند ، فراهم می نماید. شاید همین موضوع دلیل موفقیت ویندوز باشد . روتین های عمومی اصطلاحا " Windows (API ) Application Programming Interface نامیده می شوند .
تاریخچه ویژوال بیسیک
قبل از معرفی ویژوال بیسیک در سال 1991 ، پیاده کنندگان نرم افزار مجبور به تسلط و مهارت در زمینه استفاده از ++C بهمراه موارد پیچیده ای در این خصوص بودند . بدین ترتیب ، صرفا" افراد خاص آموزش دیده، قادر به خلق نرم افزارهای قدرتمند بمنظور اجراء در محیط ویندوز بودند.
ویژوال بیسیک ، محدودیت فوق را تغییر و می توان این ادعا را داشت که امروزه خطوط زیادی از برنامه های نوشته شده با استفاده از ویژوال بیسیک کد شده است . ویژوال بیسیک ، ظاهر برنامه نویسی تحت ویندوز را با حذف عملیات اضافی برای نوشتن کدهای لازم جهت طراحی بخش رابط کاربر (UI) ، تغییر داده است . در این راستا ، زمانیکه بخش رابط کاربر ، ترسیم می گردد ، برنامه نویس می تواند کدهای لازم بمنظور انجام عکس العمل مناسب در رابطه با رویداد ها را به آن اضافه نماید .
زمانیکه ماکروسافت نسخه شماره سه ویژوال بیسیک را ارائه نمود ، مجددا" دنیای برنامه نویسی با تغییر مهمی مواجه گردید. در این راستا امکانات مناسبی برای نوشتن برنامه های مبتنی بر بانک های اطلاعاتی ، در اختیار برنامه نویسان قرار گرفت.
ماکروسافت بدین منظور محصول جدیدی با نام DAO(Data Access Objects) را ارائه نمود . برنامه نویسان با استفاده از DAO ، امکان انجام عملیات متفاوت در رابطه با داده ها را ، بدست آوردند . نسخه های شماره چهار و پنج ، قابلیت های نسخه سه را افزایش و این امکان را برای پیاده کنندگان نرم افزار فراهم نمود تا برنامه های خود را جهت اجراء در محیط ویندوز 95 ، طراحی و پیاده سازی نمایند .
در این زمینه ، برنامه نویسان قادر به نوشتن کدهائی گردیدند که امکان استفاده از آنان توسط سایر پیاده کنندگان نرم افزار که از زبانی دیگر استفاده می کردند، فراهم گردید. نسخه شماره شش ویژوال بیسیک ، روش جدیدی بمنظور دستیابی به بانک های اطلاعاتی را ارائه نمود : ADO(ActiveX Data Objects ) یکی از اهداف اولیه طراحی ADO ، امکان دستیابی به بانک های اطلاعاتی برای پیاده کنندگان برنامه های مبتنی بر وب است که از تکنولوژی ASP ، استفاده می نمایند . همزمان با ارائه جدیدترین نسخه ویژوال بیسیک که VB.NET نامیده می شود ، بسیاری از محدودیت های مرتبط با ویژوال بیسیک برطرف گردید . در گذشته ویژوال بیسیک با انتفادات فراوان مواجه ( عدم وجود امکانات مناسب در مقایسه با جاوا و یا ++C ) و بسیاری آن را نظیر یک اسباب بازی در دنیای وسیع زبان های برنامه نویسی می پنداشتند . VB.NET با غلبه بر مشکلات نسخه های پیشین ، توانسته است در مدت زمان کوتاهی ، بعنوان یک ابزار پیاده سازی بسیار قدرتمند مطرح و گزینه ای مناسب برای برنامه نویسان در تمامی سطوح باشد .
نصب VB.NET
برای نصب VB.NET ، از دو رویکرد متفاوت می توان استفاده کرد :
نصب بهمراه ویژوال استودیو دات نت
نصب نسخه استاندارد
هر یک از گزینه های فوق ، امکان ایجاد برنامه های مبتنی بر ویندوز را فراهم می نمایند . مراحلی که در ادامه ذکر می گردد ، نحوه نصب ویژوال استودیو را تشریح می نماید . مرحله اول : برنامه Setup.exe را از روی CD مربوطه فعال نمائید .
مرحله دوم : جعبه محاوره ای ، مراحل و اولویت های عملیات نصب را نشان خواهد داد. بمنظور صحت عملکرد VB.NET ، چندین Component نصب و یا بهنگام خواهند شد . اولین مرحله نصب، بهنگام سازی عناصر (Components) است . بر روی گزینه Windows Component Update ، کلیک نمائید .
مرحله سوم : برنامه نصب در ادامه سیستم را بررسی تا نوع عناصری را که می بایست بهنگام گردند، مشخص گردد. دامنه فرآیند بهنگام سازی به وضعیت ماشینی که بر روی آن ویژوال استودیو دات نت نصب می گردد، بستگی خواهد داشت .
مرحله چهارم : با توجه به اینکه ممکن است در زمان بهنگام سازی لازم باشد چندین مرتبه سیستم راه اندازی گردد ، از شما درخواست نام و رمز عبور شده تا ضرورتی به نشستن و نگاه کردن به کامپیوتر و واکنش لازم ( درج نام و رمز عبور به سیستم ) پس از هر مرتبه راه اندازی سیستم نباشد . بدین ترتیب در زمان راه انداری سیستم ، عملیات مربوطه بصورت اتوماتیک و بدون نیاز به تایپ نام و رمز عبور ، انجام خواهد شد . عملیات فوق ، اختیاری است و در صورتیکه گزینه فوق انتخاب نگردد ، با هر مرتبه راه اندازی سیستم، پیام مناسب ارائه و می بایست واکنش لازم ( تایپ نام و رمز عبور) را انجام داد .
مرحله پنجم : در این مرحله با فشردن دکمه ! Install Now ، بهنگام سازی عناصر (Components) آغاز می گردد . با اتمام هر یک از آیتم ها یک Check mark بمنزله اتمام مرحله مربوطه نشان داده می شود . در مقابل عنصر جاری برای بهنگام سازی نیز یک فلش قرمز رنگ نسان داده می شود .
مرحله ششم : پس از بهنگام سازی عناصر ، مجددا" به صفحه اصلی Setup مراجعت و امکان نصب ویژوال استودیو دات نت فراهم می گردد.( کلیک نمودن برروی گزینه Visual Studio.NET )
نکته : در صورتیکه قصد دارید که از طریق ماشین فوق ، یک برنامه تحت وب پیاده سازی نمائید ، لازم است IIS و FrontPage Extensions قبلا" نصب شده باشد( بصورت پیش فرض در زمان نصب ویندوز 2000 نصب خواهد شد ) در صورتیکه ویژوال استودیو دات نت ، بر روی کامپیوتری نصب می گردد که دارای سیستم عامل ویندوز 2000 نسخه Professional است ، با یک پیام خطاء مواجه خواهیم شد( عدم وجود عناصر لازم ) با فشردن دکمه Install Component ، عملیات نصب IIS و FrontPage Extensions انجام خواهد شد . در صورتیکه دکمه Continue ، انتخاب گردد ، در آینده نمی توانید برنامه های تحت وب را بصورت محلی بر روی کامپیوتر خود پیاده سازی نمائید .
مرحله هفتم : نظیر اکثر برنامه های نصب ، لیستی از گزینه های موجود ( شامل عناصر ) برای نصب در اختیار شما قرار می گیرد . شما می توانید ، صرفا" آنچیزی را که بدان نیاز دارید ، نصب نمائید . مثلا" در صورتیکه ظرفیت درایو شما پایین و یا ضرورتی به استفاده از ویژوال ++C دات نت را ندارید ، می توان در این مرحله از نصب آن صرفنظر کرد. هر گزینه ای که در این مرحله انتخاب نمی گردد ، می توان در صورت ضرورت آن را در آینده نصب کرد. برای هر یک از امکاناتی که قرار است نصب گردند ، سه بخش اطلاعاتی متفاوت نمایش داده می شود : بخش Feature Properties . فایل ها ی مورد نظر برای نصب و میزان فضای مورد نیاز را نشان می دهد . بخش Feature description . هر Feature چیست و چه عملیاتی را انجام می دهد . بخش Space Allocation ، وضعیت فضای ذخیره سازی هارد را با توجه به گزینه های انتخاب شده ، نشان خواهد داد .
نکته : زمانیکه ویژوال استودیو دات نت ، اجراء می گردد مجموعه ای از اطلاعات بین دیسک و حافظه مبادله می گردد . بنابراین لازم است به میزان کافی ظرفیت آزاد بر روی هارد دیسک وجود داشته باشد ، در این راستا نمی توان دقیقا" مشخص نمود که به چه میزان فضای آزاد نیاز خواهد بود ولی حداقل یکصد مگابایت توصیه می گردد .
مرحله هشتم : ویژوال استودیو دات نت ، شامل مجموعه ای گسترده از فایل های مستندات ( راهنما ) است . در این مرحله می توان تنظیمات لازم در خصوص اجرای مستندات از طریق CD و یا دایرکتوری نصب شده بر روی هارد را انجام داد . در این زمینه می توان یک مسیر بر روی هارد را مشخص تا مستندات نصب و یا گزینه Run From Source را انتخاب تا بر اساس آن مستندات همچنان بر روی CD باقی بمانند .
مرحله نهم : پس از انتخاب عناصر مورد نظر برای نصب ، با فشردن دکمه ! Install Now ، عملیات نصب آغاز می گردد . مدت زمان نصب ، بستگی به موارد انتخابی و نوع سیستم دارد . مثلا" نصب تمام ویژوال استودیو دات نت بهمراه تمامی مستندات بر روی یک ماشین با دارا بودن 256 مگابایت حافظه اصلی، سرعت 650 مگاهرتز و دوازده گیگابایـت هارد دیسک ، حدود یک ساعت طول خواهد کشید .
مرحله دهم : پس از اتمام مرحله قبل ، با انتخاب گزینه Service Release ، بررسی لازم در خصوص بهنگام سازی انجام می گیرد . این عملیات از طریق اینترنت انجام خواهد شد . در این زمینه به یک خط پرسرعت و مطمئن نیاز خواهد بود
آشنایی با Visual Basic.NET- متغیرها
متغیرها حاملهای دربرگیرنده مقادیری هستند که در جریان یک برنامه کاربردی می توانند تغییر کنند. برنامه نویسی بدون آنها، اگر نگوئیم غیرممکن، اما به سختی امکان پذیر است. در ASP.NET ، متغیرها در چند لایه وجود دارند . لایه اول، لایه Application است. در اینجا در هر صفحه برنامه کاربردی، همه متغیرها در دسترس همه کاربران قرار دارد. معمولا یک قطعه داده نسبتا کوچک که در معرض استفاده مکرر است، همانند اطلاعات مربوط به ارتباط با بانک اطلاعاتی، در این لایه ذخیره می شود . لایه دوم، لایه Session است. در این لایه، همه متغیرها در سرتاسر برنامه کاربردی یا تا برقرار بودن جلسه کاربر، در دسترس یک کاربر بخصوص هستند . لایه سوم و آخر، لایه Page است. در اینجا همه متغیرهای تعریف شده در صفحه در سرتاسر آن صفحه در دسترس هستند. متغیرهای تعریف شده در یک صفحه ASP.NET از صفحه دیگر قابل دستیابی نیستند . به علاوه در زمان استفاده از code-behindها در صفحات ASP.NET ، در پیمانه های کلاس خود به متغیرهای سطح Procedure ،Private ،Public و Block دسترسی دارید. متغیرهای عمومی در کلاس هایی که در آنها ایجاد شده اند و نیز پیمانه های کلاس دیگر قابل دسترسی هستند. جلوی این متغیرها کلمه کلیدی Public قرار می گیرد. متغیرهای خصوصی تنها در دسترس توابع و روال های کلاس هایی هستند که در آنها تعریف شده اند . قبل از متغیرهای خصوصی کلمه کلیدی Private قرار می گیرد. متغیرهای سطح Block تنها در بلوک های برنامه ایجاد کننده خود در دسترس می باشند . قبل از متغیرهای سطح Procedure و Block کلمه کلیدی Dim قرار می گیرد . نکته حائز اهمیت این است که باید به خاطر بسپاریم که همیشه باید نوع داده های متغیر خود را تعریف کنیم. در زیر لیستی از انواع داده های پشتیبانی شده در VB.NET آورده شده است .
Boolean: درست یا نادرست
Byte: برای داده های عددی 0 تا 255
Char: برای یک کاراکتر یونیکد
Date: اطلاعات تاریخ و زمان
Decimal: اطلاعات عددی صحیح
Double: داده های عددی اعشاری
Integer, Long, Short, Single: داده های عددی صحیح
Object: متغیر حامل پیش فرض جهت نگهداری هر نوع شئ
String: رشته های حرفی
در نگارشهای قبلی ویژوال بیسیک و در VBScript همه متغیرها بطور پیش فرض از نوع داده variant بودند. Variant در VB.NET وجود ندارد و با نوع داده Object جایگزین شده است .
انواع داده ای در Visual Basic.NET برای تعریف یک متغیر در ویژوال بیسیک دات نت از عبارت Dim استفاده می شود. برای مثال چمله زیر یک متغیر جدید به نام myVar تعریف می کند :
Dim myVar
هنگامی که یک متغیر مانند فوق بدون در نظر گرفتن نوع آن تعریف شود، آن متغیر بعنوان یک شئ (Object) در نظر گرفته می شود. یک متغیر از نوع شئ در دات نت می تواند شامل انواع داده از قبیل رشته، عدد یا انواع پیچیده تر مانند کلاس باشد . اغلب نیازی نیست که از متغیرهای از نوع شئ در برنامه استفاده شود چرا که این متغیرها باعث کاهش کارآیی و سرعت برنامه می شود. هنگامی که از یک متغیر از نوع شئ استفاده شود، نوع مناسب آن متغیر در زمان اجرا تشخیص داده می شود و این باعث کندی می شود. بنابراین بهتر است که نوع داده را از ابتدا مشخص کنیم . جهت مشخص نمودن نوع داده از کلمه کلیدی As استفاده می کنیم. بعنوان مثال یک متغیر از نوع رشته بصورت زیر تعریف می شود :
Dim myVar As String
مجموعه دات نت انواع داده ای زیر را پشتیبانی می کند :
Boolean: جهت مقادیر درست یا نادرست
Byte: جهت مقادیر صحیح صفر تا ۲۵۵ (تنها مقادیر مثبت)
Char: جهت مقادیر نویسه ها یا حروف یونیکد
Date: جهت مقادیر تاریخ و زمان بین اول ژانویه ۰۰۰۱ و ۳۱ دسامبر ۹۹۹۹
Decimal: جهت مقادیر صحیح بین صفر و مثبت و منفی ۷۹,۲۲۸,۱۶۲,۵۱۴,۲۶۴,۳۳۷,۵۹۳,۵۴۳,۹۵۰,۳۳۵ (۱۶ بایت)
Double: جهت مقادیر اعشاری با دقت مضاعف
Integre: جهت مقادیر صحیح بین +۲,۱۴۷,۴۸۳,۶۴۷ و -۲,۱۴۷,۴۸۳,۶۴۸ (۴ بایت)
Long: جهت مقادیر صحیح بین -۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۸ و +۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۷ (۸ بایت)
Short: جهت مقادیر صحیح بین -۳۲,۷۶۸ و +۳۲,۷۶۷ (۲ بایت)
Single: جهت مقادیر اعشاری با دقت واحد
String: جهت مقادیر رشته ای با تعداد حروف صفر تا دو میلیارد حرف
پر کاربردترین انواع داده ای عبارتند از Integer ، Decimal ، Date ، Boolean و String. دقت کنید که نوع داده ای Currency یا Money برای مقادیر پولی در نظر گرفته نشده است و شما می توانید برای مقادیر پولی از نوع Decimal استفاده کنید .
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
|
|