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

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

همانطور که اندازه مگاپیکسل دوربین ها روز بروز بزرگتر می شود (به نظر می رسد اندازه ی استاندارد ۸ مگاپیکسل و بیشتر باشد)، و این بدان معناست که عکس های دوربین شما از نظر پیکسل و اندازه چاپ در ابعاد بزرگتری خواهند بود. اندازه های بزرگتر در زمان چاپ، ایمیل کردن و ارسال توسط وب سایت مشگل ساز می شود. سایزهر نمونه از عکس ها را می شود تغییر داد و مطابق منظور مورد نظر تنظیم کرد.

پیش از آنکه به مبحث روشهای اساسی چگونگی تغییر سایز عکسها بپردازیم، اجازه می خواهم به کسانی که تازه با عکاسی دیجیتال آشنا شده اند گوشزد کنم که مگاپیکسل بالاتردوربین: ۸، ۱۲، یا ۱۵ به این مفهوم نیست که آن دوربین عکس های بهتری می گیرد یا اینکه یک دوربین حرفه ای است.
برای نمونه، با یک دوربین ۱۲ مگاپیکسلی (۴۰۰۰ x 3000 megapixels) می توان عکس هایی به ابعاد ۱۶″ x 20″ با دی پی ای ۲۴۰ چاپ کرد، اما این به معنای کیفیت عالی آن عکس نیست. مراجعه کنید به سایت Tiporama که در بردارنده برنامه محاسبه سایز تصاویربرای تبدیل اندازه پیکسل و وضوح عکس به اندازه اینچ طبیعی عرض و طول تصویر، می باشد.
پس اکنون بیایید نگاهی بیاندازیم به تغییر اندازه تصاویر در فتوشاپ. برای پی گرفتن این سری آموزشها، ممکن است لازم باشد شما یکی از عکس هایی را که اخیراً با دوربین تان گرفته اید در برنامه اصلی فتوشاپ خود داشته باشید.

اندازه تصویر

نخست برای اطلاع از اندازه تصویر در فتوشاپ، روی این کلمات در منوبار فتو شاپ کلیک کنید: Image>Image Size . در پنجره باز شده اطلاعات لازم را در اختیار شما خواهد گذاشت.

۱- در بالا، ابعاد پیکسل و سایز واقعی تصویر را خواهید دید. تصویری که ما در این درسنامه از آن استفاده کرده ایم با یک دوربین ۱۲ مگاپیکسل جی ۹ پاورشات گرفته شده است. عکس با بالاترین کیفیت نما JPG گرفته شده است.اگر عکس با فرمت RAW برداشته می شد، فایل حتی ازمیزان وضوح بالاتری هم برخوردار می شد. توجه داشته باشید که در اسکرین شات بالا اگر میزان وضوح تصویر را افزایش دهید، سایز فایل هم به نسبت افزایش می یابد. بنابر این اگر تعجب می کنید که درایو بیرونی یا کامپیوترتان چرا اینقدر زود پر میشود ، بدلیل تعداد و اندازه فایل های تصویری یا آوازی است که در حافظه درایو خود ریخته اید. عکس هایی که با مگاپیکسل بالا گرفته شده اند به سرعت فضای هارد درایو ها را می بلعند. به این علت است که به درایو های بیرونی بیشتری برای جای دادن فایل های تصویری نیاز پیدا می کنید. و به همین علت آن دسته از فایل های تصویری را زیاد که استفاده نمی کنید یا کیفیت چندان بالایی ندارند نمی توانید دیگر نگهدارید.
۲- در همان باکس، شما پهنا و بلندای واقعی پیکسل را هم خواهید یافت. پس اگر خودتان اندازه پیکسل بخصوصی را می دانید برای برنامه پست وب سایت تعریف کنید، می توانید آن تغییرات را همین جا انجام دهید. برای مثال، ممکن است لازم باشد اندازه پیکسل را به ۸۰۰ x 600 یا کمتر تغییر دهید. اگر بخواهید تصویر مناسب و قابل نمایش در ایمیل باشد، ممکن است حتی مجبور شوید اندازه پیکسل آن را کوچکتر هم بکنید
۳- این دیلوگ باکس اندازه های طبیعی تصویر را هم به شما می دهد. در این نمونه، می بینیم که عکس ۲۲در ۱۶ بوده است. وضوح تصویر هم به کیفیت عکس بر می گردد. بطور کلی اگر بخواهید اندازه های عکسی را برای ارسال در وب سایت تغییر دهید، میزان وضوح تصویر باید بین ۷۲ تا ۱۵۰ دی پی آی باشد. اگر بخواهید عکس را چاپ کنید، وضوح باید بین ۲۴۰ تا ۳۰۰ باشد. برای چاپ در ابعاد معمولی تر ۲۴۰ دی پی آی هم کفایت می کند. تغییر وضوح تاثیری بر ابعاد طبیعی تصویر نخواهد داشت. بلکه تنها کیفیت پیکسل عکس را عوض خواهد کرد.
۴- آخرین بخش مهم این دیالوگ باکس، به میزان اثر گذاری تناسب ها و نمونه برداری پیکسل های تصویر مورد نظر می پردازد. زمانی که پهنای عکس را تغییر می دهید،فتوشاپ بطور اتوماتیک نسبت بلندای تصویر را تنظیم می کند. اگر تناسب های لازم عکس رعایت نشود ابعاد تصویر شما ممکن است کج و معوج به نظر بیاید.

تغییر اندازه های تصویر

برای تغییر دادن اندازه در فتوشاپ، قبل از هر کاری باید یک کپی از عکس اصلی تهیه کنید به این ترتیب می توانید همواره در صورت لزوم از اندازه های اصلی عکس استفاده کنید. می توانید این کار به سرعت با انتخاب Image>Duplicate در منوبار انجام دهید. اگر نمی خواهید کپی تهیه کنید، می توانید گزینه File>Save As نه (Save) را انتخاب کنید و یک کپی از تصویر تغییر سایز یافته را ذخیره کنید.
در حالیکه پنجره سلیز تصویر باز است، می توانید اندازه پیکسل یا اندازه سند تصویر را به آسانی با تغییر عدد اندازه های که می خواهید، عوض کنید. مطمئن شوید که نمونه جدید تصویر و تناسبات ایجاد شده در پنجره را چک کنید.

بهر صورت، توجه داشته باشید که اگر به اندازه ابعاد خاصی ، مثلاً ۸″ x 10″ نیاز دارید، استفاده از ابعاد تصویر اصلی ممکن است برای کار چاپ مناسب نباشد. از آنجایی که اغلب دوربین های مصرفی فول فریم نیستند، ممکن است بخش هایی از تصویر را در زمان چاپ از دست بدهید. گاهی متوجه می شوید که زمانی که عکس را چاپ می کنید قسمتی از تصویر بصورت تکه تکه در آمده است. در اسکرین شات بالا، حتماً دقت کرده اید که وقتی می خواهم اندازه سند را به ۱۰ در ۸ تبدیل کنم، فتوشاپ اندازه را به ۱۰ در ۷٫۵ تبدیل می کند تا تناسب بین پهنا و بلندای تصویر حفظ شود. اگر تصویر به صورت تمام و کمال در اندازه ۱۰ در ۷٫۵ روی کاغذ ۸ در ۱۰ چاپ شود، یک طرف عکس به اندازه نیم اینج فضای خالی سفید خواهد داشت. که اصلاً منظره چندان جالبی نیست.

برش بخشی از اندازه تصویر( در گرافیک کامپیوتری)

پس بهترین روش تغییر اندازه در چاپ برش دادن تصویر در اندازه لازم است. برای این منطور، با کلیک روی OK از پنجره سایز تصویر خارج شوید، و سپس Crop tool را در برنامه فتوشاپ انتخاب کنید. در پایین منوی فتوشاپ، فیلد پهنا و بلندا را می بینید در اینجا می توانید اندازه ابعاد دلخواه را تایپ کنید. برای اطمینان بعداز هر عدد کلمه “inches“ یا “in” را هم تایپ کنید. در ضمن می توانید اندازه وضوح تصویر را هم اضافه کنید.حالا فقط کافی است روی تصویر کلیک کنید،دکمه ماوس را نگهدارید و نشانه گر را تا نهایت حدی که برای برش در نظر گرفته اید بکشانید. بعد از رها کردن دکمه، خواهید دید که کدام بخش دیگر تصویر را برای رسیدن به انداره دخواه باید برش بزنید.

می توانید دوباره روی تصویر کلیک کنید و محل برش را به اندازه یا بخشی که می خواهید برش بزنید منتقل کنید. بعد از تنظم میزان برش، روی دکمه Return کلیک کنید تا برنامه فتوشاپ خودش برش را انجام دهد.

تغییر انداز تصاویر مناسب با وب

بدون شک میدانید که پست کردن یا ایمیل کردن فایلهای تصویری بزرگ، مثل تصاویر ۳۲ مگابیتی یا ۲۴۰۰ در ۱۸۰۰ پیکسل، تقریباً غیر ممکن است. اندازه اینگونه تصویر ها را باید طوری تغییر داد تا در صفحه وب دانلود شوند یا ایمیل آنها بسادگی بازشود و قابل دریافت باشد. برای انجام این کار، باید پنجره اندازه تصویررا همانطور که پیشتر شرح دادیم، باز کرده و وضوح آنرا به ۷۲ یا ۱۵۰ دی پی آی تبدیل کنید. همچنین ابعاد پیکسل تصویر را هم به اندازه های مورد نظر تبدیل کنید ، مثلاً به ۸۰۰ در ۶۰۰ پیکسل.
سپس، روی File>Save for the Web کلیک کنید، و پنجره دیالوگ باکس باز می شود. در این پنجره سه بخش اصلی وجود دارد که باید با آنها آشنا شوید:

۱- در پایین سمت چپ، اندازه پیکسل فعلی عکس را می بینید. همچنین زمان تقریبی لازم برای دانلود شدن عکس را هم، گیریم با کم سرعت ترین (server) می بینید. طبعاً شما به سرعتی کمتر از ۱۲۰ کیلو بایت برای پست تصویردر وب نیاز دارید تا نسبتاً به سرعت در صفحه وب لود شود.
۲- اگر لازم باشد که اندازه پیکسل تصویر را تغییر دهید، می توانید روی پانل اندازه تصویر کلیک کرده و اعداد داخل آنرا تغییر دهید. نحوه تغییر اعداد را چندبار امتحان کنید و دقت کنید که اندازه پیکسل و سرعت دانلود تصویر چگونه تغییر می کند. درضمن، حواستان باشد که نسبت های اعمال شده در پنجره را هم چک کنید.
۳- اگراگر کیفیت تصویر چنانکه می خواهید نیست، می توانید کیفیت وضوح تصویر را در ناحیه پیش تنظیمات (Preset ) از کم به متوسط یا حتی به حداکثر، تغییر دهید. در ضمن می توانید مستقیماً روی فیلد کیفیت کلیک کرده و دکمه لغزنده را جهت افزایش یا کاهش اندازه بهینه شده تصویر به راست یا چپ حرکت دهید. سما فقط کافی است کیفیت خود تصویر و اندازه ی پیکسل حاصل و سرعت را بررسی کنید. (در ضمن توجه داشته باشید که ما تنها داریم د رباره ِ اصول تغییر سایز تصاویر JPEG صحبت می کنیم، و تنظیمات دیگری برای تصاویر PNGو GIF نیز دراین پنجره وجود دارد.)

زمانی که همه کارها انجام شد، دکمه ذخیره ( Save) را بزنید، فتوشاپ خودش بر اساس تنظیمات شما اندازه ها راتغییر داده و یک کپی از تصویر را ذخیره می کند. البته تصویر اصلی ذخیره نمی شود.

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


|
امتیاز مطلب : 26
|
تعداد امتیازدهندگان : 6
|
مجموع امتیاز : 6
موضوعات مرتبط: مقالات فتوشاپ , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

ابتدا عکس مورد نظرمون رو باز میکنیم:

حال از قسمت منوها فیلتر زیر رو به عکس اعمال می کنیم :
Filter –> Stylize –> Find Edges

در این مرحله باید عکسی مانند این داشته باشید:

حالا باید رنگ ها رو از بین ببریم برای این منظور دکمه های ترکیبی
CTRL + U
رو بزنین ویا از منوی Image –> Adjustments –> Hue/Saturation رو انتخاب کنید و مقدارsaturation رو به ( -۱۰۰ ) و مقدار lightness رو با توجه به عکستون تغییر بدین تا طرحتون به شکل نقاشی در بیاد.
شکل نهایی :


|
امتیاز مطلب : 12
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات فتوشاپ , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

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

سایه روشن زدن لبه

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

  • یک لایه جدید در بالای لایه عکس ایجاد کرده و با سیاه آنرا پر کنید.

  • ابزار marquee  بیضی شكل را انتخاب كرده و یك ناحیه انتخاب بزرگ را رسم كنید كه بیشتر عكس را بپوشاند . همینطور می توانید آنرا روی موضعی كه می خواهید همه توجه را جلب كند ، رسم كنید. كاستن از شفافیت لایه مشكی به دیدن انچه انجام می دهید كمك  میكند.
  • ناحیه انتخابی را از مراحل زیر بپوشانید:

Select  >modhfy >feather

مقدار pixel (نقطه) كه شما اینجا انتخاب می كنید بستگی زیادی به وضوح تصویری دارد كه شما روی آن كار می كنید .

با selection صحیح و لایه مشكی انتخاب شده دكمه ی delete  را بزنید. حال مد blend   لایه ی مشكی را تغییر دهید تا نور ملایم شود .اگر افكت خیلی زیاد است میتوانید با opacity   كار كنید تا رنگ آنرا كم كنید .

  • افكت كار گذاشته شد . اگر نیاز دارید كه تصویر را حركت دهید شما میتوانید تنظیمات نهایی را با حركت دادن لایه ی مشكی یا پیمایش آن به بالا انجام دهید .

افكت فتوشاپی polariod (شیمیایی )

یك افكت بسیار رایج و بسیار آسان كه در لحظه( با این فرض كه عكسی را كه می خواهید روی آن كار كنید در فتوشاپ باز نگه دارید )  انجام میشود ، اینجا مراحلی كه شما برای بدست آوردن افكت polariod در فتوشاپ نیاز دارید بگذرانید را ، می آوریم :

  • Alt را پایین نگه داشته و روی لایه ی بك گراند در پالت لایه ها دابل كلیك كنید ، این كار باید قفل لایه را بر دارد .حال كلید كنترل را نگه داشته و روی آیكون New layer  در پالت لایه ها كلیك كنید . این كار یك لایه  جدید پایین لایه ی جاری ایجاد خواهد كرد .

  • همزمان با انتخاب لایه ی عكس ، ctrl+t  را بزنید تا ابزار free transform (تغییر شكل آزاد ) فعال شود .Shift  و Alt  را پایین نگه داشته و سپس به داخل یكی از گوشه ها كلیك و درگ كنید ، به نحوی كه میخواهید عكس را كوچك كنید. شما همچنین میتوانید برخی قسمتهای عكس را ببرید تا آن را یك دایره كنید و بچرخانید تا كمی واقع گرایانه شود .

  • روی لایه ی  عكس دابل كلیك كنید در دیالوگ باكس Layer Styles كه باز می شود ، Drop Shadow و Stroke را چك بزنید ، Stroke را به Inside تغییر داده و width آن را كم كنید تا یك حاشیه ی زیبا در طول لبه ها بدست آورید .

  • حال كلید Ctrl را نگه داشته و روی Layer Thumbnail  از لایه ی عكس كلیك كنید تا انرا بعنوان یك  selection  لود كنید.
  • به مسیر selection> trantorm selection  بروید.
  • كلید Alt +shift  را نگه دارید در حالی كه به درون یکی از دستگیره داخلی گوشه درگ می كنید.
  • ناحیه انتخاب شده را همانطور كه هست بگذارید و روی ایكون layar mask  در پالت لایه ها كلیك كنید .شما توجه خواهید كرد كه محیط خارجی سلكشن پنهان شده است.
  • شما حالا می توانید روی ماسك لایه انواع مختلف تغییرات شكل ،قلم مو  و فیلتر را بیافزایید تا انواع مختلف حاشیه ها را بدست اورید. بعنوان مثال ، روی ماسك لایه كلیك كنید و ابزار  brush   (قلم مو) را بگیرید. یكی  از برس های طبیعی یا افكت خاص را انتخاب كنید.
  • به عنوان رنگ پیش زمینه با سفید شروع به رنگ کردن روی قسمتهای سیاه لایه ماسک کنید.

خواهید دید که قسمت های  مخفی عکس خود را آشکار میکنند هرچند به صورت ضربات قلم مو

به صورت انتخابی میتوانید پس زمینه های مرسوم یا گرادیان ها را به لایه زیرین اضافه کنید، یک نوار سفید اضافی به پایین صفحه بیافزایید. پیش از تغییرات مرحله 2 ، برخی متون یا هرچه درست به نظر میرسد اضافه کنید.همچنین بیش از یک عکس را روی هم قرار دهید و مراحل فوق را دنبال کنید تا یک آمیزش رنگ ملایم بدست آید.

لبه های ملایم

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

Alt  بعلاوه دابل کلیک روی لایه پس زمینه (عکس) برای باز کردن قفل آن . سپس  ctrl بعلاوه کلیک روی دکمه  new layer از پالت لایه ها برای ایجاد یک لایه جدید زیر لایه عکس. این لایه تازه ایجاد شده را با سفید پر کنید.

* حال دکمه کنترل را نگه داشته و روی thumbnail  لایه از لایه عکس کلیک کنید تا سلکت شود. از مسیر                                     Select > transform  selection

دکمه shift  ,  alt    را نگه داشته ، همزمان  یکی از دستگیره های داخلی گوشه را درگ کنید.

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

|
امتیاز مطلب : 7
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات فتوشاپ , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

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

شکی نیست که روش های زیادی برای انجام این کار وجود دارد، اما اگر در جستجوی روشی ساده و آسان برای ایجاد کردن چند تکه ابر در فتوشاپ هستید، این درسنامه برای شما نوشته شده است.
مثل همیشه، برنامه فتوشاپ اینکار را ساده کرده است! بگذارید یکسره به اصل مطلب بپردازیم و ببینیم چگونه با فتوشاپ ابر درست کنیم.
نخست،به یک قطعه عکس احتیاج داریم که ترجیحاً بخش هایی از آسمان را به تصویر کشیده باشد. سپس، قسمتی را که می خواهید ابرها را اضافه کنید مشخص نمایید. من از Magic Wand Tool (واقع در ابزار جعبه رنگ) استفاده می کنم تا بتوانم به سرعت روی آسمان و نه ساختمانهای واقع در عکس کار کنم. فقط کلید شیفت را نگاهداشته و برای اضافه کردن “marching ants” به قسمت مورد نظر کلیک کنید.

اکنون، لازم است تا رنگهای پیش زمینه و پس زمینه را معین کنیم. در ابزار جعبه نقاشی روی رنکهای پیش زمینه کلیک کنید تا رنگ برچین بکار افتد. برای آزمایش رنگهای دیگرهر طور که خواستید عمل کنید، اما در این مورد، رنگها باید رنگ واقعی ابر ها را نشان دهند، پس رنگهای سفید (R: 255, G: 255, B: 255) را انتخاب کنید. حالا روی رنگ پس زمینه در ابزار جعبه نقاشی کلیک کنید. این رنگ آسمان خواهد بود، پس بیایید کمی آبی کمرنگ برداریم.

حالا به قسمت منو بار باز گردیم و روی Filter کلیک کنید. روی واژه Render بروید و کلمه ابرها Clouds را کلیک کنید.

فیلتر به سادگی مقدار متناسب رنگی را که برای پیش زمینه و پس زمینه در نظر گرفته اید برای ایجاد نمونه ابرهایی لطیف بکار خواهد گرفت. می توانید از فیلتر (Ctrl + F or Command + F on a Mac) مجدداً، اگر از نتیجه کار راضی هستید برای تلطیف رنگ ابرها آنطور که می خواهید، استفاده کنید. برای داشتن منظره ای از ابرهایی کمی خشن تر، فقط کافی است کلید آلت Alt key (ویندوز) را نگهدارید یاهمزمان با انتخاب، Filter > Render > Clouds، دکمه آپشن Option (Mac OS) را بزنید.

حالا می توانید هر طور میخواهید برای تنظیم نتیجه با رفتن به Levels (Ctrl + L or Command + L) و جابجایی سطح لغزانه میزان ورودی و خروجی رنگ را بدلخواه خود تنظیم نمایید.

این همه کاری است که باید انجام می دادید. خیلی آسان بود، نه؟ اینهم نتیجه عکسی که من ساختم:

بازهم می گویم که راههای بیشماری برای انجام این کار فتوشاپ وجود دارد. اگر نمونه ابرهای ایجاد شده با فیلتر دقیقاً آن چیزی نیست که شما می خواستید یا با عکس شما هماهنگ نیست، می توانید بسادگی از اینترنت ابرهایی قابل پردازش و رتوش دیگری دانلود کنید و آنها را بر روی عکس مورد نظر قرار دهید.
|
امتیاز مطلب : 7
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات فتوشاپ , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

Photo Collage Maker یک scrapbooking دیجیتال و نرم افزار اختلاط رنگ عکس است . این برنامه به شما اجازه می دهد طرح های scrapbook (مجموعه ای) به سرعت و راحت نقاشی کنید و بسازید.به طور خودکار شما با یک ترکیب و قطعه هنری کار می کنید و آنرا با افکت ارتقا می دهید. می توانید به عناون چاشنی به آنچه ساخته اید حاشیه، قاب و پس زمینه اضافه کنید. وقتی کار شما تمام شود می توانید آنرا مثل یک فایل دیجیتالی ذخیره کنید مثل(JPG ،GIF ، TIFF، و غیره) و هر شاهکاری می تواند بارها و بارها منتشر شود. Photo Collage Maker این امکان را به شما می دهد که عکس های مورد علاقه تان را روی یک بوم نقاشی(canvas) سازماندهی کنید بدون اینکه مجبور باشید نقاشی عکس های واقعی را خراب کنید و آنها را به صفحه پوستر بچسبانید.

قابلیت های کلیدی نرم افزار AMS Software Photo Collage Maker v2.67 :

- لبه های cool و شکل ها
عکس ها را در میان شکل های  ساخته شده متنوع خرد کنید.
- کلیپ های هنری،در هر جایی
عکس کلیپ های هنری در هر پروژه ای چاشنی آن هستند.عکس ها و کلیپ ها می توانند ، بچرخند و تغییر اندازه بدهند و روی پوستر اختلاط رنگ در هر مکانی قرار بگیرند.
- لایه های دوست داشتنی
تکنولوژی قوی لایه سازی، شما را قادر می سازد که عکس ها را در پرده اختلاط رنگتان از هر راهی که می خواهید اضافه کنید و مرتب کنید.تغییر موقعیت و سایز و چرخش عکس ها با یک کلیک ساده و کشیدن آنها امکان پذیر است.همچنین می توانید شفافیت لایه ها را تغییر دهید سایه و هاله به آنها اضافه کنید.
- پرسپکتیوهای شگفت انگیز
از یک پرسپکتیو بی نظیر برای ساخت افکت های شگفت انگیز استفاده کنید.

 

حجم فایل : ۷/۴۶ مگابایت

دانلود فایل از سرور سایت

دانلود فایل از سرور کمکی


|
امتیاز مطلب : 6
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: ▼مقالات عمومی گرافیک سه بعدی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

 

Fantamorph برنامه ای آسان است برای ساخت تصاویر متحرک GIF با خاصیت تغییر و پیچ و خم دادن به عکس.با استفاده از این برنامه می توانید انیمیشن های جالب ایجاد کنید به این صورت که یک تصویر را به تصویر دیگر با اثر متفاوت و تغییر شکل انتقال می دهیم.این برنامه دارای تاثیرات زیادی است که از پیش تعیین شده و همچنین ورودی ویدئو را پشتیبانی می کند و نیز برای تنظیم و بهبود کیفیت تصاویر فرصت کافی می دهد.شما می توانید از برنامه های کاربردی آن مثل چرخش،تنظیم رنگ،اضافه کردن برچسب های مختلف و اثرات جالب دیگر با استفاده از ابزار داخلی بدون نیاز به شخص دیگری استفاده کنید.این برنامه فرمت های تصویری زیادی از جمله JPEG, TIFF, PNG, GIF, TGA, PCX را پشتیبانی می کند.شما می توانید فرمت AVI ، انیمیشن GIF ، فلش  ، محافظ صفحه نمایش ، فرمت مستقل .exe  و فرمت های دیگر را از آن بیرون بیارید.

امکانات دیگر این نرم افزار :
- موتور انتقال دهنده سریع با پشتیبانی کامل برای باز کردن سخت افزار های سریع GL
- ورودی و خروجی تصاویر ۳۲ بایتی با پشتیبانی کانال آلفا، BMP, TIFF, PNG, TGA
- تصاویر خروجی با دنباله ای از ویدئو AVI ، انیمیشن GIF ، فیلم فلش ، محافظ تصویر و یا فایل EXE
- شکل گیری با بیش از دو تصویر به عنوان منبع در ۱ پروژه
- چیدن و کوتاه کردن ، چرخش و یا به هم زدن ، تنظیم رنگ ، اضافه کردن برچسب یا فیلتر به تصاویر و ویدیو
- ابزار حرفه ای برای کنترل شکلگیری
- اثرات شگفت انگیز با ایجاد زمینه ، ماسک ، منظره جلو عکس ، نور و صدا
- نسخه قابل چاپ تصاویر و پیش نمایش تصاویر قبل از چاپ
- تشخیص خودکار ویژگی های صورت و rameschenie نکات کلیدی در موقعیت های مربوطه
- ایجاد یک شخص مجازی از چند نفر واقعی
و بسیاری دیگر از امکانات…

 

سیستم عامل: Windows ® ۲۰۰۰/XP/Vista/7

محصول سال: ۲۰۱۰

زبان: Multilanguage + russifier

 

حجم فایل : ۸/۳۹ مگابایت

دانلود فایل از سرور سایت

دانلود فایل از سرور کمکی


|
امتیاز مطلب : 7
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: ▼مقالات عمومی گرافیک سه بعدی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

دوستانی که رنگ شناسی ۱ (+) رو دنبال کردن بر ضرورت شناختن رنگ واقف هستن این مقاله همون طور که از عنوانش مشخصه دنباله ی رنگ شناسی یک هستش که برای کسانی که می خوان حرفه ای باشن قرار داده شده است. در ادامه مطلب می تونین این مقاله رو دانلود کنین.

 

حجم فایل : ۱۰۷ کیلوبایت

دانلود فایل از سرور تک تمپ


|
امتیاز مطلب : 6
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: ▼مقالات عمومی گرافیک سه بعدی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

با استفاده از نرم افزاری به نام Photo Gallery Maker کاربران قادرند تا به راحتی یک آلبوم دیجیتالی به صورت دو بعدی و سه بعدی طراحی کنند. آلبوم های زیبا از تصاویر که به صورت فلش آماده می شوند و خاطرات را جذاب تر از گذشته نگهداری می کنند و برای همیشه آن ها را در حافظه های دیجیتالی ماندگار خواهند کرد. این ابزار نسبتا کم حجم به راحتی قابل استفاده بوده و می تواند با شناسایی فرمت های مختلف در زمینه های گوناگون تصاویر را با یک سری از افکت های زیبا همراه کند و با استفاده از یک پس زمینه موزیک خروجی جذابی را پدید آورد. ساخت اسلایدشو برای صفحات وب با تولید اتوماتیک دو پسوند HTML و SWF و همچنین امکان خروجی گرفتن به صورت سی دی یا دی وی دی با اجرای اتورانی که توسط نرم افزار ساخته می شود دو مرحله از اصلی ترین مدل های خروجی نرم افزار را تشکیل می دهند. البته Photo Gallery Maker قادر است تا به خواسته کاربر خروجی هایی مثل فیلم ها هم تولید کند و یا این که با استفاده از سرویس های آنلاین رایگان خروجی را به صورت مستقیم برروی محیط مجازی اینترنت قرار دهد تا کاربران دیگر هم قادر باشند تصاویر فلش را مشاهده کنند. طراح های آماده دو بعدی و سه بعدی هم در نرم افزار قرار داده شده اند تا کاربر بتواند با ایده برداری از آن ها کاری جذاب و تمیزتر را انجام دهد.

 

Photo Gallery Maker ایجاد آلبوم های دیجیتالی زیبا با Photo Gallery Maker 2.76 Final

 

 

قابلیت های کلیدی نرم افزار Photo Gallery Maker:
- پشتیبانی از تصاویر هم برای طراحی و هم برای ویرایش
- شناسایی تصاویر با فرمت های مختلف
- پشتیبانی از موزیک ها با فرمت های مختلف و قرار دادن در پس زمینه فلش گالری ها
- چندین حالت مختلف برای گرفتن خروجی و Publish
- قابلیت ویرایش Template های موجود در نرم افزار
- واسط کاربری دوست داشتنی و جذاب نرم افزار
- افکت ها و Transition های بسیار زیبا
- قابلیت طراحی فلش گالری های سه بعدی
- امکان استفاده از فلش های برای صفحات وب
- استفاده از نهایت کیفیت در خروجی
- سازگار با نسخه های مختلف ویندوز از جمله ویندوز محبوب ۷
- و …

 

password ایجاد آلبوم های دیجیتالی زیبا با Photo Gallery Maker 2.76 Finalپسورد فایل: www.downloadha.com

download ایجاد آلبوم های دیجیتالی زیبا با Photo Gallery Maker 2.76 Final لینک دانلود – 12.4 مگابایت | لینک کمکی


|
امتیاز مطلب : 6
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: ▼مقالات عمومی گرافیک سه بعدی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

ساخت اسلاید های تصویری و پروژه های مربوطه که مشتمل بر تصاویر متعدد و همراه با موسیقی متن و افکت های خاص تعویض عکس ها در میان است برای کارهای مختلف علمی و نمایشی همیشه رایج بوده است . این عمل به طور کل و در میان عام به نرم افزار مطرح PowerPoint مایکروسافت اختصاص داشته است. با افزایش روز افزون دنیای دیجیتال و آموزش های الکترونیک، علاقمندان مایل به نمایش این پروژه های زیبای خود در محیط اینترنت نیزهستند که متاسفانه فرمت PPT نرم افزار پاور پوینت این اجازه را از آنها می گیرد . از این رو علاقمندان به فرمتهای رایج و زیبای تحت وب مانند Flash برای انجام این امر روی می آورند .

SWF 'n Slide Pro نرم افزار قدرتمندی از سری محصولات مرتبط با فلش Vertical Moon است که امکان ساخت اسلاید های حرفه ای و زیبا را در ساده ترین حالت ممکن به کاربران می دهد . برای کار با این نرم افزار ساده و حرفه ای و خلق اسلاید های مناسب تنها لازم است تصاویر دیجیتالی مورد علاقه خود را انتخاب نموده و با افزودن آهنگ و موسیقی متن به آن و تنظیم افکت ها و زمان تغییر تصاویر و یا افزودن متن و دیگر قابلیت های جزئی نرم افزار، آن را به یک اسلاید آماده و زیبا و قابل پخش در هر محیطی مخصوصا صفحات وب و اینترنت آماده کرد !

برخی از قابلیت های نرم افزار SWF 'n Slide Pro :  قابلیت پشتتیبانی فرمتهای خروجی متعدد و رایج ویدیویی و .. ، فرمت SWF فلش که سازگار  97% تمامی مرورگرهای رایانه های دنیاست ، فرمت HTML که به طور مستقیم یک صفحه ی وب آماده پخش را در اختیار شما قرار می دهد ، خلق فایل های اجرایی مستقل و بی نیاز از فلش پلیر در قالب فایل اجرایی EXE که با یک کلیک ساده در هر سیستمی قابل نمایش است ،فرمت خروجی در قالب فایل های QuickTime و اسکرین سیور های سیستم عامل ویندوز ، مدیریت خوب فایلهای صوتی و تصویری و دادن اطلاعات لازم برای چگونگی پخش و قرارگیری آنها در داخل اسلاید ، پشتیبانی فرمتهای صوتی و تصویری رایج و متعدد، فرمتهای صوتی(AIFF, MP3, System 7 Sound (Mac OS 9), Wave (WAV) ، فرمتهای تصویری BMP, GIF, JPEG, PDF (Mac OS X), Photoshop (PSD), PICT, PNG, Targa (TGA), TIFF ، خلق اسلاید های زیبا و متعدد ، خلاق اسلاید های ساده که با اجرا شروع به نمایش تمام صفحه و خودکار کنند ، خلق اسلاید به صورت Thumbnail تا با کلیک بر روی هر بخش اسلاید مورد نظر شروع به پخش کند ، خلق اسلاید های زیبای آلبوم های مانند به صورت سه بعدی ، قابلیت انتخاب میان 150 افکت مختلف تعویض تصاویر ، قابلیت افزدن بسیاری از امکانات و آیتم های مختلف برای افزایش کیفیت و توانایی های اسلاید حاصل و ...


|
امتیاز مطلب : 5
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: ▼مقالات عمومی گرافیک سه بعدی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

این اشكال علاوه بر اشكال‌هایی كه به كل Office وارد است، تصمیم برای ارتقاء به این نسخه جدید را با شك و تردیدهای اساسی روبرو می‌كند.

در مورد مزایای استفاده از نسخه ۲۰۰۳ Outlook و در كل Office، مقالات و مطالب زیادی نوشته شده كه همگی با بیان برتری‌های این نرم‌افزار نسبت به نسخه‌های قبلی، خواننده را ترغیب به ارتقاء می‌كنند. در این میان توجه بسیار كمی به نقاط ضعف و اشكالات موجود در این بسته نرم‌افزاری شده است.من هم مانند كاربران دیگر بسیار علاقه‌مند به ارتقاء شدم، ولی پس از انجام این كار درگیر مشكلات متعددی شدم و مناسب دیدم این موارد را، به خصوص در مورد Outlook، به رشته تحریر درآوردم تا دوستان و علاقه‌مندان دیگر هم این تجربه بهره‌مند گردند.

آفیس ۲۰۰۳

این نرم‌افزار علاوه بر بخش‌های معمول مانند Word، Outlook، Excel، Access، PowerPoint، و FrontPage، شامل بخش‌هایی نظیر Project، Publisher، OneNote، InfoPath است كه متاسفانه باید در چندین سی‌دی تهیه شوند. ولی اگر صاحب یك درایو دی‌وی‌دی هستند، تكنولوژی روز همه این بسته نرم‌افزاری را در یك دی‌وی‌دی عرضه كرده است.نكته جالب اینجا است كه شما باید به محض نصب كردن آفیس، یك برنامه اصلاحی هم برایش دانلود كنید! این برنامه چند صد كیلوبایتی، یك نقص عمده این نرم‌افزار غول‌پیكر را برطرف می‌كند!(مَثَلِ فلفل نبین چه ریزه...!) اشكال از اینجا ناشی می‌شود كه اگر با آفیس جدیدتان، فایل‌های قدیمی آفیس خود را باز كنید (به خصوص متون فارسی و دارای جدول) می‌بینید كه آنها كمی به هم ریخته شده‌اند، بنابراین لازم است برنامه فوق را حتماً نصب كنید.

و اما Outlook

این برنامه با یك رابط بسیار زیبای گرافیكی طراحی شده است. اولین نكته در مورد Outlook، یك فولدر جدید برای ایمیل‌های ناخواسته (Junk) است كه دارای فیلتر قابل به روز شدن است. فایل به روز كننده آن در حدود ۲ مگابایت، در سایت مایكروسافت موجود است و درجه حساسیت آن هم قابل تنظیم می‌باشد. مشكل عمده Outlook در عدم سازگاری كامل با نسخه‌های قبلی خود است. یعنی فایل PST ساخته شده در Outlookهای قبلی در نسخه ۲۰۰۳ قابل استفاده است، ولی عكس آن ممكن نیست. فایل PST حاوی همه ایمیل‌ها، آدرس و مشخصات دوستان شما در Outlook است. در نسخه ۲۰۰۳ امكان جدیدی به آن اضافه شده است كه پشتیبانی بهتری از كاراكترهای یونی‌كد دارد و بنا به ادعای مایكروسافت، فشرده‌سازی بهتری ارائه می‌كند.

مشكل از آنجا شروع می‌شود كه بعد از ارتقاء و به محض دریافت اولین ایمیل، Outlook به طور اتوماتیك و بدون اجازه، فایل PST قدیمی را به فرمت جدید تبدیل می‌كند، در حالی كه دیگر به هیچ وجه نمی‌توان این تبدیل را معكوس نمود! یعنی مایكروسافت این طور فرض كرده كه كاربر پس از دیدن نسخه ۲۰۰۳ آنقدر به آن علاقه‌مند خواهد شد كه احتمال برگشت به نسخه‌های قبلی صفر است! حتی با Uninstall كردن نسخه ۲۰۰۳ و نصب نسخه قدیمی، مشكل حل نمی‌شود و در ضمن Outlook قدیمی دیگر كار نخواهد كرد. این مشكل با Import and Export سنتی نیز حل نمی‌شود و فایل PST تولید شده فقط در نسخه ۲۰۰۳ باز می‌شود.در راهنمای نرم‌افزار نیز اشاره شده كه اگر در بخش فرمت فایل PST‌ عبارت «۹۷ تا ۲۰۰۲» قید نشده باشد، آن وقت فایل مورد نظر با نسخه‌های قدیمی‌تر سازگار نیست، ولی گفته نشده كه برای سازگار نمودن فایل موردنظر چه باید كرد. برنامه Personal Folders Backup در سایت مایكروسافت نیز كمكی نمی‌كند، چرا كه این برنامه نیز از فایل‌ PST، بدون تغییر فرمت آن، نسخة پشتیبان تهیه می‌كند!

پس از آن كه در راهنمای داخل Outlook نیز نتوانستم راه حلی پیدا كنم، آستین‌ها را بالا زدم! و بالاخره راه حل را یافتم: برای تهیه نسخه پشتیبان كه با نسخه‌های قدیمی سازگار باشد، در منوی Tools روی Options كلیك كنید. در بخش Mail Setup روی Data Files كلیك كنید. اكنون آدرس فایلی از Outlook را می‌بینید كه حاوی همه ایمیل‌ها، آدرس‌ها و غیره است. می‌توانید یك آدرس دیگر (آدرسی كه می‌خواهید نسخه پشتیبان در آنجا كپی شود) به آن اضافه كنید. توجه نمایید كه در بخش فرمت، نوع «سازگار با نسخه‌های ۹۷ تا ۲۰۰۲» را انتخاب كنید. حالا به محیط Outlook برگردید. می‌بینید كه یك فولدر جدید به لیست فولدرها اضافه شده است. اكنون تنها كاری كه باید بكنید این است كه از هر چه كه لازم دارید یك كپی در فولدری كه ساخته‌اید بریزید. زمانی كه خواستید این فایل‌ها را در نسخه قدیمی Outlook كپی كنید، در همان جای قبلی آدرس فایل تولید شده را وارد كنید و فایل‌های مورد نظر را سر جای اصلی‌شان كپی كنید.این نكته نشان می‌دهد كه مبدل فایل PST در درون Outlook جدید طوری جاسازی(!) شده است كه جز كاربران حرفه‌ای نمی‌توانند به آن دسترسی پیدا كنند. این اشكال علاوه بر اشكال‌هایی كه به كل Office وارد است، تصمیم برای ارتقاء به این نسخه جدید را با شك و تردیدهای اساسی روبرو می‌كند.


|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات OUTLOOK , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

یكی از مزایای Gmail نسبت به Yahoo علاوه بر سرعت بالاتر، امکان دسترسی رایگان به سرویس POP۳ این سایت از طریق نرم افزار Outlook است. در این مقاله سعی داریم نحوه ایجاد اكانت Gmail در Outlook Express را شرح دهیم.

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

برای ایجاد اكانت Gmail در Outlook دو روش وجود دارد:

۱- ایجاد اکانت به صورت خودكار (Automatically):

بدین منظور ابتدا برنامهء Gmail Autoconfiguration Tool كه توسط خود Google عرضه می شود را دانلود كنید.

سپس با توجه به تصویر مراحل زیر را طی كنید:

۱) ابتدا برنامه را اجرا كنید.

۲)در قسمت Which mail program do you wish to use with Gmail برنامه Outlook خود را انتخاب كنید.

۳)نام كاربری Gmail خود را در قسمت E-mail address وارد كنید.

۴)در قسمت Display name، نام خود را وارد كنید.

۵)در انتها روی دكمهء Configure كلیك كنید.

فعال كردن POP Mail:

حال شما برای فرستادن و دریافت E-mail در Outlook نیاز به فعال كردن POP در اكانتGmail خود دارید. بدین منظور:

۱) وارد اكانت Gmail خود شوید.

۲) در بالای صفحه Gmail روی لینك Settings كلیك كنید.

۳) در بالای صفحهء Mail Settings روی گزینهء Forwarding and POP كلیك كنید.

۴) در قسمت POP Download همین صفحه، گزینهء Enable POP for all mail را فعال كنید.

۵) در انتها روی دكمهء Save Changes كلیك كنید.

۲- ایجاد اکانت به صورت دستی (Manually)

 

۱) برنامه Outlook را اجرا كنید.

۲) در منوی Tools گزینه Accounts را انتخاب كنید.

۳) در۴) نام خود را در قسمت Display name وارد كنید و روی دكمهء Next كلیك كنید.

۴) نام خود را در قسمت Display name وارد كنید و روی دكمهء Next كلیك كنید.

۵) آدرس Gmail خود را در قسمت Account name به طور كامل وارد كنید.

۶) در قسمت Incoming mail عبارت pop.gmail.com و در قسمت Outgoing mail عبارت smtp.gmail.com را وارد كنید و Next را بزنید.

۷) آدرس Gmail خود را به طور كامل در قسمت Account name و كلمهء عبور خود را در قسمت Password وارد كنید و Next را بزنید.

۸) در انتها روی دكمه Finish كلیك كنید.

۹) حال دوباره از منوی Tools به قسمت Accounts… بروید.

۱۰) عبارت pop.gamil.com را انتخاب كنید و بر روی دكمه Properties كلیك كنید.

۱۱) در این قسمت Tab‌ (یا زبانه) Advanced را انتخاب كنید.

۱۲) در قسمت Server Port Numbers ابتدا تیك عبارت (This server requires a secure connection (SSL اولی را بزنید و در مقابل عبارت (Outgoing mail (SMTP عدد ۴۶۵ را وارد كنید.

۱۳) در همین قسمت، به مانند مرحله قبل تیك عبارت (This server requires a secure connection (SSL دومی را بزنید و در مقابل عبارت (Incoming mail (POP۳, IMAP or HTTP عدد ۹۹۵ را وارد كنید.

۱۴) به Tab (یا زبانه) Servers بروید و تیك عبارت My server requires authentication را بزنید.

۱۵) روی دكمه Ok كلیك كنید.

می بینید كه روش اول خیلی ساده تر می باشد ولی شاید به مانند من، جزو آن دسته از افرادی باشید كه بنا به دلایلی روش دوم را می پسندید!پنجرهء باز شده، روی دكمه Add كلیك كنید و سپس ...Mail را انتخاب كنید.


|
امتیاز مطلب : 12
|
تعداد امتیازدهندگان : 5
|
مجموع امتیاز : 5
موضوعات مرتبط: مقالات OUTLOOK , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

یکی از توانمندی هایی که نرم افزار Microsoft Outlook برخوردار است و اکثر کاربران از آن بی خبرند ، قابلیت ارسال ایمیل صوتی یا Voice Mail است.

با استفاده از این روش شما میتوانید یک پیغام صوتی را ظبط کرده و برای فرد مقابل ارسال کنید. سپس او میتواند پیغام شما را به شکل صوتی دریافت کند.
برای این کار:
ابتدا نیاز است تا پیغام صوتی خود را ضبط کنید. بدین منظور میتوانید از Recorder خود ویندوز استفاده کنید. از منوی Start وارد All Programs شده ، سپس از شاخه Accessories و سپس Entertainment بر روی Sound Recorder کلیک کنید. اکنون از طریق میکروفون پیام خود را بخوانید و توسط برنامه ضبط و ذخیره سازی کنید. حجم فایل صوتی کم خواهد بود.
اکنون نرم افزار Outlook را اجرا کنید.
وارد صفحه مربوط به ارسال ایمیل شوید. اکنون از نوار بالا و منوی Insert روی قسمت File کلیک کنید. حالا فایل صوتی خود را انتخاب کنید و روی دکمه Insert کلیک کنید.
حال میتوانید متن نامه را نیز وارد کرده و ایمیل را ارسال کنید.
اکنون پیام شما همراه فایل صوتی به شکل Voice Mail برای فرد مورد نظر ارسال میشود. در صورتی که خود فرد دریافت کننده نیز از برنامه Outlook و امثالهم استفاده کند به محض مشاهده ایمیل میتواند پیغام صوتی را بشوند. در غیر این صورت پیغام صوتی به شکل یک فایل پیوست برای فرد مورد نظر قابل دریافت است.


|
امتیاز مطلب : 11
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات OUTLOOK , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

اگر از نرم افزار Outlook برای مدیریت ایمیل های خود در ویندوز XP استفاده میکنید حتمأ به این موضوع برخورد نموده اید که در صفحه لوگین به ویندوز و به هنگام نمایش حساب های کاربری ، در زیر نام کاربر میزان ایمیل های خوانده نشده وی درج میگردد. بنا به هر دلیلی شاید دوست نداشته باشید تا تعداد ایمیل های خوانده نشده تان در این قسمت نمایش داده شود. هم اکنون به معرفی روش غیرفعال کردن این شمارنده ایمیل های خوانده نشده در ویندوز XP میپردازیم.

بدین منظور:
از منوی Start وارد Run شده و عبارت regedit را وارد نموده و Enter بزنید تا ویرایشگر رجیستری ویندوز باز شود.
به مسیر زیر بروید:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUnreadMail

بر روی فضای خالی از صفحه راست کلیک کرده و New > DWORD را انتخاب نمایید و نام آن را MessageExpiryDays تنظیم کنید.
سپس بر روی MessageExpiryDays دوبار کلیک کرده و در قسمت Value به آن مقدار 0 بدهید.
کار تمام است، اکنون اگر ایمیل خوانده نشده ای در ویندوز داشته باشید دیگر در صفحه لوگین ویندوز XP درج نمیشود.

لازم به ذکر است اینکار توسط ابزار Tweak UI Power Toy ساخت مایکروسافت از طریق Logon > Unread Mail نیز امکان پذیر است.


|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات OUTLOOK , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

ممکن است قصد داشته باشید تا چند روزی به سفر بروید. با این حساب ایمیل هایی که برای شما ارسال میشود طبعأ بی جواب میمانند. در این ترفند قصد داریم به معرفی یک قابلیت جالب نرم افزار Outlook Express بپردازیم که با استفاده از آن میتوانید ایمیل هایی که برای شما می آید را به طور اتوماتیک یک جواب بدهید. به عنوان مثال در صورتی که در سفر باشید میتوانید کاری کنید که پس از دریافت هر ایمیل ، پاسخی که در بر دارنده در سفر بودن شماست برای نگارنده ایمیل ارسال شود.

برای این کار:
ابتدا با استفاده از نرم افزار Notepad متن مورد نظر خود را تایپ کرده و آن را در جایی Save کنید.
حال نرم افزار Oulook را اجرا کنید.
سپس به منوی Tools رفته و از Message Rulles روی Mail کلیک کنید.
اکنون از قسمت Select the Conditions for your گزینه For all messages و از قسمتSelect the Action for your گزینه Reply with messages را علامت بزنید.
در ادامه ، روی عبارت Message از بخش Rule Description کلیک کرده وپس از انتخاب ایمیل ذخیره شده، کلید Enter را بزنید.


|
امتیاز مطلب : 13
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات OUTLOOK , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

تعریف انواع داده ها

در درس پیش مبحث طراحی جدول را آغاز كردیم و پنجره Design View آشنا شدیدو توانستیم اقدام به ایجاد جداول جدید كنیم ولی یكی از مباحث مهم در طراحی جدول را ذكر نكردیم و قول آن را به جلسه بعد دادیم و آن مبحث كه در این درس به طور مفصل توضیح داده خواهد شد نوع داده های فیلدها می باشد.
اگر به یاد داشته باشید در پنجره Design View ما برای تعریف كردن فیلدها از سه ستون Field Name و Data Type و Description استفاده می كردیم و همچنین گفته شد كه Field Name برای شرح نام فیلد و Description برای توضیح فیلد برای استفاده های بعدی می باشد. اما نكته ای كه اینجا قابل ذكر می باشد ستون Data Type می باشد كه نوع داده های هر فیلد را مشخص می كند مثلا داده های از نوع متن, عدد, تاریخ و غیره كه تمامی موارد در زیر به طور كامل شرح داده خواهند شد.

هر داده ای نوع خاصی دارد. هرفیلد جدول, داده هایی از یك نوع خاص را می تواند در خود جای دهد.مثلا برای فیلدی با اسم "نام كارگر" باید داده هایی از نوع متن تعریف شود تا تمامی ركوردهای ثبت شده در این فیلد دارای یك نوع داده و آن هم از نوع متن باشند.لذا هرگاه جدولی طراحی می كنیم باید نوع داده هر فیلد را از فهرست پایین جهنده ستون Data Type انتخاب كنیم.(برای نمایش فهرست ستون Data Type كافی است بر روی فلش موجود در این ستون كلیك كنیم تا فهرستی از نوع تمامی داده هایی كه می شود در اكسس ثبت كرد برای ما نشان داده شود)
توجه: هنگامی كه موردی را از فهرست بازشونده Data Type انتخاب می كنیم اكسس فهرستی از اطلاعات را در بخش زیرین پنجره نمایش می دهد كه به آنها Field Properties (یا خصوصیات فیلد) گفته می شود. مثلا وقتی ما فیلدی از نوع Text (متن) را از ستون بازشونده انتخاب می كنیم. در زیر همین پنجره خصوصیات فیلد مربوط به متن برای ما نشان داده می شود. 
حال در زیر به تشریح تمامی انواع داده ها می پردازیم:

داده از نوع Text(متن):
از داده نوع Text در فیلدهایی كه حروف, واژه ها, اسامی و عبارات را نگه می دارد استفاده می شود. لازم نیست كه محتوای فیلد متن فقط متون الفبایی باشد بلكه می تواند اعداد و علایم خاص نیز باشد. ولی توجه كنید كه برای اعدادی كه در محاسبات از آنها استفاده می كنید, از فیلد نوع متن استفاده نكنید. فیلد متن برای داده های مناسب است كه می خواهید آنها را نگهدارید و نه آنهایی كه قصد انجام محاسبه بر روی آنها را داشته و یا به عنوان تاریخ و زمان بكار ببرید.مثلا داده های با عنوان "نام" باید در این نوع فیلد ذخیره شوند.
توجه: از فیلد متنی برای داده های با طول حداكثر 255 كاراكتر استفاده كنید. اگر طول داده بیش از این مقدار است, از داده نوع Memo استفاده كنید. همچنین دقت كنید كه برای كنترل طول فیلد متنی, از خصوصیات فیلد استفاده كنید.مثلا می توانید از اكسس بخواهید تا در هز ركورد فیلد متنی, تا 255 حرف را نگهدارد.
آدرس و شماره تامین اجتماعی مثالهای كاملی از داده های متنی هستند كه از اعداد و علایم خاص (مانند تیره و ویرگول) تشكیل می شوند.

داده از نوع Memo (یادداشت):

از داده نوع Memo برای فیلدهایی استفاده می شود كه تا 64000 كاراكتر (شامل حروف, اعداد و كاركترهای خاص) طول دارند.تعیین طول فیلدهای Memo ضروری نیست چون اكسس فقط به همان مقدار كه لازم است برای آنها جا تعیین می كند. در واقع جدولهایی كه فیلد Memo دارند, ركوردهایی با طول متغیر دارند, چون طول فیلد Memo در هر ركورد, با ركوردهای دیگر فرق دارد. مثال برای این نوع فیلد, فیلدی به نام "توضیحات" می تواند باشد.
توجه كنید كه اگر بخواهید متون شكل بندی شده ای مانند متون واژه پردازی شده در Word را در اكسس نگه داری كنید باید از داده های نوع OLE استفاده كنید نه داده های نوع Memo.

داده از نوع Number (عدد):

هر داده ای از جدول را كه بخواهید در محاسبات بكار ببرید, از نوع Number تعریف كنید. داده از نوع Number برای تمامی ارقام, بجز مقادیر پولی و ارقام با دقت زیاد كه در محاسبات علمی بكار میرود مناسب است.(توجه كنید كه از داده نوع Currency (ارز) برای ارقام پولی و دقت بالا استفاده می شود). اكسس در ارقام با دقت بالا زیاد دقیق نیست مگر اینكه از داده نوع Currency استفاده كنید.مثال برای داده های نوع Number می تواند مثلا شماره كدپستی یا شماره كارگری باشد.

داده از نوع Data/Time (زمان/تاریخ):

داده های از نوع تاریخ و زمان را در فیلدهایی كه نوع آنها Data/Time است نگهدارید. از این نوع داده در فیلدهایی مانند تاریخ استخدام و زمان ملاقاتها استفاده می شود. وقتی فیلدهای تاریخ و زمان را از نوع Data/Time تعیین می كنید, اكسس به شما امكان مرتب كردن آنها را بر اساس تاریخ و زمان می دهد. مثلا می توانید گزارشی از تمامی كرامندانی كه تاریخ شروع به كار آنها اول مهرماه 1377 بوده است و یا فهرستی از تمامی حسابهایی كه بیش از 60 روز به سررسید آنها مانده را چاپ كنید.

فیلد داده از نوع Currency (ارز):

از این نوع داده ها برای نگهداری مقادیر پولی یا ارزی استفاده می شود. داده از نوع Currency, كاربر را مطمئن می سازد كه مقادیر پولی/ارزی كه در محاسبات بكار می روند به درستی گرد شده اند.(ولی یك مشكل كوچك در اكسس 2000 در این نوع فیلد برای ثبت نتایج به ریال وجود دارد) اكسس تمامی مقادیر پولی/ارزی را با 15 رقم در سمت چپ و چهار رقم در سمت راست نقطه اعشار(ممیز كسری) نگه می دارد, لذا می توانید اعداد با دقت بالا را در فیلدهای پولی نگه دارید. از مثالهای بارز این نوع فیلد مقدار حقوق كارمند را می توان ذكر كرد.

فیلد داده از نوع Auto Number (عدد خودكار):

وقتی كه فیلدی را را از نوع داده Auto number تعریف می كنید, با هر ركوردی كه به جدول اضافه شود اكسس بطور خودكار عددی را در این فیلد نگه می دارد.سه نوع ارقامی كه اكسس در فیلد عدد خودكار نگه می دارد, عبارتند از:
----------------
اعداد متوالی: هنگامی كه ركورد جدی را به جدول اضافه می كنید, اكسس رقمی متوالی را تخصیص می دهد كه از 1 شروع می شود. مقادیر متوالی Auto Number معمولا برای كلید اصلی جدول بكار برده می شوند.
اعداد تصادفی: اكسس در ركورد جدید به این فیلد, عددی منحصر به فرد و تصادفی را اختصاص می دهد. اعداد شناسائی انعكاسی: اكسس مقدار منحصر به فردی را به این فیلد تخصیص می دهد كه پایگاه داده های تكرار شونده را با یكدیگر هماهنگ می كند.
----------------
فیلد داده از نوع Yes/No (بلی/خیر):
فیلدی كه از نوع Yes/No تعریف می شود به ازای Yes عدد 1- و به ازای No عدد 0 را دارا می شود. با استفاده از بخش Filed Properties در پنجره مذكور می توانید بسته به دلیل استفاده از فیلد, یكی از سه حالت Yes/No, True/False (درست یا غلط) یا On/Off (روشن و خاموش) را به كار ببرید. از موارد استفاده از این نوع داده می توان به متاهل بودن اشاره كرد كه می تواند یا بله یا خیر را دربرگیرد.

فیلد داده از نوع شی OLE:
OLE مخفف Object Linking and Embedding (اتصال و نشاندن شی) است. اگر برنامه دیگری تحت ویندوز از OLE پشتیبانی كند یعنی بتواند شی قابل انتقال به برنامه دیگری را ایجاد كند آنگاه فیلد شی OLE در اكسس نیز قادر خواهد بود تا آن داده را در خود نگه دارد. فیلدهای OLE برای نگهداری اشیایی از قبیل عكس, تصاویر ویدیوئی و صدا مناسب است. (همانطور كه ملاحظه می كنید, پایگاه داده اكسس علاوه بر داده های عددی و متنی می تواند انواع متنوع دیگری از داده ها را نیز نگه دارد.)
وقتی كه فیلدی از نوع OLE را در جدول قرار می دهید, می توانید علاوه بر مثلا اطلاعات مربوط به اقلام موجودی, تصویر آن را نیز به شكل یك شی OLE در درون فیلد OLE قرار دهد. به این ترتیب هنگامی كه ركورد را نمایش می دهید, اكسس داده های ركورد را همراه با تصویر نمایش می دهد.
برای نگهداری فیلدهای از نوع OLE در پایگاه داده اكسس به نرم افزاهای كمكی از قبیل برنامه های گرافیكی و یا صفه گسترده نیاز دارید.

داده از نوع Hyperlink (ابرمتن):

این نوع فیلد برای نگهداری ابرمتنها بكار می روند. اگر تا حالا تجربه كار كردن با برنامه های طراحی صفحات وب یا كاركردن با كدهای HTML را داشته باشید منظور از ابرمتنها را به خوبی می دانید. ابرمتنها در واقع لینكهای اینترنتی هستند كه ما را به صفحات مختلف در اینترنت هدایت می كنند مثلا ما اگر لینكی به صورت http://www.yahoo.com داشته باشیم و برروی آن كلیك كنید ما را به صفحه یاهو خواهد برد و در واقع این نوع فیلد از انواع فیلدهایی است كه به ندرت مجبور به استفاده از آن می شویم. عملكرد آنها درست مانند فیلو از نوع متن می باشد با این تفاوت كه در اینجا هر متنی را كه برای نگهداری تایپ كنیم در واقع آن لینكی از به یك صفحه اینترنتی.
از موارد استفاده از این فیلد می توان به نگهداری آدرسهای اینترنتی مرتبط با شركت اشاره كرد.

داده از نوع Lookup Wizard (جادوگر جستجوگر):

هنگامی كه فیلدی از نوع Lookup Wizard ایجاد می كنید, اكسس با بكار گرفتن جادوگری به آن امكان می دهد تا بجای یك مقدار, فهرستی از مقادیر را نگهدارد. این فیلد می تواند فهرستی از مقادیر را از یك جدول یا بازجست و یا فهرستی از مقادیر ثابتی كه در هنگام ایجاد فیلد تعریف كرده اید,( برای فهرستهایی كه مقادیر ثابتی دارند) باشد.
فرض كنید كه شركتی به پنج كشور كالا می فروشد. هنگام طراحی پایگاه داده می توانید با بكار انداختن Lookup Wizard, فهرست ثابتی از اسامی كشورها بسازید كه در هنگام ورود داده ها به جدول, ظاهر شود.
هنگام كه كاربر بخواهد كشوری را انتخاب كند به جای تایپ نام كشور برای هر ركورد فقط باید از فهرست ثابت انتخاب كند.
حال شما قادر به شناسایی انواع داده های موجود در اكسس می باشید و با نوع عملكرد آنها آشنا هستید و تا حدودی قار به ایجاد جدول هستید .

خصوصیات فیلدها

اگر به خاطر داشته باشید در دروس قبلی شروع به طراحی پایگاه داده های خود كردیم و در مورد پنجره Design View كه ما را در طراحی جداول یاری می كند به طور مفصل صحبت شد. همچنین در درس قبل در مورد انواع داده هایی كه از طرف اكسس پشتیبانی می شود و شما می توانید از آنها در ایجاد جداول خود كمك بگیرید بحث كردیم. حال كه ما با انواع داده ها آشنا شدیم وقت آن رسیده است كه به تنظیم خصوصیات این داده ها بپردازیم و این همان موضوعی است كه در این درس به آن پرداخته شده است.

تعریف خواص فیلد:

به محض آنكه شما نوع داده را از لیست قسمت Data Type انتخاب كردید در پایین همان پنجره قسمتی كه به Field Properties مشهور است در پایین گوشه چپ نمایان می شود كه در این پنجره كوچك كه دارای دو شاخص General و Lookup می باشد ما اقدام به تنظیم خواص فیلد می كنیم. بسیاری از فیلدهای خواص فیلد, اختیاری است. برخی از فیلدها به هیچ فیلد خاصه ای نیاز ندارند حال آنكه برخی دیگر از فیلدها به چندین فیلد خاصه نیاز دارند. شما می توانید در شكل 101 در زیر پنجره خواص فیلد برای یك فیلد متنی را مشاهده كنید.
هر فیلدی كه دارای نوع خاصی است همچنین دارای خصوصیات مربوط به خود می باشد كه با خصوصیات دیگر فیلدها متفاوت می باشدمثلا در شكل بالا ما از لیست باز شده Text را كه فیلد متنی ایجاد می كند را انتخاب كردیم اگر به جای آن یك نوع دیگر فیلد مانند Number (اعداد) را انتخاب می كردیم خصوصیات فیلد ما كه در پایین پنجره مشخص است متفاوت از این شكل می شد یعنی فیلد متنی خصوصیات مربوط به خود را دارد و فیلد اعداد خصوصیات متمایز از فیلد متنی این موضوع در مورد انواع دیگر داده نیز صدق می كند. همانطور كه برای فیلد خود نوع داده ای را انتخاب كردیم مانند Text باید برای آن خصوصیات مخصوص به خود را نیز ذكر كنیم. برای این كار می توانیم بر روی كادرهای موجود در قسمت خصوصیات فیلد كلیك كرده و مقدار مورد نظر خود را در آنها وارد كنیم كه در طول این درس ما با نحوه عملكرد كادرهای خصوصیات فیلد آشنا خواهیم شد.
بخش Field properties (خصوصیات فیلد) خاصه هایی از قبیل اندازه فیلد, شكل نمایش و تعداد اعشار را مشخص می كند. هر نوع فیلد داده, مجموعه فیلدهای خاصه خودش را دارد. در زیر به ترتیب به معرفی خاصه های مختلف هریك از انواع داده می پردازیم.

خواص فیلد متنی:

در زیر هر یك از مقادیر خاصه های فیلد از نوع Text را تشریح كرده ام:
--------------->
Field Size(اندازه فیلد): حداكثر طول داده ای را كه در فیلد قابل نگهداری است تعیین می كند مثلا اگر ما بخواهیم كه كاربر در فیلد نام بیش از 15 كاراكتر قرار ندهد می توانیم با تنظیم این خصوصیت روی 15 بیش از این مقدار را قبول نكنیم.
Format(شكل): شكلی را كه اكسس برای نمایش داده فیلد بكار می برد تعیین می كند. مثلا ما می توانیم در این قسمت تعیین كنیم كه حرف اول فیلد ما به صورت بزرگ نشان داده شود.
Input Mask(قالب ورودی): نحوه ورود داده به فیلد را تعیین می كنیم مثلا اگر ما كد كارگری به شكل 2225-2 داشته باشیم می توانیم تعیین كنیم كه كاربر به هنگام وارد كردن كد در این قسمت حتما باید در دومین كاراكتر خط فاصله قرار دهد.
Caption(عنوان): پیامی است كه در هنگام انتخاب فیلد در حالت نمایش Datasheet در میله وضعیت نمایش داده می شود.
Value Default(مقدار پیش فرض):مقداری است كه كاربر همواره در فیلد مشاهده می كند مگر آنكه آن را تغییر دهد مثلا در فیلد جنسیت می توان نام مرد را همواره برای كاربر نشان داد و اگر كاربر مایل باشد می تواند آن را تغییر دهد و یا آنرا به صورت پیش فرض قبول كند.
Validation Rule(قاعده مقبولیت): مقادیری كه كاربر در فیلد وارد می كند را محدود می سازد (در این مورد در دروس آتی بیشتر صحبت می كنیم)
Validation text(متن مقبولیت):پیام خطایی است كه در صورتیكه كاربر اقدام به ورود مقداری كند كه قاعده مقبولیت را نقض كند نمایش داده می شود.
Required(ضرورت):مشخص می كند كه آیا كاربر می تواند در هنگام ورود داده در جدول این فیلد را خالی رد كند یا حتما باید مقداری در آن وارد كند مثلا اگر كاربر فیلد كه كلید اصلی می باشد خالی رد كند برنامه با مشكل روبرو می شود.
Allow Zero Length(مجاز بودن طول صفر): مشخص می كند كه آیا متنی با طول صفر در فیلد قابل قبول است یا نه.
Indexed(نیاز به ایجاد اندیكس):مشخص می كند كه آیا فیلد به اندیكس نیاز دارد یا نه. فیلد اندیكس مرتب كردن و جستجو را تسریع می كند.
Unicode Compression(فشرده سازی یونیكد): در این قسمت تعیین می كنیم كه مایلیم فیلد ما با استفاده از سیستم Unicode فشرده سازی شود كه این گزینه برای قابلیت فارسی نویسی در اكسس مفید می باشد.(در مورد سیستم Unicode می توانید به دروس HTML در همین سایت مراجعه كنید).
---------------
توجه: هنگامی كه خاصه اندازه فیلد را معین می كنید, آنرا بزرگتر از آنچه واقعا نیاز دارید قرار ندهید. اكسس فضای تخصیص یافته را بر مبنای این مقدار تعیین می كند, صرفنظر از اینكه طول به كار گرفته شود یا خیر. در صورت بزرگتر گرفتن آن , فضای دیسك بیهوده اشغال می شود.
فیلدهای Format(شكل) و Input Mask(قالب ورودی) پیچیده ترین خاصه های هر فیلد هستند. به عبارت دیگر, هنگامی كه نحوه نمایش و ورود داده با استفاده از این خاصه ها را یاد می گیرید چنان است كه گویی زبان جدیدی را فرامی گیرید. اینكه اكسس چگونه داده های وارد شده در فیلد را نمایش دهد, توسط فیلد خاصه Format تعیین می شود و خاصه Input Mask چگونگی ورود داده در فیلد را تعیین می كند.
در زیر مقادیری را كه شما می توانید در فیلد خصوصیت شكل Format وارد كنید تشریح شده اند كه به وسیله آنها می توانید نحوه نمایش داده ها را تعیین كنید:
--------------->
! : برخلاف پیش فرض تراز از سمت راست, داده های درون فیلد را تراز به سمت چپ می كند.
* : در این مكان از فیلد كاراكتری باید قرار گیرد.
& : در این مكان از فیلد وجود كاراكتر دلخواه است. (الزامی نیست)
< : در این مكان از فیلد كاراكتر به حروف كوچك تبدیل می شود.
> : در این مكان از فیلد كاراكتر به حروف بزرگتر تبدیل می شود.
: بجای اینكه كاراكتر بعدی را حرفی در نظر گیرد, آنرا بعنوان كد شكل در نظر می گیرد. (برای نمایش * مفید است, در غیر اینصورت اكسس ستاره به عنوان كاراكتر علامت محل فیلد در نظر می گیرد.)
--------------
مثال: بنابراین اگر خاصه format فیلدی را &>&&&&& تعیین كنید و نخستین ركورد جدول بصورت lw3dp2 باشد اكسس آنرا به lw3dP2 تبدیل می كند (كاراكتر > حرف P را به صورت حرف بزرگ P نشان می دهد).
در زیر هم به معرفی مقادیری كه شما می توانید در خاصه Input Mask قرار دهید ذكر شده اند:
------------->
0 : در این مكان از فیلد عدد باید باشد.
9 : در این مكان از فیلد عدد یا فاصله باید باشد.
# : در این مكان از فیلد عدد, علامت مثبت, علامت منفی یا فاصله می تواند قرار گیرد.
1 : در این مكان از فیلد باید یك حرف الفبایی باشد.
؟ : در این مكان از فیلد هر حرف الفبایی به دلخواه می تواند باشد.
A : در این مكان از فیلد باید یك حرف یا یك عدد باشد.
a : در این مكان از فیلد به دلخواه یك حرف یا عدد می تواند قرار گیرد.
& : در این مكان از فیلد باید یك كاراكتر یا فاصله قرار گیرد.
c : در این مكان از فیلد یك كاراكتر دلخواه قرار می گیرد.
> : كاراكتر در این محل به حرف بزرگ تبدیل می شود.
< : كاراكتر در این محل به حرف كوچك نبدیل می شود.
! : باعث می شود تا كاراكترهای ورودی در فیلد به جای آنچه از سمت راست شروع شوند, از سمت چپ شروع شوند.
: بجای اینكه كاراكتر بعدی را حرفی در نظر بگیرد آنرا به عنوان كد شكل در نظر می گیرد (برای نمایش كاراكترهای مانند * و ! مناسب است.)
--------------
مثال: بنابراین اگر خصوصیت شكل فیلدی را 0000-000(9999) تعریف كنید اكسس كاربر را مجبور خواهد كرد تا شماره تلفن را به شكل ده رقمی وارد كند.

خواص فیلد Memo:

داده از نوع Memo (یادداشت) مقادیر خاصه های فیلد زیر را نیز داراست, كه تمامی آنها در بالا بخش مربوط به فیلد Text تشریح شدند پس فقط به ذكر آنها بسنده كرده و آنها را توضیح نمی دهیم:
Format (شكل), Caption(عنوان), Default Value(مقدار پیش فرض), Validation Rule(قاعده مقبولیت), Validation Text(متن مقبولیت), Required(لازم بودن), Allow Zero Length(مجاز بودن طول صفر), Unicode Compression(فشرده سازی یونیكد).
به عبارت دیگر اگر فیلدی از نوع Memo داشته باشید می توانید درست مشابه فیلد متن شكل, عنوان و سایر خصوصیات آنرا را تعریف كنید.

خواص فیلد عددی:
در زیر مقادیر خاصه های فیلد از نوع Number تشریح شده است( به خاطر تكرار نكردن آنچه قبلا ذكر شد آنهایی كه مشابه فیلد از نوع Text می باشند ذكر نشده اند تا فقط موارد جدید به اطلاع شما برسند):
------------->
Field Size(اندازه فیلد):اگر فیلدی از نوع عدد داشته باشید و بخواهیم اندازه فیلد را در خصوصیات آنرا تعریف كنید شما می توانید از لیست موجود در این قسمت یكی را انتخاب كنید كه هر كدام را عناصر لیست را با نوع كاربرد آنرا ذكر می كنیم: Byte(برای نگهداری یك عدد كوچك بین 0 تا 255), Integer(یك عدد بزرگتر تا 32767), Long Integer(یك عدد باز هم بزرگتر تا 2/1 میلیون), Single(عدد اعشاری), Double(عدد اعشاری با دقت زیاد), Replication ID( یك مقدار عدد شناسائی انعكاسی برای هماهنگ كردن چندین جدول پایگاه داده), Decimal(برای اعدادبر مبنای دسیمال).
Format(شكل): در این بخش از خصوصیات هم باید یكی از موارد موجود در لیست را انتخاب كنید كه به ذكر آنها بسنده می كنیم: General Number(برای مقادیر معمولی), Currency(برای مقادیر پولی), Euro(برای مقادیری با واحد پول یورو), Fixed(همواره باید یك رقم اعشار داشته باشد), Standard(كه در اعداد بزرگ ویرگول نشان می دهد), Percent(برای نمایش ارقام درصدی همراه با علامت درصد),Scientific(برای نمایش ارقام علمی).
Decimal Places(ارقام اعشار): تعداد ارقام اعشاری كه برای یك مقدار نشان داده می شود.
-------------
دیگر موارد موجود در خصوصیات فیلد از نوع عدد تكراری بوده و انها را می توانید مانند فیلد از نوع متن تنظیم كنید.
اگر داده ای كه در فیلد وارد می كنید بزرگتر از نوع داده انتخابی باشد, اكسس پیام خطایی مبنی بر وجود مشكل را نمایش می دهد.

خواص فیلد تاریخ/زمان:

در زیر به تشریح هر یك از مقادیر خاصه های فیلد تاریخ/زمان می پردازیم توجه كنید كه از ذكر موارد تكراری اجتناب شده است.
------------>
Format(شكل): در این بخش از خصوصیات باید از لیست موجود یكی را به دلخواه و نحوه عملكرد برنامه انتخاب كنید: General Data (برای تاریخ به شكل 1382/4/20 و زمان به شكل 3:12:2 عصر ), Long Data(برای نشان داده تاریخ به شكل بلند كه در آن نام ماه ذكر شده است), Medium Data(برای نشان دادن تاریخ به شكل 82-مرداد-20), Short Data(برای نشان دادن تاریخ به شكل معمول و كوچك), Long Time(برای نشان دادن زمان به شكل 3:12:2 عصر ), Medium Time:(برای نشان داده زمان به شكل 3:12 عصر ), Short Time(برای نشان دادن زمان به صورت 3:12).
------------
دیگر موارد و خصوصیات موجود در این نوع داده مانند داده از نوع Text می باشد.
توجه: اگر هیچ یك از اشكال دقیقا آنچه لازم دارید نبود, می توانید شكل مورد نظر خود را, با كاراكترهای خاص بسازید كه این مبحث یك مبحث طولانی می باشد در برنامه ما نمی گنجد شما می تواند برای اینكار از Help بهره بگیرید.

خواص فیلد Currency (ارز/پول):
این نوع از فیلد در واقع زیرمجموعه ای از داده نوع عدد می باشد كه خصوصیات آن مانند داده از نوع عدد می باشد ولی باید برای ایجاد داده از نوع ارز از قسمت Format مورد Currency انتخاب شود.

خواص فیلد از نوع Auto Number(عدد خودكار):

در زیر هر یك از موارد و خصوصیات داده از نوع عدد خودكار شرح داده شده است:
------------>
Fielg Size(اندازه فیلد): اگر می خواهید به صورت پیش فرض از این نوع داده استفاده كنید از لیت باز شده Long Integer را انتخاب كنید ولی اگر می خواهید از پایگاه داده تكرار شونده استفاده شود باید Replication ID انتخاب شود.
New Values(مقادیر جدید): باید تعیین كنید كه اكسس اعدادی را كه در این فیلد قرار می دهد از نوع Increment(به صورت افزایشی) یا از نوع Random(به صورت تصادفی) باشد.
Format(شكل): لیست موجود در این بخش از خصوصیات فیلد درست مانند داده از نوع عدد می باشد كه می توانید مانند آن یكی از مقدارهای موجود را انتخاب كنید.)
------------
دیگر خصوصیات موجود در این نوع داده در بالا ذكر شده كه از تكرار كردن آنها اجتناب می كنیم.

خواص فیلد Yes/No(بلی/خیر):
هر یك از خصوصیات این فیلد در زیر تشریح شده است و طبق معمول از تكرار اجتناب كرده ایم:
----------->
Format(شكل): برای اینكه نحوه نمایش فیلد برای اكسس مشخص شود یكی از حالات Yes/No(بلی یا خیر), True/False(درست/غلط), On/Off(روشن/خاموش) را می توانید انتخاب كنید.
-----------

خواص فیلد شی OLE :

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

خواص فیلد از نوع Hyperlink(ابرمتن):
خاصیتهای موجود برای این نوع از داده همانند خواص موجود برای داده از نوع Text(متن) می باشد كه من ضرورتی در تكرار موارد ساده ای مانند این نمی بینم.

خواص فیلد Lookup Wizard(جادوگر جستجوگر):

داده از نوع Lookwizard جادوگری را به كار می اندازد كه شما با طی مراحل این جادوگر و انتخاب جدول و فیلدهای جدولهایی كه انتخاب كرده اید و می خواهید داده ها از آنها استخراج شده و در مقابل كاربر نشان داده شود خصوصیات متفاوتی را برای شما نمایان می كند.(توجه كنید كه برای استفاده از جادوگر جستجو قبلا باید جدولی داشته باشید كه داده ها از آن استخراج شده و در این قسمت قرار داده شود پس اول جدولی حاوی داده هایی كه می خواهید در لیست قرار داده شود ایجاد كرده وسپس از جادوگر استفاده كنید). بعد از طی مراحل جادوگر و ایجاد آن شما می توانید بر روی شاخص Lookup موجود در قسمت خصوصیات فیلد كلیك كرده تا خصوصیات مربوط به جادوگر طراحی شده برای شما نمایان شود در زیر هر یك از این خصوصیات موجود تشریح شده است:
----------->
Display Control(كنترل نمایش داده شده): این خاصه مشخص می كند كه در هنگام دریافت اطلاعات در حالت نمایشی Datasheet چه كنترلی در این فیلد اعمال شود لیست موجود در این قسمت حاوی Text Box(جعبه متن), List Box(جعبه لیست شده), Combo Box(جعبه تركیب) می باشد.
Row Source Type(نوع ماخذ سطر):مشخص كننده جایی است كه داده از آن منشا می گیرد. گزینه های ممكن عبارتند از Table/Query(جدول یا بازجست), Value List( داده هایی كه وارد می كنید), Field list(فهرستی از فیلدهای یك جدول یا جستجو).
Row Source(ماخذ سطر): می تواند یك جدول یا بازجست یا معمولا یم عبارت SQL باشد. از شنیدن عبارت SQL مضطرب نشوید نمایشش شاید به چشم گیج كننده برسد اما در واقع همان چیزی است كه هنگام ایجاد بازجست آنرا می سازید. پس زیاد این قسمت از خصوصیات را دستكاری نكنید تا با آن بیشتر آشنا شوید.
Bound Column(ستون مقید): ستونی از List Box یا Combo Box است كه قبلا انتخاب شده است و این فیلد داده های نمایش را از آن برمی دارد.
Column Count(تعداد ستونها): تعداد ستونهای ماخذ سطری است كه می خواهید نمایش داده شود.
Column Heads(عناوین ستونها): تعیین می كند كه آیا برای ستونها عنوانی نیز نمایش داده شود یا نه.
Column width(پهنای ستونها): پهنای هر یك از ستونها را بر حسب سانتیمتر نشان می دهد كه با ویرگول از هم جدا شده اند.
List Rows(تعداد سطور فهرست): این خصوصیت همانطور كه از نامش پیدا است تعداد ستونها نمایش داده شده را تعیین می كند.
List Width(پهنای فهرست): پهنای كلی Combo Box یا List Box را مشخص می كند.
Limit to list(محدود به فهرست): مشخص می كند كه آیا كاربر باید از فهرست انتخاب كند یا این كه می تواند مقادیر مورد نظرش را نیز وارد كند.
----------
Lookup Wizard قابلیتی جالب است, این قابلیت ابزار قدرتمند و سودمندی است. هر چند تا زمانی كه قدری با اكسس كار نكنید از این فهرستها در جدول استفاده نخواهید كرد, لیكن هنگامی كه آماده استفاده از آن شدید متوجه خواهید شد كه كار با آنها ساده است.

خواص جستجو:

در قسمت خصوصیات فیلد سربرگ دیگری به نام Lookup وجود دارد كه آنرا می توانید برای بعضی از نوع داده ها تنظیم كنید نه برای همه و كار با این سربرگ بسیار ساده و راحت است و تمامی موارد موجود در آن را توضیح داده ایم وشما در كار كردن با آن كه بسیار كم به آن احتیاج خواهید داشت مشكلی نخواهید داشت.

ذخیره كردن جدول:

در هنگام طراحی جدول حتما به خاطر داشته باشید كه كلید اصلی را در آن ایجاد كنید یا به عبارت دیگر بهتر است قبل از هر كاری كلید اصلی را در ابتدای جدول ایجاد كنید.
اما بعد از اینكه جدول خود را به طور كامل تعریف كردیدباید آنرا ذخیره كنید. برای این كار می توانید با زدن علامت ضربدر گوشه سمت راست بالا جدول اقدام به بستن جدول كنید و هنگام سوال كردن از شما مبنی بر ذخیره جدول آنرا تائید كرده و نامی را كه در نظر دارید به جدول خود اختصاص دهید. پس از این كار جدول بسته خواهد شد و نام آنرا می توانید در میان فهرست جداول موجود ببینید.

حالا شما قادر به طراحی جداول می باشید هرچند كه پیچیده باشند و به مرور زمان در این كار استاد خواهید شد. حال كه شما می توانید اولین شی موجود در پایگاه داده خود را ایجاد كنید پس اقدام به اینكار كرده و چندین جدول را برای برنامه خود ایجاد كنید كار زیبا و لذت آوری است.

ورود داده‌ها به جدول
حال كه در سه درس قبلی با طراحی جداول در اكسس آشنا شدید و موفق شدید كه اولین جدول خود را طراحی و در پایگاه داده قرار دهید موقع آن رسیده است كه از جداول طراحی شده توسط خودتان استفاده كامل را ببرید یعنی داده ها خود را برای نگهداری و انجام عملیات در جداول خود وارد كنید و این موضوع یعنی وارد كردن داده ها در جدول و اصلاحات در آنها موضوع درس این جلسه می باشد.
در ادامه این درس به بررسی راه كارهای موجود برای وارد كردن اطلاعات در جدول های طراحی شده خواهیم پرداخت. شاید ساده ترین و پركاربردترین راه برای ورود داده ها, استفاده از حالت نمایشی Datasheet یا صفحه گسترده باشد.اگر تا به حال تجربه كاركردن با برنامه هایی مانند Microsoft Excel را داشته باشید حتما تشابه بسیار بین این برنامه و حالت نمایشی Datasheet خواهید دید. با استفاده از حالت نمایشی Datasheet به راحتی می توانید مقادیر را در سطرها (ركوردها) و ستونهای (فیلدها) جدول وارد كنید.در این حالت نمایشی با ورود مقادیر در سطرها و ستونها در واقع ركوردها و فیلدهای جدول را پر می كنید. علاوه بر ورود داده های جدید هنگامی كه خطایی در داده وارد شده مشاهده كنید یا وقتی بخواهید مقادیر را تغییر دهید با ید داده های موجود را اصلاح كنید. اكسس برای جستجو و اصلاح محتوای جدول ها, در حالت نمایشی Datasheet ابزارهای اصلاحی متعددی دارد. حالت نمایشی Datasheet علاوه بر ورود و اصلاح داده ها, می تواند در میان داده های مورد نظر جستجو كند.

مقدمات جهت افزودن داده ها به جدول :
هنگامی كه با استفاده از حالت Design جدولی ایجاد كردید برای ورود داده ها به آن آمادگی خواهید داشت. پس اگر جدولی طراحی نكرده اید یك جدول طراحی كنید و اگر جدولی از پیش طراحی شده دارید مراحل زیر را طی كنید:
1) از لیست جدولهای موجود جدولی را كه می خواهید داده ها را در آن وارد كنید انتخاب كنید, برای اینكار كافی است بر روی نام جدول موردنظر یك بار كلیك كنید.
2)برای باز كردن جدول روی كلید Open كلیك كنید. اكسس جدول را در حالت نمایشی Datasheet نمایش می دهد. اگر اولین دفعه باشد كه اقدام به وارد كردن داده در جدول موردنظر می كنید جدول به صورت خالی ظاهر می شود ولی اگر داده ای قبلا در آن وارد كرده باشید داده های موجود نیز نشان داده خواهند شد. توجه: اگر قصد داشته باشید كه تغییری در ساختار جدول ایجاد كنید باید بر روی دكمه Design كلیك كنید تا بتوانید قسمتهای موردنظر خود را تغییر داده یا فیلدهای جدید خود را به آن اضافه كنید( در این مورد به صورت مفصل قبلا صحبت كرده ایم)
هنگامی كه برای اولین بار حالت نمایشی Datasheet ظاهر می شود, اكسس نشانگر را در ابتدای نخستین فیلد در نخستین ركورد قرار می دهد.

ورود داده ها در جدول :

به طور حتم تا حالا متوجه شده اید كه برای وارد كردن داده ها در جدول به مهارت خاصی نیاز ندارید. شروع به وارد كردن نخستین مقدار در جدول كنید تا اكسس آنرا از شما قبول كند. با استفاده از تمامی كلیدهای صفحه كلید می توانید به راحتی داده ها را در جدول وارد كرده و بین فیلدها و ركوردهای مختلف گشت بزنید.
توجه: اگر برای فیلدی خصوصیات ویژه ای را تعریف كرده باشید باید مطابق با آن عمل كنید. مثلا اگر طول فیلی را 12 كاراكتر تعیین كرده باشید, اكسس فقط امكان ورود 12 كاراكتر را به شما خواهد داد. اگر توجه كرده باشید متوجه می شوید كه هنگامی كه شما شروع به وارد كردن اولین مقدار در نخستین فیلد ركورد كردید, اكسس به طور خودكار ركورد خالی بعدی را ایجاد می كند. بدین ترتیب می توانید پس از اتمام ورود داده در اولین ركورد به ركورد بعدی بروید. همچنین اگر دقت كنید ستاره ای را در ابتدای ركورد خالی می بینید این ستاره به این معنا است كه ركورد جدید بوده و خالی نمی باشد. اگر در این ركورد جدید داده ای وارد نكنید اكسس آن را در جدول ذخیره نخواهد كرد.
یكی از راههای متداول حدكت كردن در بین فیلدهای جدول استفاده از كلید Tab است اگر كلید Tab را فشار بدهید به فیلد بعدی موجود در جدول می روید و همچنین اگر Shift+Tab را فشار دهید به فیلد قبلی موجود در جدول هدایت خواهید شد. همچنین می توانید با اشاره گر ماوس بر روی فیلد مورد نظر كلیك كرده و اقدام به ورود داده كنید.
همواره نیم نگاهی هم به میله وضعیت در پایین پنجره حالت نمایشی Datasheet داشته باشید. وقتی كه داده ها را در فیلدهای جدولی وارد می كنید میله وضعیت توضیحی در باره آن فیلد می دهد. در واقع این توضیح همان توضیحی است كه شما در هنگام طراحی جدول در قسمت Description (شرح) فیلد واردكرده اید و حال برای اطلاع كاربر در میله وضعیت نشان داده می شود. مثلا اگر در قسمت Description فیلد نام متن "نام كامل خود را وارد كنید" را وارد كرده باشید هنگامی كه كاربر می خواهد این فیلد را در جدول پر كند در میله وضعیت عبارت "نام كامل خود را وارد كنید" را می بیند.
توجه: در ابتدای ركوردی كه در حال ورود داده یا اصلاح آن هستید شكلك مداد نمایش داده می شود.
توجه كنید هنگامی كه تمامی فیلدهای یك ركورد را پر كردید و به ركورد بعدی رفتید اكسس به طور خودكار ركورد را ذخیره می كند. در این صورت در صورت به وجود آمدن اتفاق غیر قابل پیش بینی شما حداقل اطلاعات را از دست خواهید داد. ولی چنانچه مایل هستید به صورت دستی در میانهای وارد كردن داده ها در یك ركورد آن ركورد را ذخیره كنید می توانید از كلیدهای Shift+Enter استفاده كنید.

اصلاح فیلدهای جدول :

در اكسس تغییر داده های وارد شده بسیار آسان است. فقط كافی است كه با استفاده از كلیدهای Tab و Shift+Tab یا با بهره گیری از ماوس به فیلد مورد نظر خود بروید تا اكسس تمامی محتویات آن فیلد را به صورت پر رنگ درآورد.حال می توانید اقدام به ورود داده جدید در آن فیلد بكنید. فقط دقت كنید چون تمامی محتویات فیلد به حالت پررنگ است داده جدید جایگزین آنها خواهد شد.
توجه: اكسس در ابتدای ركوردی كه در حال اصلاح است علامت فلش را قرار می دهد. در واقع سه علامت مداد(ورود داده), فلش(اصلاح داده) و ستاره(ركورد جدید)علامتهای متداول جدول است.
اگر قصد ندارید كه تمامی محتویات فیلد را پاك كنید كافی است كلید F2 را فشار دهید تا داده از حالت پر رنگ خارج شود. بدین ترتیب داده جدید به داده قبلی در همان فیلد اضافه می شود.در واقع با زدن كلید F2 به حالت اصلاح وارد می شوید.البته توجه كنید كه با استفاده از ماوس می توانید در هرجایی از فیلد تغییرات لازم را بدهید و استفاده از ماوس در این كارها به مراتب راحتتر از صفحه كلید است.
در اینجا ذكر این نكته را ضروری می بینم شما می توانید از كلیدهای صفحه كلید تمامی بهره را ببرید و همه كلیدها به طوری كه در برنامه های دیگر مانند ورد عمل می كنند در اینجا نیز عمل خواهند كرد. همچنین شما می توانید با انتخاب گزینه های Copy و Paste از منو Edit محتوای یك فیلد را در فیلد دیگری كپی كنید این عمل درست مانند عمل كپی و الصاق در برنامه های واژه پرداز مانند Word می باشد و عملكرد آن بسیار ساده و آسان است.

استفاده از میله ابزار حالت نمایشی Datasheet

هنگام استفاده از حالت نمایشی Datasheet میله ابزار می تواند بسیار سودمند باشد. همانطور كه چندین بار نیز گفته ام اكسس در انجام فعالیتهای مختلف میله ابزار را تغییر می دهد. در شكل 111 در زیر شما می توانید با میله ابزار این پنجره آشنا شوید. حتما سعی كنید تمامی امكانات میله ابزار را به خاطر بسپارید كه در مواقعی به آنها احتیاج خواهید داشت.یكی از كاربردهای مفید میله ابزار دكمه view اولین دكمه موجود در این میله است كه با فشار دادن آن می توانید در بین حالتهای نمایشی Datasheet و Design حركت كنید.

كنترل بر روی ركوردهای زیاد:

فرض كنید بخواهید به جدولی كه قبلا چند صد ركورد وارد آن شده, ركوردهای جدید را اضافه كنید.ممكن است ركوردهای جدید شما را گیج كنند و یا تشخیص ركوردهای جدید دشوار باشد.قبل از ورود ركوردهای جدید می توانید تمامی ركوردهای پیشین را مخفی كنید.برای این كار كافی است از منو Records گزینه Data Entry را انتخاب كنید اكسس بجز ركوردهایی كه به تازگی وارد شده, باقی را از دید شما پنهان می كند. در این هنگام وقتی شما داده های جدید را وارد می كنید اكسس فقط ركوردهای جدیدی را كه وارد كرده اید نمایش می دهد.در واقع تمامی ركوردها در جدول وجود دارند ولی اكسس آنها را پنهان می كند. برای بازگشت به وضعیت نمایش تمامی ركوردها می توانید از منو Records گزینه Remove File/Sort را انتخاب كنید. در این صورت اكسس تمامی ركوردهای جدول را نشان می دهد.
جدولهای پایگاه داده ممكن است بسیار بزرگ باشد مثلا ممكن است در انبار یك شركت صدها جنس وجود داشته باشد كه در پایگاه داده ثبت شده اند.

برای حركت در جدولهای بزرگ بجای استفاده از كلیدهای صفحه كلید می توانید از منو Edit گزینه Goto را انتخاب كنیدتا لیستی باز شود كه به شما امكان رفتن به اولین ركورد, آخرین ركورد, ركورد قبلی یا بعدی در جدول را می دهد.همچنین اگر از لیست باز شده گزینه New را انتخاب كنید اكسس یك راست به ركورد جدیدی در انتهای جدول می رود. در واقع این لیست Goto درست مانند دكمه های حركت در زیر پنجره Datasheet است كه قبلا درباره آنها صحبت كردیم. در این دكمه شما می توانید با تایپ شماره ركورد مورد نظر یك راست به آن ركورد بروید. مثلا اگر در جدولی قصد رفتن به ركورد 1363 را دارید كافی است كلید F5 را فشار داده و عدد 1365 را وارد كنید تا اكسس به آن ركورد رجوع كند.
حتما همگی با كاربرد دكمه Undo آشنا هستید در واقع این دكمه زمانی به كار می رود كه هنگام وارد كردن داده در یك فیلد متوجه شدید كه اشتباهی رخ داده است و قصد دارید داده های قبلی فیلد به آن بازگردند با زدن دكمه Undo(بازگرداندن) از میله ابزار یا فشار كلید Esc از صفحه كلید این عمل به راحتی انجام می شود.

ورود داده های غیر متنی:
در اكثر فیلدهای پایگاه داده شما نوع داده ذخیره شده در آن را قبلا در طراحی جدول تعیین كرده اید مثلا فیلدی را از نوع متن و دیگری را از نوع عدد تعیین كرده اید اگر در هنگام ورود داده مثلا در فیلدی از نوع عدد بخواهید متن وارد كنید اكسس پیغام خطایی به شما نشان می دهد و اجازه این كار به شما داده نخواهد شد. درست است كه تعداد فیلدهایی كه به غیر از نوع متن و عدد هستند بسیار كم است ولی به هرحال ما مجبور به استفاده از آنها هستیم بعضی از این انواع داده ها روشی خاصی را برای وارد كردن داده می طلبند كه به آنها می پرازیم:

ورود داده در فیلدی از نوع Memo :

همانطور كه در دروس پیش نیز ذكر شد داده از نوع Memo نسبت به داده از نوع متن می تواند مقدار كاراكتر بیشتری را در خود نگهداری كند یعنی چیزی حدود 64000 كاراكتر. اكسس برای كار با این متن بزرگتر ابزار خاصی را در نظر گرفته است.
توجه: در حالت نمایشی Datasheet ابزارهای ورود داده برای فیلدهای از نوع Memo ضعیف است. فرمها و پنجره های محاوره(درون برنامه), قابلیتهای بهتری برای این كار فراهم می كنند.
معمولا در هنگامی كه در یك فیلد از نوع Memo قصد ورود داده ای را داشته باشیم روی آن Zoom می كنیم برای این كار كافی از كلیدهای shift+F2 را فشار دهید.
كاركرد این پنجره zoom به طرز خاصی تعجب آور است مثلا اگر شما بخواهید پس از پایان یك پاراگراف در فیلد Memo یك پاراگراف دیگر را شروع به تایپ كنیدباید به جای Enter كلیدهای ctrl+Enter را فشار دهید. تا اكسس نشانگر را به خط جدید ببرد.
اگر برای ورود داده ها از فرم استفاده كنید فرم قادر خواهد بود تا تمامی فیلد Memo را در یك لحظه نمایش دهد و به شما امكان می دهد تا به راحتی و بسیار طبیعی تر در فیلد از نوع Memo گردش كنید.(البته بعدا در مورد فرمها به طور مفصل صحبت خواهیم كرد.)

ورود داده در فیلدی از نوع Data/Time (تاریخ/زمان):

در ورود داده در این نوع فیلد باید توجه كنید كه شما در هنگام ایجاد پایگاه داده برای ورود داده در این فیلد چه شكلی را انتخاب كرده اید پس باید بر اساس همان شكل انتخابی داده ها را وارد كنید. واضح است كه در این نوع فیلدها هم تاریخ و هم زمان را می توانید وارد كنید یا یكی را وارد كنید. برای درج تاریخ سیستمی خود در این نوع فیلد (یعنی تاریخ حال) كافی است دكمه های ;+Ctrl را فشار دهید تا تاریخ موجود در سیستم در فیلد وارد شود.

ورود داده در فیلدی از نوع Yes/No (بلی/خیر):

اگر داده ای از نوع Yes/No در جدول خود داشته باشید به جای آن یك جعبه انتخابی را خواهید دید كه اگر جعبه را انتخاب كنید در واقع Yes و اگر انتخاب نكنید در واقع No را برگزیده اید. برای انتخاب جعبه های انتخابی یا باید از ماوس استفاده كنید یا اینكه كلید SpaceBar را از صفحه كلید فشار دهید.

ورود داده در فیلدی از نوع OLE:

اگر بخواهید داده های نرم افزارهای دیگر را در اكسس ذخیره كنید (مانند عكس,صوت,فیلم و غیره) باید داده ای از نوع OLE ایجاد كرده باشید نحوه ایجاد این نوع داده در دروس پیش گفته شده است. برای وارد كردن این نوع داده نمی توانید از صفحه كلید استفاده كنید پس باید روش مخصوصی را طی كنید. برای قرار دادن شی از نوع OLE ابتدا باید مكان شی OLE را با استفاده از ماوس در جدول انتخاب كنید بعد از منو Insert گزینه Object را انتخاب كنید تا پنجره ای مانند شكل 112 در زیر باز شود. این پنجره راه ورود داده های دیگر در اكسس است.

در این پنجره دو انتخاب وجود دارد یكی استفاده از نرم افزارهای گوناگون برای ایجاد فایل مورد نظر(Create New) و دیگری استفاده از فایلهایی كه قبلا ایجاد و روی هارد ذخیره شده اند(Create form file). اگر از حالت اول استفاده كنید یعنی قصد داشته باشید با استفاده از نرم افزاری دیگر اقدام به ایجاد فایل خود كنید با انتخاب گزینه Create Now از لیست كناری آن نرم افزار مورد نظر خود را انتخاب كنید و بر روی OK كلیك كنید تا نرم افزار باز شود و شی جدید ایجاد گردد.(مانند استفاده از نرم افزار Photoshop برای ذخیره یك فایل فوتوشاپ در پایگاه داده)
ولی اگر حالت دوم را مورد استفاده قرار می دهیدهرچند كه پیشنهاد من استفاده از مورد قبل است باید گزینه Create form file را انتخاب كنید تا كادری در مقابل شما ایجاد شود. با كلیك روی دكمه Browse اقدام به انتخاب فایل موردنظر كنید. توجه كنید كه اكسس نمی تواند در حالت نمایشی Datasheet شی از نوع OLE را نمایش دهد و فقط به ذكر یك نام در مورد آن بسنده می كند مانند Bitmap Image ولی با استفاده از فرمها یا گزارشها می توان موضوع OLE را نمایش داد.
درس ورود داده ها در جدول هم به پایان رسید. امیدواریم این مبحث برای شما مفید بوده باشد.


|
امتیاز مطلب : 17
|
تعداد امتیازدهندگان : 5
|
مجموع امتیاز : 5
موضوعات مرتبط: مقالات ACCESS , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

Join کردن بیش از ۲ جدول برای Database های  Access

کتاب ColdFusion MX Bible  برای Join کردن بیش از دو جدول یک بانک اطلاعاتی راه حل زیر را پیشنهاد می کند:

SELECT
  c.CompanyID,
  c.CompanyName,
  e.LastName,
  e.FirstName,
  e.Salary,
  d.FullName,
  d.RelationShip
FROM
  Company c INNER JOIN Employee e
  ON c.CompanyID = e.CompanyID
  INNER JOIN Dependant d
  ON e.SSN = d.SSN

که در بیشتر برنامه های Database Server درست عمل می کند .اما در بانکهای اطلاعاتی Microsoft Access پیغام خطایی با توضیح زیر می دهد :
Operator expected 

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

SELECT
  c.CompanyID,
  c.CompanyName,
  e.LastName,
  e.FirstName,
  e.Salary,
  d.FullName,
  d.RelationShip
FROM
  (Company c INNER JOIN Employee e
  ON c.CompanyID = e.CompanyID)
  INNER JOIN Dependant d
  ON e.SSN = d.SSN 

و یک نمونه ی دیگر در اتصال ۴ جدول :

SELECT
  cfarticle.id,
  cfarticle.title,
  cfarticle.description,
  cfarticle.dateadded,
  editorial.authorname as author,
  categories.name,
  levels.levelname
FROM
  ((cfarticle INNER JOIN categories ON cfarticle.category=categories.id)
   INNER JOIN editorial ON cfarticle.author=editorial.id)
    INNER JOIN levels ON cfarticle.skllevel=levels.id


|
امتیاز مطلب : 14
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات ACCESS , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

آموزش ساخت تابع Query Command

این مقاله نحوه ایجاد قابلیتی را می آموزد که ضوابط فیلتر کردن را از طریق یک فرم جدولی اکسس 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


|
امتیاز مطلب : 8
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات ACCESS , ,
تاریخ : جمعه 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]
در دو دهه‌ی قبل، محققان امکاناتی را به منظور کشف، اعمال تغییر، تحلیل، جمع‌بندی، تولید، تجزیه و به تصویر کشیدن محصولات نرم‌افزاری ابداع کردند. این امکانات شامل تهیه‌ی اسناد نرم‌افزاری در شکل‌های گوناگون، نمایش کد میانی، داده و معماری بود. اغلب ابزارهای مهندسی معکوس بر استخراج ساختار درونی سیستم موجود با هدف انتقال آن به ذهن مهندس نرم افزار تمرکز دارد. در هر صورت، این ابزارها راه زیادی در پیش دارند تا به مرحله‌ای برسند که مورد استفاده‌ی روزانه‌ی مهندسان نرم‌افزار قرار گیرند. مطالعه و درک برنامه در صنعت نرم‌افزار به منظور کنترل هزینه و ریسک چرخه‌ی تحولات سیستم‌های نرم‌افزاری از اهمیت بالایی برخوردار می‌باشد.


|
امتیاز مطلب : 12
|
تعداد امتیازدهندگان : 5
|
مجموع امتیاز : 5
موضوعات مرتبط: مقالات عمومی برنامه نویسی , ,
تاریخ : جمعه 27 مرداد 1391
نویسنده : hamidrezakhouri

زبان مدل سازی یكنواخت یا UML چیست ؟

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 و بسیاری دیگر، خود سبب افزایش كاربرد آن در محافل صنعتی و نرم افزاری دنیا گردید.


|
امتیاز مطلب : 8
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات عمومی برنامه نویسی , ,
تاریخ : جمعه 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 انجام می داد. برای هر چیز بزرگتر یا پیچیده تر، من عادت کرده ام که ارزشهای لطیف پیتون را ترجیح بدهم و فکر کنم شما نیز همین کار را انجام بدهید.


|
امتیاز مطلب : 10
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات PYTHON , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

C# توسط شرکت مایکروسافت ارائه شده که همچون دیگر زبان های برنامه‌نویسی دارای دو نوع کامپایلر است یک نوع آنcommand line نام دارد که محیطی شبیه محیط Dos را داراست و دیگری Visual است

که محیط ویندوز مانندی دارد یعنی درحقیقت محیط گرافیکی است شاید برایتان جالب باشد که بدانید چنانچه شایع شده است مایكروسافت در مصاف با جاوا، به ارائه برنامه نویسی به زبان #C پرداخته و جالب تر آن است که شباهت های بین این دو زبان بسیار چشمگیر است مایكروسافت در رابطه با میزان استفاده و گسترش زبان فوق ابراز امیدواری نموده بود که گسترش چشمگیر در میان جامعه برنامه نویسان حکایت از صحت پیش بینی ها دارد. این زبان بگونه ای طراحی شده كه نه تنها وابستگی به یك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی Runtime نیز ندارد.

در برخی از نسخه های اولیه كامپایلر زبان #C كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بایت كدهای جاوا كمپایل می كنند.

نکته جالب توجه دیگر آن است که انجمن تولیدكنندگان كامپیوتر اروپا (ECMA) زبان #C را در سوم اكتبر سال 2001 بعنوان یك استاندارد پذیرفتند

طراحان زبان#C‌ سعی کرده اند که نقص های زبان های ++C , C را برطرف نمایند و  یا یک سری از نقاط ضعف را کنار گذاشته و یا برخی از امکاناتی را که سبب افزایش "باگدهی" برنامه می شود را حذف نمایند

یادگیری این زبان برای افرادی كه دارای سابقه آشنائی با یكی از زبانهای برنامه نویسی ++C، C و یا جاوا باشند كار مشكلی نیست، حتی افرادی كه دارای آشنائی اولیه با جاوااسكریپت و یا دیگر زبانهای برنامه نویسی همچون Visual Basic می باشند نیز امكان پذیر است ولی اگر شما تاکنون برنامه نویسی نکرده اید هم می توانید با #C آغاز کنید چون زبان ساده و روانی است ،‌ برنامه نویسی مثل یاددادن بستن بند کفش به یک بجه است در صورتی که تمامی مراحل آن کامل آموزش داده نشود بسیار مشکل به نظر می رسد ولی اگر شما به سمت یادگیری این مهم می پردازید مراحل را از ابتدا با نظم و دقت دنبال کنید


|
امتیاز مطلب : 11
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات #C , ,
تاریخ : پنج شنبه 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());


|
امتیاز مطلب : 16
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات #C , ,
تاریخ : پنج شنبه 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 می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین های نوعی استفاده می شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.


|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات DELPHI , ,
تاریخ : پنج شنبه 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 ;

همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید


|
امتیاز مطلب : 12
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات DELPHI , ,
تاریخ : پنج شنبه 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 ;


|
امتیاز مطلب : 5
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات DELPHI , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

آموزش VB.NET - بخش اول

 

یک برنامه کامپیوتری ، از مجموعه ای دستورالعمل که نوع و نحوه انجام یک فعالیت را برای کامپیوتر مشخص می نمایند ، تشکیل می گردد.
دستورالعمل های نوشته شده بعنوان نمونه ممکن است به کامپیوتر اعلام نمایند که تعدادی از اعداد را با یکدیگر جمع و یا دو عدد را بایکدیگر مقایسه و بر اساس نتیجه بدست آمده ، اتخاذ تصمیم نماید. دستورالعمل های نوشته شده ، صرفا" برای کامپیوتر قابل فهم و اجراء خواهند بود.
کامپیوتر دستورالعمل های نوشته شده را اجراء و ماحصل آن رسیدن به اهدافی خواهد بود که بر اساس آن برنامه طراحی و پیاده سازی شده است . دستورالعمل ها ، می بایست با استفاده از یکی از زبانها ی برنامه نویسی نوشته شده ( کد ینگ ) و در ادامه در اختیار کامپیوتر قرار داده شوند.
زبانهای برنامه نویسی متعددی نظیر : فرترن ، بیسیک ، کوبال ، پاسکال، ،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 استفاده کنید .


|
امتیاز مطلب : 26
|
تعداد امتیازدهندگان : 7
|
مجموع امتیاز : 7
موضوعات مرتبط: مقالات VB.NET , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

آموزش VB.NET - بخش دوم

ساختارهای شرطی در Visual Basic.NET در این گفتار برآنیم تا ساختارهای شرطی در ویژوال بیسیک دات نت را بررسی کنیم. این ساختارها If..Then و Select..Case می باشند .

ساختار If..Then
ابتدائی ترین ساختار شرطی در ویژوال بیسیک دات نت ساختار If..Then می باشد. با استفاده از این ساختار هنگامی که شرط مورد نظر برقرار باشد، می توان دستور یا دستورات متعددی را اجرا نمود .


بعنوان مثال در برنامه زیر اگر زمان سیستم بعد از ظهر را نشان دهد، جمله "Good Evening IranASP.NET" بر روی صفحه نمایش داده می شود .

<%
Dim myTime As DateTime
myTime = Now

if Hour(myTime) >= 12 then
Response.write ("Good Evening IranASP.NET !")
end if
%>

همچنین ساختار If..Then عبارت Else را هم پشتیبانی می کند. اگر شرط مربوط به If برقرار نباشد، دستورات موجود در قسمت Else اجرا می شوند. به مثال زیر توجه فرمائید .

<%
Dim myTime As DateTime
myTime = Now

if Hour(myTime) >= 12 then
Response.write ("Good Evening IranASP.NET !")
else
Response.write ("Good Morning IranASP.NET !")
end if
%>

 

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

<%
Dim strBrowser As String

strBrowser = Request.Browser.Browser
Select Case strBrowser
Case "IE"
Response.Write( "You are using Internet Explorer!" )
Case "Netscape"
Response.WRite( "You are using Netscape!" )
Case Else
Response.Write( "What browser are you using?" )
End Select
%>

دقت داشته باشید که ساختار Select..Case در برنامه فوق دارای یک قسمت Case Else می باشد. هرگاه هیچ یک از حالات مقایسه ای برقرار نبود، دستورات موجود در قسمت Case Else اجرا می گردند. استفاده از Case Else اختیاری است .

متغیرهای ایستا در ASP.NET در ASP همواره از شئ Application برای ذخیره متغیرهای سراسری استفاده می شد. این عمل از لحاظ اختصاص فضای حافظه چندان مناسب نبود. در دات نت می توانیم با سود بردن از خواص متغیرهای ایستا در اکثر موارد نتیجه بهتری بدست آوریم. این روش در اکثر موارد سریعتر از استفاده از شئ Application خواهد بود . در دات نت اکثر اشیاء به صورت کلاس در نظر گرفته می شوند که فایل global.asax نیز از این قائده پیروی می کند. برای استفاده از این روش در ابتدا باید به این فایل نام یک کلا س را اختصاص دهیم. دقت کنید که همیشه سعی می کنیم در نامگذاری از اسامی که راهنمای ما باشند استفاده کنیم. برای مثال در اینجا از نام myglobal استفاده می کنیم. به منظور انجام این کار از کد زیر استفاده می شود .

< %@ Application Classname="MyGlobals" %>

سپس با استفاده از تگ Script متغیرهای خود را تعریف می نماییم. دقت کنید که باید از کلمات کلیدی Public و Shared هم استفاده نمایید .

< Script language="vb" runat="server ">
Public Shared sAli as String = "This is just a test"
< /Script>

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

x = MyGlobals.sAli

کدهای نمونه را می توانید مشاهده کنید .

< %@ Application Classname="MyGlobals" %>
< Script language="vb" runat="server" >
Public Shared sGreeting as String = " This is just a test"
< /Script >
< % @Page Language="VB" % >

< HEAD >
< script Language='vb' runat=server >
Private Sub Page_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load
Label1.Text = MyGlobals.sGreeting
End Sub
< /script >
< /HEAD >

< asp:label runat=server id=Label1 >< /asp:label >
< / body>
< /HTML >

 

بررسی اعتبار داده ها توسط VB.NET در فرم های وب
فریم ورک دات نت ، شامل مجموعه ای از کنترل های لازم بمنظور بررسی اعتبار و صحت داده های ورودی است که با استفاده از آنان در فرم های وب و ASP.NET ، می توان داده ورودی توسط کاربر در هر یک از فیلدهای موجود بر روی یک فرم وب را بررسی و در صورت عدم رعایت شرایط لازم ، پیام خطاء مناسبی را ارائه نمود. در این مقاله به تشریح نحوه استفاده از کنترل های صحت داده ، خواهیم پرداخت .

کنترل های سرویس دهنده اعتبار داده
کنترل های سرویس دهنده اعتبار داده ، امکان بررسی صحت داده مرتبط با یک کنترل سرویس دهنده ورودی نظیر یک TextBox را فراهم و در صورتیکه ماحصل بررسی بعمل آمده ، مثبت نباشد ، یک پیام خطاء نمایش داده خواهد شد. هر یک از کنترل های اعتبار داده ، عملیات خاصی را در ارتباط با بررسی صحت داده ها انجام خواهند داد . مثلا" می توان با استفاده از CompareValidator ، عملیات بررسی صحت داده ها را در ارتباط با یک مقدار خاص انجام و یا با استفاده از کنترل RangeValidator یک محدوده قابل قبول از مقادیر مورد نظر در ارتباط با یک فیلد ورود اطلاعات را انجام داد. در چنین مواردی ، حتی می توان با استفادده از کنترل CustomValidator ، شرایط خاص مورد نظر خود برای بررسی صحت داده ، تعریف و ایجاد نمود. با توجه به اینکه ، پیام خطاء در کنترل اعتبار داده نمایش داده می شود، می توان مکان مورد نظر برای نمایش پیام خطاء را نیز مشخص کرد . در این راستا ، همچنین می توان با استفاده از کنترل ValidationSummery ، خلاصه ای از نتایج تمامی کنترل های بررسی صحت داده ها را نمایش داد . عملیات بررسی صحت داده در یک صفحه زمانی محقق خواهد شد که یک کنترل Button نظیر Button ، ImageButton و یا LinkButton کلیک گردد . در این رابطه می توان با مقدار دهی False به خصلت CausesValidation ، باعث ممانعت در رابطه با بررسی صحت داده گردید . روش فوق ، در مواردی نظیر فشردن یک دکمه Cancel و یا Clear استفاده می گردد ( در چنین مواردی عملا" ما قصد بررسی صحت داده را نخواهیم داشت ) . مقدار خصلت فوق ، بصورت پیش فرض در ارتباط با یک Button از نوع Cancel و یا Clear مقدار False در نظر گرفته خواهد شد .

در نمونه مثالی که در ادامه تشریح و به بررسی آن خواهیم پرداخت از چهار کنترل اعتبار داده استفاده شده است که لازم است در ابتدا مختصرا" با عملکرد هر یک از آنان آشنا شویم

RequiredFieldValidator کنترل فوق ، مقدار یک کنترل ورودی را بمنظور حصول اطمینان از درج داده در فیلد مورد نظر توسط کاربر ، بررسی می نماید . در صورتیکه مقدار مشخص شده در فیلد مورد نظر نسبت به مقدار اولیه خود تغییر نکرده باشد ،بمنزله عدم صحت و اعتبار داده بوده و نشان دهنده این موضوع است که کاربر در فیلد مربوطه داده مورد نظر را وارد ننموده است . در حقیقت در چنین شرایطی الزامی برای درج داده در ارتباط با یک کنترل ورودی بوجود آمده و کاربر نمی تواند فیلد مربوطه را بدون اعمال تغییرات ( درج داده ) رها نموده و نسبت به آن بی تفاوت باشد . مقدار پیش فرض، یک رشته خالی ( "" ) بوده و نشاندهنده این واقعیت است که می بایست مقداری در آن درج تا در آزمون بررسی صحت داده موفقیت حاصل گردد . در این رابطه فضاء خالی اضافه شده در ابتدا و انتهای کنترل ورودی حذف و در ادامه عملیات بررسی صحت داده انجام خواهد شد . بدین ترتیب از درج فضای خالی در کنترل ورودی برای بررسی صحت داده ممانعت بعمل می آید . در برخی موارد لازم است که در مقابل مقدار پیش فرض (رشته خالی) برای یک کنترل ورودی از مقدار اولیه مورد نظر خود استفاده نمائیم ( با توجه به سیاست های طراحی بخش رابط کاربر ) . استفاده از روش فوق ، در مواردیکه دارای یک مقدار پیش فرض در ارتباط با یک کنترل ورودی بوده و قصد داریم که کاربر را ملزم به انتخاب یک مقدار دیگر نمائیم ، توصیه می گردد . مثلا" می توان از یک کنترل ListBox بهمراه یک Entry انتخاب شده بصورت پیش فرض که شامل دستورالعمل هائی برای کاربر بمنظور انتخاب یک آیتم از لیست است ، استفاده نمود . در چنین مواردی لازم است که کاربر یک آیتم دیگر موجود در لیست را از طریق کنترل انتخاب و در این رابطه نمی بایست کاربر آیتمی را انتخاب نماید که شامل دستورالعمل است . بدین ترتیب در صورتیکه کاربر همان مقدار اولیه پیش فرض را انتخاب نماید ، کنترل RequiredFieldValidator ، پیام خطاء مورد نظر خود را نمایش خواهد داد . بمنظور مشخص نمودن مقدار اولیه یک کنترل ورودی، می توان از خصلت InitialValue استفاده کرد .

با توجه به سیاست های طراحی رابط کاربر ، می توان از چندین Validator در ارتباط با یک کنترل ورودی مشابه و یکسان استفاده نمود. مثلا " می توان از یک کنترل RequiredFieldValidator ، بمنظور حصول اطمینان از درج داده در کنترل مورد نظر استفاده و در همان حال از کنترل دیگری نظیر RangeValidator نیز استفاده تا این اطمینان ایجاد گردد که ورودی درج شده در کنترل مورد نظر در محدوده قابل قبول و مجاز می باشد .

کنترل  ValidationSummary کنترل فوق ، امکان ارائه اطلاعات مختصر در رابطه با تمامی کنترل های بررسی صحت داده موجود در یک صفحه وب و در یک موفقعیت ( مکان ) را فراهم می نماید. خلاصه اطلاعات موردنظر را می توان با استفاده از روش های متفاوتی نظیر : یک پاراگراف ، یک لیست و یا یک Bulleted list . ارائه نمود. نحوه نمایش اطلاعات با استفاده از خصلت DisplayMode مشخص خواهد شد .پیام خطاء نمایش داده شده در کنترل ValidationSummary برای هر یک از کنترل های بررسی صحت داده موجود در صفحه ، توسط خصلت ErrorMessage مربوط به هر یک از کنترل ها ، مشخص می گردد . در صورتیکه خصلت ErrorMessage مربوط به کنترل بررسی صحت داده ، مقداردهی نگردد، هیچگونه پیام خطائی در ارتباط با آن کنترل خاص توسط کنترل ValidationSummary نمایش داده نخواهد شد. برای مشخص نمودن عنوان گزارش خطاء، می توان از خصلت HeaderText استفاده کرد. بمنظور کنترل نمایش اطلاعات کنترل ValidationSummary ، می توان از خصلت ShowSummary استفاده نمود . برای نمایش خلاصه اطلاعات مورد نظر در یک Message Box می توان مقدار خصلت ShowMessageBox را True در نظر گرفت .

کنترل RegularExpressinoValidator کنترل فوق ، بمنظور تطبیق داده ورودی در یک کنترل ورودی با یک الگوی تعریف شده توسط یک عبارت ، استفاده می گردد . کنترل فوق ، امکان بررسی لازم در خصوص دنباله کاراکترهای مورد انتظار نظیر آدرس های پست الکترونیکی ، شماره های تلفن و یا کد پستی را فراهم می نماید . با استفاده از خصلت ValidationExpression ، عبارت مورد نظر بمنظور بررسی صحت داده کنترل ورودی، تعریف و مشخص می گردد . گرامر عبارت بررسی صحت داده بر روی سرویس گیرنده و سرویس دهنده با یکدیگر متفاوت است . در سرویس گیرنده ، بمنظور مشخص نمودن عبارت مورد نظر از گرامر Jscript و بر روی سرویس دهنده از گرامر Regex استفاده می گردد . با توجه به اینکه، گرامرعبارات Jscript زیر مجموعه ای از گرامر Regex می باشد ، توصیه می گردد از گرامر Jscript برای تعریف عبارت مورد نظر خود استفاده تا شاهد نتایج یکسانی بر روی سرویس گیرنده و سرویس دهنده باشیم .

کنترل CompareValidator کنترل فوق، مقدار ورودی در یک کنترل ورودی را با مقدار دیگر مقایسه می نماید . از خصلت ControlToValidate برای مشخص نمودن کنترل ورودی اول و از خصلت ControlToCompare برای مشخص نمودن کنترل ورودی دوم که می بایست با یکدیگر مقایسه گردند ، استفاده می شود .درصورتیکه ماحصل مقایسه یکسان باشد، از مقدار مشخص شده توسط خصلت ControlToCompare ، استفاده می گردد .

استفاده از کنترل های اعتبار داده ASP.NET توسط ویژوال استودیو دات نت
بررسی صحت داده ورودی توسط کاربر در بخش رابط کاربر هر نرم افزار ، از جمله عملیاتی است که اولا" وقت زیادی را بخود اختصاص و ثانیا" در برخی موارد چالش های خاص خود را بدنبال خواهد داشت . فریمورک دات نت در این رابطه مجموعه ای از کنترل های بررسی صحت داده را ارائه که با استفاده از آنان می توان اقدام به بررسی داده در کنترل های ورودی موجود بر روی یک فرم وب و ارائه پیام خطاء مورد نظر در صورت عدم رعایت ضوابط و شرایط موجود توسط کاربر بمنظور ورود اطلاعات نمود . در ادامه به بررسی مثالی خواهیم پرداخت که با ارائه یک فرم از کاربر درخواست تکمیل و ارسال اطلاعات خواهد شد. در این رابطه از کاربر درخواست نام ، آدرس پست الکترونیکی و رمز عبور می گردد . پس از ارسال اطلاعات توسط کاربر ، کنترل های بررسی صحت و اعتبار داده موجود بر روی فرم ، عملیات تائید داده ورودی توسط کاربر را انجام و درصورت عدم رعایت ضوابط تعریف شده در ارتباط با هر یک از کنترل های ورودی ، پیام خطائی ،بصورت مختصر و در قسمت انتهائی صفحه نمایش داده خواهد شد .

ایجاد یک برنامه وب ASP.NET با استفاده از VB.NET بمنظور ایجاد یک برنامه وب ASP.NET با استفاده از VB.NET مراحل زیر را دنبال می نمائیم :

اجرای برنامه ویژوال استودیو دات نت

از طریق منوی File ، گزینه New و در ادامه Project را انتخاب نمائید .

در جعبه محاوره ای New Project ، در بخش Project Types گزینه Visual Bacic Projects را انتخاب ( کلیک ) و در ادامه ASP.NET Web Application را انتخاب نمائید .

در فیلد Location ، بجای نام پیش فرض #WebApplication ، نام ValidationData را در نظر می گیریم . در صورتیکه از یک سرویس دهنده محلی استفاده می گردد ، می توان نام سرویس دهنده را http://localhost در نظر گرفت . بدین ترتیب در فیلد Location ، آدرس مربوطه بصورت زیر نشان داده خواهد شد : http://localhost/ValidationData ایجاد یک فرم وب نمونه بمنظور ایجاد یک فرم وب در پروژه ایجاد شده در مرحله قبل ، مراحل زیر را دنبال می نمائیم :

اضافه نمودن یک فرم جدید با نام ValidUser.aspx به برنامه وب ASP.NET در ویژوال استودیو دات نت . بمنظور انجام خواسته فوق ، دو مرحله زیر را دنبال می نمائیم :

مرحله یک : در Solution Explorer ، بر روی گره Project کلیک سمت راست نموده و گزینه Add و در ادامه گزینه Add Web Form انتخاب گردد . مرحله دو : درفیلد Name ، نام ValidUser.aspx را درج و در ادامه گزینه Open انتخاب گردد .

در ادامه، کدهای زیر را پس از استقرار در پنجره نمایش HTML مربوط به ValidUser.aspx ، بین تگ های شروع و پایان مستقر می نمائیم .

تگ های HTML درج شده در ValidUser.aspx

< table >
< tr width = " 100 " >
نام
< /td >
< td > < input id= " txtUserName" type = " text" size = "20" maxlength =" 15" runat= " server" NAME = "txtUserName " > *
< /td >
< /tr >
< tr width= "100" >
< td >
آدرس پست الکترونیکی
< td > < input id= "txtEmail" type= "text" size ="35" maxlength= "30" runat= "server" NAME= " txtEmail" >
( < A > Ino@Srco.ir < /A > )
< /td >
< /tr>
< tr width= "100" >
< td > رمز عبور < /td >
< td > < input id= "txtPassword" type= "password" size ="15" maxlength= "10" runat= "server" NAM E="txtPassword" > *
< /td >
< /tr >
< tr width="100" >
< td > تایپ مجدد رمز عبور < /td >
< td > < input id= "txtConfirmPassword" type= "password" size= "15" maxlength= "10" runat= "server" NAME= "txtConfirmPassword" > *
< /td >
< / tr >
< / table >

کنترل های RequiredFieldValidator ، بررسی لازم در خصوص داده ورودی برای هر یک از فیلدهای موردنظر در ارتباط با کنترل های مشخص شده را انجام خواهد داد . در این رابطه کنترل های RequiredFieldValidator را در ارتباط با فیلدهای UserName و Password به فرم اضافه می نمائیم . در ValidUser.aspx ، و پنجره HTML مستقر و کد زیر را بعد از تگ < Table/ > اضافه می نمائیم .

< asp :RequiredFieldValidator id= valUserNameRequired
ControlToValidate =txtUserName ErrorMessage = "نام کاربر می بایست وارد شود " EnableClientScript =true Display= None Runat= server/ >
< asp:RequiredFieldValidator id= valPasswordRequired
ControlToValidate=txtPassword ErrorMessage="رمز عبور می بایست وارد شود " EnableClientScript=true Display =None Runat= server/ >
< asp :RequiredFieldValidator id= valConfirmPasswordRequired
ControlToValidate= txtConfirmPassword ErrorMessage= "تائید مجدد رمز عبور می بایست وارد شود "
EnableClientScript= true Display= None Runat =server/ >

فیلدهای رمز عبور تاکید مضاعفی است که کاربر دومرتبه و بدرستی رمز عبور خود را وارد نماید. کنترل CompareValidator محتویات دو فیلد را با یکدیگر مقایسه و در صورت عدم یکسان بودن آنان ، پیام خطائی نمایش داده خواهد شد . در این رابطه از یک کنترل CompareValidator بمنظور بررسی صحت ( یکسان بودن ) فیلدهای رمز عبور استفاده شده است . بدین منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زیر را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائیم .

< asp :CompareValidator id= valComparePassword
ControlToValidate =txtConfirmPassword ErrorMessage =" فیلدهای رمز عبور می بایست یکسان باشند " ControlToCompare =txtPassword Display =None
EnableClientScript =true Runat =server/ >

در برخی موارد لازم است از نوع خاصی بررسی صحت و اعتبار داده استفاده گردد . فیلد آدرس پست الکترونیکی در مثال فوق ، نمونه ای در این زمینه است . در این رابطه از کنترل RegularExpressionValidator استفاده تا این اطمینان حاصل گردد که کاربران فرمت اولیه برای درج یک آدرس پست الکترونیکی را رعایت نموده اند . محتویات فیلد فوق مجددا" بر اساس یک عبارت ( تعریف یک الگو ) بررسی شده و در صورتیکه محتویات مورد نظر با عبارت تعریف شده مطابقت نداشته باشد ، یک پیام خطاء نمایش داده خواهد شد . در این رابطه لازم است که یک کنترل RegularExpressionValidator بر روی فرم اضافه تا فرمت داده آدرس پست الکترونیکی ورودی توسط کاربر را بررسی و از صحت و رعایت فرمت مورد نظر اطمینان حاصل گردد . بدین منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زیر را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائیم .

< asp :RegularExpressionValidator ID= valEmailAddress
ControlToValidate= txtEmail ValidationExpression = ".* @.* .. *" ErrorMessage = "آدرس پست الکترونیکی درست نمی باشد "
Display =None EnableClientScript =true Runat= server/ >

در ادامه ، بر روی فرم ValidUser.aspx ، یک دکمه "ارسال" را اضافه می نمائیم .بدین ترتیب به کاربر اجازه داده خواهد شد تا صفحه مورد نظر را برای سرویس دهنده ارسال و عملیات بررسی صحت و اعتبار داده درج شده در هر یک از فیلدهای موجود بر روی فرم ، انجام شود. بدین منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser. aspx ، کد زیر را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائیم .

< br >
< input type = submit id = cmdSumbit value = submit runat =server / >

در نهایت ، از یک کنترل ValidationSummary بمنظور نمایش تمامی خطاهای بوجود آمده در یک ناحیه خاص بر روی فرم استفاده می شود. بدین منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زیر را پس از دکمه "ارسال" اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائیم .

< br >
< asp :ValidationSummary id= ValSummary HeaderText= " The following
errors were found :" ShowSummary=True DisplayMode=List Runat=server / >

پس از اتمام مراحل فوق ، با اتتخاب گزینه Save ، فرم وب ایجاد شده ذخیره و در ادامه می توان با استفاده از منوی Debug و گزینه Start ، امکان ایجاد و اجرای برنامه وب را فراهم نمود .

 

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


|
امتیاز مطلب : 8
|
تعداد امتیازدهندگان : 3
|
مجموع امتیاز : 3
موضوعات مرتبط: مقالات VB.NET , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

آموزش VB.NET - بخش سوم

دستیابی به بانک اطلاعاتی Access با استفاده از VB.NET در این مقاله قصد داریم به نحوه بازیابی و نمایش اطلاعات موجود در یک بانک اطلاعاتی Access اشاره نمائیم . هدف از مقاله فوق ، پرداختن به تمامی رویکردهای موجود در این زمینه نبوده و صرفا" به معرفی یکی از گزینه های موجود در این زمینه اشاره خواهد شد. در این راستا از تکنولوژی های ASP.NET ، ADO.NET و VB.NET استفاده خواهد شد . از کلاس های OleDbConnection ، OleDbCommand و OleDbDataReader مربوط به ADO.NET بمنظور انجام عملیات لازم در ارتباط با بانک اطلاعاتی ، از ASP.NET بمنظور ایجاد فرم وب و ارائه داده با استفاده از کنترل سرویس دهنده Table و از زبان VB.NET بمنظور نوشتن دستورالعمل های مورد نظر استفاده می گردد .

در ابتدا لازم است با سه کلاس ADO.NET که در ادامه از آنان استفاده خواهد شد ، بیشتر آشنا شویم :

کلاس  OleDbConnection :شی فوق ، یک اتصال منحصر بفرد با یک منبع داده را ایجاد می نماید. در رابطه با یک بانک اطلاعاتی سرویس گیرنده / سرویس دهنده ، این امر معادل یک اتصال شبکه به سرویس دهنده است . با توجه به قابلیت های حمایت شده توسط native OLE DB Provider ، برخی از متدها و یا خصلت ها مربوط به شی OleDbConnection ممکن است در دسترس و قابل استفاده نباشد . زمانیکه نمونه ای از OleDbConnection ایجاد می گردد ، تمامی خصلت های مربوطه ، مقدار اولیه خود را دارا خواهند بود . پس از اتمام عملیات موردنظر در ارتباط با بانک اطلاعاتی ، می بایست با فراخوانی Close و یا Dispose اقدام به غیر فعال نمودن اتصال ایجاد شده با بانک اطلاعاتی مربوطه نمود .

کلاس OleDbCommand : یک عبارت SQL و یا Stored procedure را بمنظور اجراء در رابطه با یک منبع داده ارائه می نماید. کلاس فوق از متدهای زیر بمنظور اجرای دستورات در رابطه با یک منبع داده استفاده می نماید .
ExecuteReader : متد فوق ، دستوراتی را اجراء می نماید که خروجی آنان شامل سطرهائی خواهد بود .
ExecuteNonQuery : باعث اجرای دستوراتی نظیر SQL INSERT,DELETE,UPDATE و SET خواهد شد .
ExecuteScalar : بازیابی صرفا" یک مقدار از یک بانک اطلاعاتی

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

امکانات مورد نیاز
برای دنبال نمودن این مقاله و اجرای نمونه مثالی که در ادامه بررسی می گردد ، به امکانات زیر نیاز خواهد بود :
نصب یکی از نسخه های ویندوز 2003
نصب IIS
نصب فریمورک دات نت نسخه 1.0 ,یا نسخه 1.1
یک بانک اطلاعاتی نمونه اکسس نظیر Northwind

ایجاد یک برنامه وب ASP.NET با استفاده از VB.NET بمنظور ایجاد یک برنامه وب ASP.NET با استفاده از VB.NET مراحل زیر را دنبال می نمائیم :
اجرای برنامه ویژوال استودیو دات نت
از طریق منوی File ، گزینه New و در ادامه Project را انتخاب نمائید .
در جعبه محاوره ای New Project ، در بخش Project Types گزینه Visual Bacic Projects را انتخاب ( کلیک ) و در ادامه ASP.NET Web Application را انتخاب نمائید .
در فیلد Location ، بجای نام پیش فرض #WebApplication ، نام TestAccessDB را انتخاب نمائید . در صورتیکه از یک سرویس دهنده محلی استفاده میگردد ، می توان نام سرویس دهنده را http://localhost در نظر گرفت . بدین ترتیب در فیلد Location ، آدرس مربوطه بصورت زیر نشان داده خواهد شد : http://localhost/TestAccessDB

ایجاد یک فرم وب نمونه
در نمونه کد نوشته شده از کنترل سرویس دهنده Table مربوط به ASP.NET استفاده شده که بصورت پویا یک نمایش ساده از داده بازیابی شده را نشان خواهد داد. ASP.NET  مجموعه متنوعی از کنترل های انعطاف پذیر را ارائه که می توان از آنان با توجه به رویکردهای متفاوت در رابطه با نمایش داده استفاده نمود. بمنظور ایجاد یک فرم وب در پروژه ایجاد شده در مرحله قبل ، مراحل زیر را دنبال می نمائیم :

اضافه نمودن یک فرم جدید با نام DataSample.aspx به برنامه وب ASP.NET در ویژوال استودیو دات نت . بمنظور انجام خواسته فوق ، دو مرحله زیر را دنبال می نمائیم : مرحله یک : در Solution Explorer ، بر روی گره Project کلیک سمت راست نموده و گزینه Add و در ادامه گزینه Add Web Form انتخاب گردد . مرحله دو : درفیلد Name ، نام DataSample.aspx را درج و در ادامه گزینه Open انتخاب گردد .

از طریق Toolbox مربوط به Web Forms Tab ، یک Table ASP.NET Server Control را انتخاب ( Drag ) و بر روی صفحه aspx . مستقر نمائید ( در حالت Design view )
در Properties نام ID را به DisplayTable تغییر دهید .
در Solution Explorer ، بر روی صفحه aspx   ، کلیک سمت راست نموده و گزینه View Code را انتخاب نمائید .
مرجع namespace زیر را در بالاترین قسمت فایل کلاس code-behind وارد نمائید .
Imports System.Data.OleDb

کد زیر را در ارتباط با رویداد Page_load در نظر می گیریم :

Page_Load Event handler
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
استفاده از یک متغیر رشته ای بمنظور ذخیره سازی Connectionstring'

Dim connectString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" &_
"Data Source=C:MyDBNWIND.MDB"
ایجاد یک شی OleDbConnection و ارسال مقدار متغیر ConnectionString '

Dim cn As OleDbConnection = New OleDbConnection(connectString)
فعال نمودن Connection'
cn.Open()
استفاده از یک متغیر بمنظور ذخیره عبارت SQL'

Dim selectString As String = "SELECT CustomerID, ContactName, Phone FROM Customers"
ایجاد یک شی OledbCommand'
در این خط متغیر عبارت SQL و شی OleDbConnection ، ارسال می گردد '
Dim cmd As OleDbCommand = New OleDbCommand(selectString, cn)
ارسال CommandText به Connection و ایجاد یک OleDbDataReader '
OleDbDataReader از نوع " فقط بسمت جلو " خواهد بود '
Dim reader As OleDbDataReader = cmd.ExecuteReader()
تنظیم عرض جدول '
DisplayTable.Width = Unit.Percentage(90.0)
ایجاد یک سطر جدید برای اضافه نمودن عنوان جدول '
Dim tableHeading As TableRow = New TableRow()
ایجاد و اضافه نمودن سلول های شامل ستون Customer ID '
Dim customerIDHeading As TableHeaderCell = New TableHeaderCell()
customerIDHeading.Text = "Customer ID"
customerIDHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(customerIDHeading)
ایجاد و اضافه نمودن سلول های شامل ستون Contact Name '
Dim contactNameHeading As TableHeaderCell = New TableHeaderCell()
contactNameHeading.Text = "Contact Name"
contactNameHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(contactNameHeading)
ایجاد و اضافه نمودن سلول های شامل ستون Phone '
Dim phoneHeading As TableHeaderCell = New TableHeaderCell()
phoneHeading.Text = "Phone"
phoneHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(phoneHeading)
DisplayTable.Rows.Add(tableHeading)
تکرار در بین داده انتخابی نتایج و افزودن داده برای هر یک از ستون های مورد نظر در جدول '
While(reader.Read())
Dim detailsRow As TableRow = New TableRow()
Dim customerIDCell As TableCell = New TableCell()
customerIDCell.Text = reader("CustomerID").ToString()
detailsRow.Cells.Add(customerIDCell)
Dim contactNameCell As TableCell = New TableCell()
contactNameCell.Text = reader("ContactName").ToString()
detailsRow.Cells.Add(contactNameCell)
Dim phoneCell As TableCell = New TableCell()
phoneCell.Text = reader("Phone").ToString()
detailsRow.Cells.Add(phoneCell)
DisplayTable.Rows.Add(detailsRow)
End While
بستن Connection'
reader.Close()
cn.Close()
End Sub

مقدار متغیر ConnectString در ابتدای کد نوشته شده فوق را تغییر و آن را به محلی که بانک اطلاعاتی موجود است ، اشاره دهید .
از طریق منوی File ، گزینه Save All را انتخاب تا فرم وب و سایر فایل های مرتبط با پروژه ، ذخیره گردد .
از طریق منوی Build ، گزینه Build Solution را بمنظور ایجاد پروژه ، فعال نمائید .
در Solution Explorer ، بر روی DataSample.aspx کلیک سمت راست و در ادامه گزینه View in Browser را انتخاب نمائید . در ادامه صفحه در مرورگر نمایش و شامل داده موجود در بانک اطلاعاتی مربوطه است .

اشکالات و خطاهای احتمالی
درزمان اجراء ، ممکن است با خطائی مانند زیر مواجه شویم :

The Microsoft Jet database engine cannot open the file 'C:MyDBNWIND.MDB'.
It is already opened exclusively by another user, or you need permission to view its data.

خطای فوق ، اغلب بدلیل عدم داشتن مجوز لازم بمنظور دستیابی به فایل ( فایل بانک اطلاعاتی با انشعاب mdb ) می باشد . بصورت پیش فرض ، ASP.NET تحت ASPNET account در فریمورک دات نت نسخه یک و یا NetworkService در فریمورک دات نت نسخه 1،1 اجراء می گردد.در این رابطه لازم است تغییرات لازم در رابطه با مجوز دستیابی به فایل mdb . و فولدری که شامل فایل است ، اعمال گردد .

از نصب عناصر مورد نیاز Microsoft Jet database بر روی سیستم ، مطمئن گردید. در صورتیکه MDAC 2.6 نصب شده باشد ( Microsoft Data Access Components 2.6) ، عناصر Jet را شامل نمی گردد . در چنین مواردی می بایست آخرین نسخه Jet 4.0 Service Pack ، بر روی سیستم نصب گردد .


|
امتیاز مطلب : 8
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات VB.NET , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

در این مقاله به معرفی افزونه‌های مفید در ویژوال استودیو می پردازیم.

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

 

1. AnkhSVN، كسانی كه با SVN كار می‌كنند، حتما از این افزونه استفاده كنند. اتصال به SVN و عملیات مرتبط با آن، با عنخ‌ از این ساده‌تر نمی‌شود.

2. C# SortCode Macro، این ماكروی كوچك و جمع و جور، اعضای كلاس‌ها و متدها را بر اساس حروف الفبا مرتب و گروه‌بندی می‌كند. این ماكرو در ویژوال استودیو 2005 اجرا می‌شود و گفته می‌شود حتی نسخه‌های 2003 هم می‌توانند آن را اجرا كنند. كافی است وقتی این ماكرو را لود می‌كنید، انجام عملیات را تایید كنید.

3. CodeKeep Add-in، این افزونه برای سایت CodeKeep.net است كه به‌شما اجازه می‌دهد كدهای كوچكی كه نوشته‌اید را به وب‌سایت Codekeep بفرستید و با دیگران به اشتراك بگذارید. بعد از نصب حتما فایل Readme.txt را مطالعه كنید، چرا كه سه فایل باید به‌صورت دستی در سیستم كپی شوند.

4. Code Style Enforcer، آیا شما كدهای بدون غلط می‌نویسید؟ مسلما پاسخ به این سوال منفی است، اما با كمك این افزونه، می‌توانید به‌صورت در جا كدهای خود را بر اساس كدهای استاندارد تصحیح كنید. این افزونه این عملیات را بر اساس یك سری قواعد از پیش تعیین شده انجام می‌دهد و خود شما حتی می‌توانید قواعد جدیدی برای كدنویسی خود به این افزونه تحمیل كنید. قبل از نصب این افزونه باید DXCore را از سایت زیر دریافت كنید:

http://www.devexpress.com/Products/NET/DXCore/

5. CopySourceAsHtml، اگر بلاگر هستید، یا اصلا می‌خواهید كدهای خود را در یك وب‌سایت به‌نمایش بگذارید، با كمك این افزونه می‌توانید خروجی HTML كدهای خود را دریافت كنید و با همان شكل و رنگ‌بندی، به وب‌سایت خود اضافه كنید.

6. ماكروEncapsulateAllNonPriveFelds، این ماكرو كه هنر Reflection IT‌ است، فیلدهای خصوصی و ویژگی‌های عمومی را برای شما تولید می‌كند. تنها كافی است كه یك متغیر را به‌صورت عمومی تعریف كنید و آن‌را انتخاب كنید و ماكرو را اجرا كنید. بدین ترتیب، به‌ازای هر فیلد عمومی‌ای كه ایجاد كرده‌اید، یك فیلد خصوصی و یك ویژگی عمومی خواهید داشت، یادتان باشد كه اگر SortCode هم نصب است، اول آن را ببندید، بعد این ماكرو را اجرا كنید كه با همدیگر تداخل نداشته باشند.

7. Modeling Power Toys، اگر شما در شركت محل كارتان، نقش طراح كلاس‌ها را دارید، در این صورت پیشنهاد اكید این است كه این افزونه را نصب كنید، در زیر بخشی از امكانات این افزونه را به‌اختصار بیان می‌كنیم:

جستجوی دیاگرام‌ها، جدول شناور، پنجره با قابلیت زوم، ایجاد كامنت برای كلاس‌ها، خروجی برای وب، مرور سریع، دستورات كوچك برای ایجاد و یا مدیریت كلاس‌ها و ...

8. Pinvoke.Net، این افزونه را ساایت Pinvoke.net تولید كرده است. این افزونه شبیه به CodeKeep‌ است با این تفاوت كه به توسعه‌دهندگان این امکان را می‌دهد انواع داده‌های تعریف شده و اطلاعاتی دیگر در مورد فراخوانی‌های Win32 را پیدا کرده، ویرایش کنند و به کدهای خود اضافه کنند.

9. Regions، این افزونه امکان ساختن و مدیریت مناطق کد را به سادگی برای شما فراهم می‌کند.اگر تابه‌حال هرگز از مناطق‌ كد استفاده نكرده‌اید، حتما این پست را مطالعه كنید:

http://trackerrealm.com/blogs/2007/04/make-use-of-regions-when-developing-c.html

10. SonicFileFinder، وقتی تعداد فایل‌های Solution بالا می‌رود، پیدا كردن آن كاملا زمان‌بر خواهد شد. به‌كمك این راه حل، می‌توانید كلاس‌های خود را بیابید. جستجوی ان ساده است، مثلا اگر شما كلاسی با عنوان MyClass.cs دارید، با جستجوی *Class، و یا حتی MC می‌توانید آن را پیدا كنید.

11. Regionerate، این افزونه یک برنامه رایگان است و به‌سرعت قواعد آرایشی کدهای شما را رعایت می‌كند. با دو کلیک ساده کدهای شما مرتب شده و فیلدها و سازنده‌ها و ویژگی‌ها را در مناطق کد مربوط به خود قرار می‌دهد. می‌توانید این افزونه را هم مطابق میل خود، سفارشی كنید. همچنین، امکان مرتب‌سازی متدها را بر اساس حروف الفبا، و اعضای عمومی و خصوصی را در Region‌های مخصوص به‌خود از دیگر ویژگی‌های این افزونه بسیار مفید است.

12. DPack، یک مجموعه رایگان از ابزارهای ویژوال استودی 2003 و 2005 است که بهره‌وری‌های توسعه دهندگان را افزایش می‌دهد. این بسته شامل مرورگر كد، مرورگر فایل، مرورگر Solution، مرورگر Framework، بوك‌مارك‌های شمارشی، جستجوی كد، آمارگیری از Solution و پشتیبان‌گیری از آن است.

13. BlogMyCode، برنامه‌نویسان بلاگ‌نویس به‌هوش، این افزونه این امکان را می‌دهد که کدهای خود را از داخل ویژوال استودیو در وبلاگ قرار دهیم، این کار با یک کلیک ساده انجام می‌پذیرد، کافیست کد موردنظر را انتخاب کرده، سپس با کلیک راست گزینه Blog This را انتخاب نمایید.

14. Clipboard Manager، افزونه‌ای ساده در عین حال مفید برای مدیریت کلیپ‌بورد، این افزونه 10 تا از آخرین ورودی‌های کلیپ‌بورد را به شما نشان می‌دهد.  یک نکته که در استفاده از این افزونه باید به آن توجه داشت، این است که مقدار پیش‌فرض کلید میانبر CTRL+ALT+V را باید برای استفاده از این افزونه تغییر داد. برای این کار از منو Tools->Options را انتخاب كرده و در پنجره باز شده گزینه Enviroment را انتخاب كرده (اگر این گزینه وجود ندارد، در گوشه سمت چپ پایین گزینه Show all settings را انتخاب کنید)، سپس گزینه Keyboard و در نهایت در سمت راست مقدار Show commands containing را برابر DisplayClipboardPopupList قرار دهید.

 15. Resource Refactoring Tool، این افزونه راه ساده‌ای برای استخراج کردن عبارات رشته‌ای و قراردادن آنها در فایل منبع را پیش پای می‌گذارد.

16. Code Project Browser، از روی اسم این افزونه هم می‌‌توان حدس زد که چه کاری انجام می‌دهد، با استفاده از این افزونه می‌توان به سادگی به مقالات و مطالب مفید در سایت Codeproject مراجعه كرد. بعد از نصب این افزونه در منوی Tools گزینه‌ای با عنوانThe Codeproject  درست می‌شود که شامل دو زیرمنو است: اولی برای جستجو در مقالات که با زدن کلمه کلیدی به سادگی انجام می‌شود، و دیگری تنظیمات مربوط به این افزونه. این افزونه امکان جستجو در MSDN و Live را نیز در خود دارد.

17. Oracle Developer Tools for VS، ابزاری برای توسعه دهندگان اوراکل در محیط ویژوال استودیو است.

18. TestDriven.Net، این افزونه اجرای ساده آزمون‌های واحد را با یک کلیک در هر جایی از Solutionهای ویژوال استودیو را امكان‌پذیر كرده است. در یك كلام، می‌توانید با كمك این افزونه، برنامه‌های خود را تست كنید.

19. VS 2005 Cache Visualizer، حافظه‌های نهان پروژه‌های ASP.NET خود را به‌سادگی و به‌طور مصور ببینید. 

پیوندها برای دریافت:

1. http://ankhsvn.open.collab.net/

2. http://www.reflectionit.nl/

3. http://www.codekeep.net/addins.aspx

4. http://joel.fjorden.se/

5. http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/

6. http://www.reflectionit.nl/

7. http://www.codeplex.com/modeling

8. http://www.pinvoke.net

9. http://janyou.bokee.com/index.html

11. http://www.codeproject.com/KB/macros/RegionsAddIn.aspx

12. http://www.usysware.com/DPack/Default.aspx

13. http://tinyurl.com/mbzkc3

14. http://tinyurl.com/ndnerz

15. http://www.codeplex.com/ResourceRefactoring

16. http://tinyurl.com/lls3dx

18. http://www.testdriven.net/

19. http://blog.bretts.net/?p=11


|
امتیاز مطلب : 17
|
تعداد امتیازدهندگان : 5
|
مجموع امتیاز : 5
موضوعات مرتبط: مقالات VB.NET , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

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

در نمودار بالا مهمترین لایه های Microsoft .NET را از سیستم عامل تا زبان های برنامه نویسی مشاهده می کنید.در پایین ترین لایه سیتم عامل(Win32) را می بینید وسپس CLR.

CLR و فواید آن:

CLR کدها را در زمان اجرا مدیریت میکند(مانند مدیریت حافظه و thread ها و همچنین کنترل سازگاری انواع Type های بکاررفته در کد).به کدهایی که برای اجرا در CLR نوشته شده اند Managed Code و در غیر این صورت Unmanaged Code گفته می شود.

1)امنیت:هر Managed Component  درجه ای از مجوزها را داراست به این معنی که آیا این Component می تواند به فایل دسترسی پیدا کند یا خیر/می تواندبه رجیستری دسترسی پیدا کند یا خیر/...

برای مثال کاربران میتوانند مطمئن باشند که فایل اجرایی که در یک صفحه Web قرار داده شده غیر از اجرا کردن یک موسیقی یا تصویر متحرک هیچ حق دیگری ندارد.

2)Common Type System (CTS) :compiler های زبان های مختلف که برای .NET طراحی شده اند با CTS مطابقت دارند.این امر در سازگاری زبان های برنامه نویسی تحت .NET  با یکدیگر تاثیر بسزایی دارد.(منظور از این سازگاری این است که با استفاده از هر زبان برنامه نویسی تحت .NET میتوانیم به سایر component های نوشته شده توسط این زبان ها دسترسی پیدا کنیم)

3)مستقل از پلتفرم(Platform Independence):وقتی شما با یکی از زبان های .NET یک فایل exe یا DLL تولید می کنید.این فیل در فرمت Executable نیست در عوض در فرمت MSIL

(Microsoft Intermediate Language)  میباشد.این فایل در زمان اجرا یا در زمانی که  برنامه برای اولین بار نصب میشود به فرمت ذاتی سیتم عامل (OS Native Code) کامپایل می شود.این خاصیت علاوه بر دارا بودن مزیت Platform Independence سبب افزایش کارایی نیز میشود.

عملیات کامپایل توسطJIT Compiler(Just In Time)  انجام میشود.

از دیگر فواید تبدیل Code ها به Microsoft Intermediate Language سازگاری بین زبان های تحت .NET با یکدیگر(Language Interoperability) می باشد.

XML (eXtensible Markup Language):

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

XML چیزی جز متن ساده در یک قالب مشخص نیست (XML از نوع Binary نمی باشد) بنابراین میتوان آن را به سادگی از طریق هر پروتکلی (مانند http و email ) و بدون مزاحمت Firewall ها انتقال داد.

XML Web Service:

فرض کنید برنامه شما باید از component هایی استفاده کند که روی اینترنت یا یک انترانت محلی قرار داده شده است.در واقع قسمتی از برنامه روی شبکه ای قرار داده شده که دسترسی به آن از طریق پروتکل http ممکن است.XML Web Service این نیاز شما را پاسخ می دهد.توسط XML Web Service شما پارامترهای مورد نظر را در قالب SOAP (Simple Access Object Protocol) که خود نوعی بسط از XML می باشد به Service Provider فرستاده و جواب را در همین قالب دریافت می کنید.

ADO.NET (Activex Data Object .NET :

کار کردن با پایگاه های داده مدت هاست که بر اساس مدل Connection Base می باشد.این در حالی است که این مدل در بسیاری از موارد نمی تواند برطرف کننده نیازهای برنامه های کاربردی وسرویس های امروزی باشد.

ADO.NET براساس مدل Disconnect طراحی شده است.برای رسیدن به این مدل ADO.NET از قدرت XML استفاده میکند. Component های مربوط به ADO.NET و XML در .NET Framework بطورکامل یکپارچه هستند.در این ساختار ADO.NET و XML هر دو به شی Dataset ختم می شوند. Dataset یک شی مقیم در حافظه (memory-resident) می باشد که یک مدل برنامه نویسی کامل را برای مدیریت اطلاعات بدون ارتباط با Data source ارایه می کند.قالب اصلی Dataset ، XML میباشد و می تواند از هر منبع XML پر شود.عنصر مورد استفاده در .NET برای اینکه ما بتوانیم Dataset را از بانک های اطلاعاتی مختلف پر کنیم DataProvider می باشد.

چون قالب Dataset ، XML می باشد بنابراین می تواند یک انتخاب بهینه برای فرستادن به و مصرف اطلاعات از یک XML Web Service باشد.


|
امتیاز مطلب : 16
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات VB.NET , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

عملگرها نمادهایی هستند که برای انجام اعمال خاصی مورداستفاده قرارمیگیرند. عملگرها در زبان C از تنوع زیادی برخوردارند . در C چهار دسته عملگر به نامهای ( محاسباتی ، رابطه ای ، منطقی و دستکاری بیت ها ) وجود دارند که آنها را بررسی می کنیم .


عملگرهای محاسباتی:
عملگرهای محاسباتی که در C مورد استفاده قرار می گیرند در جدول (۱) فهرستشده اند .


ردیف |      عملگر     |      نام     |       مثال     |

 


 

۱   |   -   |      تفریق و منهای یکانی |   x-y

 


 

2   |   +  |      جمع |      x+y

 


 

3   |  *  |       ضرب |      x*y

 


 

4   |   /  |       تقسیم |  x/y

 


 

5   |   %  |       باقیمانده تقسیم |    x%y

 


 

6  |   - -  |       کاهش یک واحد * | - -x یا x

 


 

۷   |  ++   |       افزایش یک واحد * | x+ + یا | + +xا

 


 

* decrement ** increment

 جدول (۱) . عملگرهای محاسباتی

عملگرهای ردیف ۱تا ۴ در جدول (۱) تقریبا” در همه زبانهای برنامه سازی وجود دارند. عملگر % که در بقیه زبانها با علامت دیگری ( مثلا” در بیسیک به صورت MOD) وجود دارد باقیمانده تقسیم دو عدد را محاسبه می کند :


 
 

اگر سه دستور فوق را توسط ماشین اجرا کنیم مقدار۳ که باقیمانده تقسیم ۱۳ بر ۵ است در z قرار می گیرد .

عملگر کاهش ، یک واحد از عملوند مربوط کم می کند .
 

x= 10 ;
- - x ;

دستور x - - از x یک واحد کم می کند و نتیجه را در x قرار می دهد که معادل دستور x = x-1  است .

عملگر افزایش ، یک واحد به عملوند مربوطه اضافه می کند :


x= 40 ;
x ++ ;

دستور ++x معادل دستور x = x + 1 است که موجب افزودن یک واحد به x می شود .
عملگرهای افزایش و کاهش یک واحد را می توان بعداز عملوند مربوطه نیز به کار برد مثل : x + + و - - x .
اگر در یک عبارت از عملگرهای افزایش و کاهش یک واحد ، استفاده کنیم به کار بردن این عملگرها در قبل و بعد از عملوند مربوطه ، با یکدیگر متفاوت است . بدین معنی که اگر این عملگرها قبل از عملوند باشند مقدار فعلی عملوند مورد استفاده قرار گرفته و سپس عملگرها بر روی آن عمل میکنند، ولی اگر بعد از عملوند مربوطه باشند پس از انجام عمل افزایش و کاهش یک واحد به آنها مقادیر جدید ، در عبارت مورد استفاده قرار می گیرند. استفاده ازعملگرهای افزایش و کاهش یک واحد ، سرعت محاسباتی را بالا می برد .
اگر در یک عبارت از چند عملگر محاسباتی استفاده شود ، مساله تقدم عملگرها مطرح می شود . ( جدول (۲) ) .


بالاترین تقدم - - | + + |
تفریق یکانی - | | * / % |
پایین ترین تقدم - | +

 

 

جدول (۲) . تقدم عملگرهای محاسباتی

 همان طور که در جدول (۲) مشاهده می شود ، عملگرهای افزایش و کاهش یک واحد دارای بالاترین تقدم و عملگرهای جمع و تفریق دارای کمترین تقدم هستند و منهای یکانی ، دارای دومین تقدم است . عملگرهایی که در یک سطر آمده اند ، مثل - و +
بدین معنی است که دارای تقدم مکانی نسبت به یکدیگر هستند. در این صورت هر کدام از غملگرها که اول ظاهر شود ، زودتر انجام خواهد شد .

عملگرهای رابطه ای :
عملگرهای رابطه ای برای تشخیص ارتباط بین عملوندها یا مقایسه آنها مورد استفاده قرار می گیرند ( جدول (۳) ) .

 نکته قابل ذک درمورد عملگرهای رابطه ای این است که عملگر== برای تشخیص مساوی بودن دو عبارت مورد استفاده قرار می گیرد. این عملگر با عملگر= که برای انتساب یک عبارت به یک متغیر استفاده می شود متفاوت است .

عملگرهای منطقی
عملگرهای منطقی ( جدول (۴) ) بر روی عملوندهای منطقی عمل میکنند. عملوندهای منطقی دارای دو ارزش درستی و نادرستی هستند .

 ارزش نادرستی درزبان C با مقدار صفر و ارزش درستی با مقادیر غیراز صفر مشخص میشود. عملگر منطقی ! دارای بالاترین تقدم و عملگر || دارای کمترین تقدم در بین عملگرهای منطقی هستند . چون عملگرهای منطقی رابطه نزدیکی با عملگرهای رابطه ای
دارند می توان تقدم آنها را نسبت به یکدیگر بیان کرد ( جدول (۵) ) .


بالاترین تقدم: |  ! |
> >= < <= |
| == != |
| && |
|
پایین ترین تقدم :  ||

 

 

جدول (۵) . تقدم عملگرهای منطقی و رابطه ای

 عملگرهای محاسباتی و رابطه ای با یکدیگر ترکیب شده و عملگرهای دیگری را بنام عملگرهای محاسباتی رابطه ای ایجاد می کنند ( جدول (۶) ) . تقدم این عملگرها از سایر عملگرها پایین تر است .


عملگر | نام | مثال |

 

 

+= | + انتساب جمع | x+=y |

 

 

= | انتساب تفریق | x-=y |

 

 

*= | * انتساب ضرب | x*=y |

 

 

/= | / انتساب تقسیم | x/=y |

 

 

%= | % انتساب باقیمانده تقسیم | x%=y |

 

 

جدول (۶) . عملگرهای محاسباتی و رابطه ای

 

در جدول (۶) ، عبارت x + = y معادل با x = x + y است .

 int a=10 ;
int b=20 ;
a+= b ;
 

با اجرای دستورات فوق متغیر a برابر۳۰ خواهد بود. زیرا دستور a + = b معادل دستور a = a + b است .

عملگر دستکاری بیت ها:
ازآنجایی که زبان C طوری طراحی شده است که بتواند دربسیاری ازموارد جایگزین زبان اسمبلی گردد. باید قادر باشد کلیه اعمال ( یا حداقل بسیاری از اعمال ) که در زبان اسمبلی قابل انجام هستند را انجام دهد . یکی از اعمالی که در زبان اسمبلی براحتی انجام پذیر است . انجام اعمالی بر روی بیت های یک بایت یا یک کلمه از حافظه است که در زبان C برای انجام این منظور از عملگرهایی استفاده می شود که به عملگرهای بیتی معروفند ( جدول (۷) ) . این عملگرها انجام اعمال تست ، مقدار دادن و یا انتقال (shift) بیت ها را در یک بایت یا کلمه حافظه امکان پذیر می نمایند. عملگرهای بیتی فقط بر روی متغیرهایی از نوع charیا intا
عمل می کنند و بر روی متغیرهایی از نوع float، double،، long double،، void، و یا سایر متغیرها قابل اجرا نیستند .

 عملگرهای بیتی &، |،و ~و(AND(، OR،و NOTو) مشابه عملگرهای منطقی AND، OR،و NOTو عمل می کنند با این تفاوت که عمل آنها بر روی یک بیت است . با فرض این که pو qو دو بیت مختلف باشند ، نحوه عمل عملگر ^ را در ذیل مشاهده می نمایید .

p  |  q | p^q |

0   |  0   |   0 |

1   |  0   |   1 |

1   |  1   |   0 |

عملگرهای بیتی در جدول (۷) مشاهده می شوند .

عملگر  | نوع عمل |
&  | AND ( و ) |
|  | OR ( یا ) |
^ | XOR ( یا انحصاری ) |
~ | NOT ( نقیض یا متمم یک ) |
>> | انتقال به سمت راست (shift right) |
<< | انتقال به سمت چپ (shift left) |

جدول (۷) . عملگرهای بیتی

همان طور که مشاهده شد ، نتیجه عملگر بیتی ^ وقتی یک (۱) است که یکی از عملوندهای آن صفر و دیگری یک باشد . به عبارت دیگر ، نتیجه عملگر بیتی ^ وقتی صفر است که هر دو عملوند آن صفر و یا هر دو یک باشند .
عملگرهای &، |،و ^و و << ، >> بر روی دو عملوند عمل می کنند.  هر انتقال به چپ ، معادل با تقسیم کردن مقدار متغیر به ۲ و هر انتقال به راست ، معادل ضرب کردن در ۲ است .

مثال ۱ :
تعداد عددی متغیر | x مقدار بیتی متغیر | x دستورات زبان | C

char x ;

| x=7 ; | 00000111 | 7 |

| x<<1 ; | 00001110 | 14 |

| x<<3 ; | 01110000 | 112 |

| x<<2 ; | 11000000 | 192 |

| x>>1 ; | 01100000 | 96 |

| x>>2 ; | 00011000 | 24 |

همان طور که مشاهده می کنید پس از اجرای دستور ۲<< x< اطلاعات واقعی از بین می روند و مساله ضرب در ۲ شدن ، در اینجا صدق نمی کند .
عملگر ~ در یک بایت یا کلمه حافظه ( یک متغیر ) کلیه بیت ها را نقیض میکند. یعنی بیت صفر را به بیت یک و بیت یک را به بیت صفر تبدیل می نماید . لذا اگر این عملگر دو بار بر روی یک متغیر عمل کند وضعیت بیت های متغیر به حالت اول برمی گردند .

مثال ۲ : x :00101100

~x :11010011
~x :00101100

همان طور که مشاهده می شود بیت های ردیف اول و ردیف آخر دارای یک وضعیت میباشند ( بیت های ردیف آخر نتیجه دوبار اجرای عملگر نقیض بر روی متغیر است ).
نکته ای که در مورد عملگرهای بیتی باید در نظر داشت این است که این عملگرها معمولا” در مبدل های دستگاهها (device drivers) مورد استفاده قرار می گیرند .
مثل برنامه هایی که برای کار با modem و با چاپگر نوشته می شوند . زیرا در این گونه موارد معمولا” تست کردن بیت های یک متغیر مد نظر خواهد بود .

عملگر ?
عملگر ? با تست یک شرط ، مقداری را به یک متغیر نسبت می دهد .
نحوه عمل ? به این صورت است که : ابتدا عبارت اول (exp1) ارزیابی می شود چنانچه این عبارت دارای ارزش true ( ارزش درستی ) باشد مقدار exp2 پس از ارزیابی ، در متغیر ذکر شده قرار می گیرد وگرنه عبارت سوم (exp3) ارزیابی شده و نتیجه آن به متغیر ذکر شده منتقل می شود .

x= 10;
y= x>9 ? 100 : 200 ;

نحوه عمل در دو دستور فوق به این صورت است که عبارت ۹> x> ارزیابی می شود . چون این عبارت یک ارزش منطقی true دارد
( ۹> x> است ) لذا عدد ۱۰۰ در متغیر y  قرار می گیرد .

عملگرهای &و *
عملگر & یک عملگر یکانی است که آدرس عملوند خود را مشخص می کند و به صورت زیر به کار می رود :

نام عملوند &
مثال :

 int num ;
p= &num ;
 

با اجرای دستورات فوق آدرس متغیر num در متغیر p قرار می گیرد. لذا عملگر & به معنی ” آدرس ” است . عملگر * همانند عملگر & یک عملگر یکانی است که محتویات یک آدرس حافظه را مشخص می کند و به صورت زیر به کار می رود .

نام عملوند *
مثل :

p= &num ;
m= *p ;
 

دستور اول ، آدرس متغیر num را در p قرار میدهد و دستور دوم ، محتویات محلی را که آدرس آن در p قرار دارد ( محتویات num ) ، را در m قرار میدهد. بنابراین مفهوم ” * محتویات آدرس ” می باشد . دو دستور فوق معادل دستور m = num; است که موجب انتقال محتویات متغیر num به متغیر m می شود .

عملگر کاما (,)
عملگر کاما برای انجام چند عمل در یک دستور ، به کار رفته و به صورت زیر استفاده می شود :
( عبارت ۲ و عبارت ۱) =) متغیر
عملگر کاما موجب می شود تا ” عبارت ” ۱ ارزیابی شده و سپس نتیجه ارزیابی ”عبارت ” ۲ با یکدیگر ارتباط دارند .

x =( y = 3 , y + 5) ;

ابتدا y باربر با ۳ قرار می گیرد و نتیجه عبارت y + 5 که برابر ۸ است در x قرار خواهد گرفت .

عملگر sizeof
این عملگر که عملگر زمان ترجمه نامیده می شود، برای محاسبه طول یک نوع و یا یک متغیر به کار رفته و به صورت زیر استفاده می شود .
; (نوع) sizeof
; متغیر sizeof
اگر بخواهیم با استفاده از این عملگرها، طول یک نوع مثل int، double و غیره را محاسبه کنیم باید آن را در داخل پرانتز قرار دهیم : اما اگر بخواهیم طول یک متغیر را محاسبه کنیم نیازی به استفاده از پرانتز نیست . به عنوان مثال :

  int a, b, c ;
a= sizeof( int) ;
b= sizeof c ;
 

تقدم عملگرها در حالت کلی
وقتی که در یک عبارت چندین عملگر مورد استفاده قرار می گیرند تقدم عملگر به صورت جدول (۸) خواهد بود .


بالاترین تقدم:   () | | ! ~ + + - - * & sizeof |
| * / % |
| + - |
| << >> |
| << = >> = |
| == =! |
| & |
| ^ |
| | |
| && |
| || |
| ? |
| = +=- = *= /= %= |
| , |

 


جدول (۸) . تقدم عملگرها در حالت کلی

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

مثال ۳ :

int x=5/ y=10/ k=4 ;
int s ;
s= x*((x+y-)3)/k ;

 

درنتیجه اجرای چند دستور فوق مقداری که درs قرار می گیرد برابر با ۱۵ خواهد بود . سپس عدد ۳ از ۱۵ کم می شود که ۱۲ حاصل می گردد و بعداز آن عمل ضرب انجام برابر با ۶۰ ( ۵ * ۱۲ ) می باشد و عملگر تقسیم (/) آخرین است.

|
امتیاز مطلب : 15
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: مقالات C++ / C , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

متغیر، نامی برای یک محل حافظه است که محتویات آن در طول اجرای برنامه ممکن است تغییر کند . اسم هر متغیر شامل حروف
aتا zا  ، Aتا Zا ، ارقام ۰تا ۹ا و خط ربط(آندرلاین) است . به طوری که با یکی از حروف و یا خط ربط شروع شده باشند . طول نام هر
متغیر بستگی به نوع کامپایلر دارد که معمولا” از ۱ز تا ۳۱ کاراکتر قابل استفاده است .


اسامی مجاز برای متغیرها | اسامی غیرمجاز برای متغیرها |

 


 

| ۱count |    count       |
| high! there | test123 |
| grad.1 |     high        |

 


 

تعریف نوع متغیر
برای استفاده از متغیرها درC باید ابتدا آنها را تعریف کنیم . تعریف متغیرها شامل نامگذاری و تعیین نوع آنها است که به صورت زیر انجام می شود :
<نوع> <اسامی متغیرها>
 برای تعریف چند متغیر در یک دستور باید اسامی با کاما از یکدیگر جدا گردد : 

int  var1, var2 ;

دستور فوق دو متغیر به اسامی var2و var1 را از نوع int تعریف می کند .

float  flovar1, flovar2 ;

دستور فوق ، دو متغیر به نام های flovar2و flovar1و را از نوع float تعریف می کند .

double d1 ;
char ch ;

اولین دستور ، d1 را از نوع double و دستور دوم متغیر ch را از نوع char تعریف می کند .

مقدار دادن به متغیرها

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

دستور اول ضمن تعریف a از نوع int مقدار آن را برابر با ۰ قرار می دهد . دستور دوم چهار متغیرb، c،، d،و eو را از نوع int تعریف کرده وفقط مقدار متغیر ch را از نوع کاراکتری تعریف کرده و مقدار آن را برابر با حرف a قرار می دهد . دستور چهارم مقدار متغیر b را برابر با ۰ قرار می دهد . دستور پنجم مقدار دو متغیر cو dو را برابر صفر قرار می دهد و این دستور ، انتساب چندتایی را مشخص می کند .
همان طور که قبلا”گفته شد مقدار متغیرها ممکن است در طول اجرای برنامه تغییر کند . با استفاده از کلمه کلیدی const می توانیم متغیرهایی را تعریف کنیم که مقدار آنها در طول اجرای برنامه ثابت باشد . برای تعریف این نوع متغیرها بصورت زیر عمل می شود :

<نوع> <اسامی متغیرها>const

نوع ، یکی از نوع هایی است که قبلا” ذکر شده و اسامی متغیرها ، مشخص کننده متغیرهایی است که باید به صورت ثابت تعریف شوند :

const int a = 10 , b = 20   ;

دستور فوق دو متغیر aو bو را از نوع int تعریف کرده و مقادیر آنها را برابر می دهد . این مقادیر در طول اجرای برنامه قابل تغییر هستند .


|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات C++ / C , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

همان طور که قبلا” گفته شد در هر زبان برنامه سازی تعدادی از نوع های داده وجود دارند که بازه ای را شامل بوده و اعمال خاصی روی آنها انجام پذیر است و در C پنج نوع داده اصلی وجود دارد که عبارتند از : char، int،، float،، double، و void .



در این زبان اندازه و محدوده ای که هر نوع داده اختیار می کند بستگی به نوع پردازشگر (Processor) و نحوه پیاده سازی کامپایلر دارد. شناسه هایی ( متغیر برچسب ، اسامی توابع و … ) که از نوع char باشند برای ذخیره کردن مقادیری که توسط کاراکترهای اسکی تعریف شده اند به کار می روند. شناسه هایی از نوع int برای ذخیره کردن مقادیر صحیح ، و از نوع floatو doubleو برای ذخیره کردن اطلاعات عددی اعشاری به کار میروند که محدوده آنها توسط تعداد ارقام و دقت آنها مشخص میشود. نوع void در مورد توابع به کار می رود .
نوعهای داده اصلی ( به جز void ) می توانند با عباراتی مثل signed، long، unsigned و short و ترکیب شده و نوع های دیگری را به وجود آورند . ( جدول (۱) ).

 


|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات C++ / C , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

زبان C در سال ۱۹۷۰ توسط دنیس ریچی طراحی گردید. این زبان تکامل یافته زبان BCPL میباشد که طراح آن مارتین ریچاردز است ،و زبان BCPL از زبان B که طراح آن کن تامپسون می باشد ، نتیجه شده است .


زبان C معمولا” یک زبان میانی نامیده می شود . این بدان معنی نیست که آموزش این زبان مشکل است ، یا قدرت آن از زبان های برنامه سازی مثل پاسکال و بیسیک کمتر است و یا این که مشکلاتی مشابه زبان اسمبلی برای برنامه نویس ایجاد می کند.
علت میانی بودن زبان C این است که عناصر زبان های سطح بالا را با خصیصه تابعی زبان اسمبلی درهم آمیخته است .برای پی بردن به جایگاه زبان C درمقایسه با سایر زبان های برنامه سازی به جدول (۱) مراجعه نمایید .

جدول (۱) . سطوح زبان های برنامه سازی

زبان C همانند سایر زبانهای میانی با مفاهیم بیت ، بایت و آدرس که از عناصر ابتدایی ماشین هستند سر و کار دارد . یعنی در این زبان می توان محتویات بیت ها و بایت ها را تیز تغییر داد .
برنامه های نوشته شده به زبان C براحتی از ماشینی به ماشین دیگر قابل انتقال می باشند . مثلا” برنامه نوشته شده برای کامپیوتر APPL در کامپیوترهای IBM قابل اجرا است . این خصیصه را قابل حمل بودن (Portability) زبان می گویند .
کلیه زبان های برنامه سازی سطح بالا و میانی دارای نوعهای داده (data types) هستند . هر نوع داده ، مجموعه ای از مقادیر را مشخص می کند که اعمال خاصی روی آنها قابل انجام است . نوع داده ای که در اکثر زبانها وجود دارد عبارتند از :
اعداد صحیح ، کاراکتری و اعداد اعشاری .
C دارای ۵ نوع داده اصلی است که در آن تقریبا” تبدیل هر نوع داده به نوع دیگر امکان پذیر است . مثلا” در یک عبارت می توان نوع کاراکتری را با نوع عددی صحیح و یا اعشاری ترکیب کرد .
زبان C خطای زمان اجرا مثل boundray checking را چک نمی کند . منظور از boundray checking این است که در آرایه ها تجاوز از حدود مشخص شده ، به راحتی امکان پذیر بوده و از نظر کامپایلر با خطایی مواجه نمیشود. این مساله برمیگردد به این که در زبان C آرایه یک اشاره گر (pointer) است . در این راستا ، نوع پارامترها و آرگومان های توابع نیز در گونه های قدیمی C با یکدیگر مطابقت نشده و از نظر کامپایلر با خطا مواجه نمی شد ولی در گونه های جدید C با معرفی الگوی تابع (Function prototype) این مشکل رفع شده است .
C همانند زبان های ALGOL، PASCAL، و… یک زبان ساخت یافته است . یک زبان برنامه سازی ساخت یافته امکانات زیادی ، از جمله استفاده از چند ساختار حلقه سازی مثل while، do-while،و forو را فراهم می کند . در این گونه زبان ها از goto به ندرت استفاده می شود و نوشتن دستورات برنامه در هر ستونی از خط و در هر جای فایل امکان پذیر بوده ، مثل زبان فرترن مقید به ستون های خاصی نیستند. استفاده از زیربرنامه ها و بلاک ها نیز از خصیصه های این نوع زبان ها هستند . ذکر اسامی چند زبان ساخت یافته و غیر ساخت یافته ، در انتخاب زبان برنامه سازی جهت برنامه نویسی مفید است . ( جدول (۲) ) .

جدول (۲) . بعضی از زبانهای ساخت یافته و غیرساخت یافته

هر برنامه در زبان C دارای خصیصه هایی است که بعضی از آنها عبارتند از :
۱-در زبان C هر دستور برنامه به یک ; ختم می شود .
۲-هر دستور میتواند درچند خط ادامه داشته و یک خط ممکن است شامل چند دستورباشد .
۳-حداکثر طول یک خط برنامه ۲۵۴ کاراکتر است .
۴-در زبان C برنامه نویس می تواند در هر نقطه از برنامه ، بااستفاده از علائم {و }و یک بلاک را مشخص کرده و هر متغیری را که می خواهد در آنجا تعریف نماید .
این متغیرها فقط در آن بلاک معنی خواهند داشت . توجه داریم که هر بلاک مجموعه ای از دستورات وابسته به یکدیگر خواهد بود :

۵-برای داشتن توضیحات در برنامه کافی است آنها را دربین /*و */ قرار داد:

*/ توضیحات /*

یک زبان ساخت یافته بلاکی نیست . این بدان معنی است که تعریف یک زیربرنامه ( در اینجا تابع ) در زیربرنامه دیگر ( همانند پاسکال ) امکان پذیر نیست و این امر از مساله coupling می کاهد .
Cزبان برنامه نویسی سیستم است . منظور از برنامه های سیستم عبارتند از :

 -1سیستم عامل (Operating system)
 -2مفسر (Interpreter)
 -3ویراستار (Editor)
 -4اسمبلر (Assrmbler)
 -5کامپایلر (Compiler)
 -6مدیریت بانکهای اطلاعاتی (Database management)

امروزه C در اکثر امور برنامه نویسی مورد استفاده قرار می گیرد . زیرا این زبان هم دارای خصیصه ” قابل حمل بودن ” است و هم دارای کارآیی خوبی می باشد و سرعت زیاد C بر محبوبیت آن افزوده است . مساله قابل حمل بودن ، یک مساله بسیار مهم است زیرا هم موجب صرفه جویی در وقت شده و هم باعث صرفه جویی در هزینه ها می گردد .
زبان C فقط دارای ۳۲ کلمه کلیدی است ( جدول (۳) ) که ۲۷ کلمه کلیدی آن توسط ریچی ( طراح زبان ) معرفی شده و ۵ کلمه کلیدی دیگر توسط موسسه استاندارد سازی زبان به آن اضافه شده است . این تعداد در مقایسه با ۱۵۹ کلمه کلیدی که در زبان بیسیک وجود دارد قابل توجه است .

 

اضافه شدن توسط موسسه استاندارد سازی زبان
جدول (۳) . کلمات کلیدی زبان C

 بعضی از کامپایلرها علاوه بر ۳۲ کلمه کلیدی جدول (۳) کلمات کلیدی دیگری به زبان اضافه نموده اند . ( جدول (۴) ) .

 

جدول (۴) . کلمات کلیدی زبان C که بعضی از کامپایلرها اضافه کرده اند

 

کلیه کلمات کلیدی در زبان C به حروف کوچک نوشته می شوند . چون در این زبان بین حروف کوچک و بزرگ تفاوت است ، به عنوان مثال کلمه else یک کلمه کلیدی است.

 

 

{
;مجموعه دستورات بلاک

|
امتیاز مطلب : 9
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات C++ / C , ,
تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

مقدمه ای بر زبان C

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



۱- زبان ماشین (سطح پایین) :
این زبان مستقیما با صفر و یک نوشته می شود و بدون هیچ واسطه ای برروی کامپیوتر قابل اجرا است. طراحان سخت افزار هر کامپیوتر، زبان ماشین خاص خود را برای آن ماشین طراحی می نمایند. به همین دلیل هر برنامه ای که به زبان ماشین نوشته شود، فقط برروی همان ماشین خاص کار می کند، بهمین دلیل برنامه های نوشته شده به زبان ماشین را غیر قابل حمل می نامند. از طرف دیگر یادگیری این زبان بسیار مشکل بوده و برنامه نویسی با آن نیز بسیار سخت است و همچنین احتمال بروز خطا نیز در آن زیاد است.
۲- زبان اسمبلی :
این زبان شکل ساده تر زبان ماشین است، بدین صورت که برای هر دستورالعمل زبان ماشین، یک اسم نمادین انتخاب شده است (مانند دستور ADD بجای کد دودویی دستورالعمل جمع) که بخاطر سپردن و برنامه نویسی با آنها برای انسانها ساده تر است. اما این برنامه ها برای ماشین قابل فهم نیست و باید قبل از اجرا شدن توسط برنامه مترجمی بنام اسمبلر به زبان ماشین تبدیل شود. توجه کنید که از آنجا که هر دستور زبان اسمبلی معادل یک دستور زبان ماشین است، این زبان نیز وابسته به ماشین می باشد و برنامه های نوشته شده به این زبان فقط برروی همان کامپیوتری که برای آن نوشته شده اند قابل اجرا است. علاوه براین کار با این زبانها هنوز هم نسبتا مشکل بود و فقط متخصصین کامپیوتر قادر به استفاده از آنها بودند.
۳- زبانهای سطح بالا :
دستورالعملهای این زبانها بسیار نزدیک به زبان انسانها (بطور مشخص زبان انگلیسی) می باشد و بهمین دلیل برنامه نویسی به آنها بسیار ساده تر بوده و می توان الگوریتمها را به راحتی به این زبانها تبدیل کرد. از آنجا که این زبانها به هیچ ماشین خاصی وابسته نیستند، برنامه های نوشته شده با این زبانها (تا حد زیادی) قابل حمل می باشند. مثالهایی از این زبانها عبارتند از :
- بیسیک (Basic): برای کاربردهای آموزشی
- فرترن (Fortran) : برای کاربردهای علمی و مهندسی
- پاسکال (Pascal) : برای کاربردهای آموزشی و علمی
و بالاخره زبان برنامه نویسی C که درمورد آن بیشتر صحبت خواهیم کرد. البته برنامه های نوشته شده به این زبانها ابتدا باید به زبان ماشین ترجمه شوند تا برروی کامپیوتر قابل اجرا باشند. برای ترجمه این زبانها از کامپایلرها و یا مفسرها  مراجعه  استفاده می شود….

تاریخچه C:

برای بررسی تاریخچه زبان C باید به سال ۱۹۶۷ بازگردیم که مارتین ریچاردز زبان BCPL را برای نوشتن نرم افزارهای سیستم عامل و کامپایلر در دانشگاه کمبریج ابداع کرد. سپس در سال ۱۹۷۰ کن تامپسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخه های سیستم عامل Unix در آزمایشگاههای بل استفاده کرد. زبان C در سال ۱۹۷۲ توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته شد و ویژگیهای جدیدی همچون نظارت بر نوع داده ها نیز به آن اضافه شد. ریچی از این زبان برای ایجاد سیستم عامل Unix استفاده کرد اما بعدها اکثر سیستم عاملهای دیگر نیز با همین زبان نوشته شدند. این زبان با سرعت بسیاری گسترش یافت و چاپ کتاب “The C Programming Language” در سال ۱۹۷۸ توسط کرنیگان و ریچی باعث رشد روزافزون این زبان در جهان شد.
متاسفانه استفاده گسترده این زبان در انواع کامپیوترها و سخت افزارهای مختلف باعث شد که نسخه های مختلفی از این زبان بوجود آید که با یکدیگر ناسازگار بودند. در سال ۱۹۸۳ انستیتوی ملی استاندارد آمریکا (ANSI) کمیته ای موسوم به X3J11 را را مامور کرد تا یک تعریف فاقد ابهام و مستقل از ماشین را از این زبان تدوین نماید.در سال ۱۹۸۹ این استاندارد تحت عنوان ANSI C به تصویب رسید و سپس در سال ۱۹۹۰، سازمان استانداردهای بین المللی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گردید.
در سالهای بعد و با ظهور روشهای برنامه نویسی شی گرا نسخه جدیدی از زبان C بنام C++ توسط بیارنه استراوستروپ در اوایل ۱۹۸۰ در آزمایشگاه بل توسعه یافت. در C++ علاوه بر امکانات جدیدی که به زبان C اضافه شده است، خاصیت شی گرایی را نیز به آن اضافه کرده است.
با گسترش شبکه و اینترنت، نیاز به زبانی احساس شد که برنامه های آن بتوانند برروی هر ماشین و هر سیستم عامل دلخواهی اجرا گردد. شرکت سان مایکروسیستمز در سال ۱۹۹۵ میلادی زبان Java را برمبنای C و C++ ایجاد کرد که هم اکنون از آن در سطح وسیعی استفاده می شود و برنامه های نوشته شده به آن برروی هر کامپیوتری که از Java پشتیبانی کند(تقریبا تمام سیستمهای شناخته شده) قابل اجرا می باشد. شرکت مایکروسافت در رقابت با شرکت سان، در سال ۲۰۰۲ زبان جدیدی بنام C# (سی شارپ) را ارائه داد که رقیبی برای Java بشمار می رود.
برنامه نویسی ساخت یافته:
در دهه ۱۹۶۰ میلادی توسعه نرم افزار دچار مشکلات عدیده ای شد. در آن زمان سبک خاصی برای برنامه نویسی وجود نداشت و برنامه ها بدون هیچگونه ساختار خاصی نوشته می شدند. وجود دستور پرش (goto) نیز مشکلات بسیاری را برای فهم و درک برنامه توسط افراد دیگر ایجاد می کرد، چرا که جریان اجرای برنامه مرتبا دچار تغییر جهت شده و دنبال کردن آن دشوار می گردید. لذا نوشتن برنامه ها عملی بسیار زمان بر و پرهزینه شده بود و معمولا اشکال زدایی, اعمال تغییرات و گسترش برنامه ها بسیار مشکل بود. فعالیتهای پژوهشی در این دهه باعث بوجود آمدن سبک جدیدی از برنامه نویسی بنام روش ساختیافته گردید؛ روش منظمی که باعث ایجاد برنامه هایی کاملا واضح و خوانا گردید که اشکال زدایی و خطایابی آنها نیز بسیار ساده تر بود.
اصلی ترین نکته در این روش عدم استفاده از دستور پرش (goto) است. تحقیقات بوهم و ژاکوپینی نشان داد که می توان هر برنامه ای را بدون دستور پرش و فقط با استفاده از ۳ ساختار کنترلی ترتیب، انتخاب و تکرار نوشت.
ساختار ترتیب، همان اجرای دستورات بصورت متوالی (یکی پس از دیگری) است که کلیه زبانهای برنامه نویسی در حالت عادی بهمان صورت عمل می کنند.
ساختار انتخاب به برنامه نویس اجازه می دهد که براساس درستی یا نادرستی یک شرط، تصمیم بگیرد کدام مجموعه از دستورات اجرا شود.
ساختار تکرار نیز به برنامه نویسان اجازه می دهد مجموعه خاصی از دستورات را تا زمانیکه شرط خاصی برقرار باشد، تکرار نماید.
هر برنامه ساختیافته از تعدادی بلوک تشکیل می شود که این بلوکها به ترتیب اجرا می شوند تا برنامه خاتمه یابد(ساختار ترتیب). هر بلوک می تواند یک دستورساده مانند خواندن، نوشتن یا تخصیص مقدار به یک متغیر باشد و یا اینکه شامل دستوراتی باشد که یکی از ۳ ساختار فوق را پیاده سازی کنند. نکته مهم اینجاست که درمورد دستورات داخل هر بلوک نیز همین قوانین برقرار است و این دستورات می توانند از تعدادی بلوک به شرح فوق ایجاد شوند و تشکیل ساختارهایی مانند حلقه های تودرتو را دهند.
نکته مهم اینجاست که طبق قوانین فوق یک حلقه تکرار یا بطور کامل داخل حلقه تکرار دیگر است و یا بطور کامل خارج آن قرار می گیرد و هیچگاه حلقه های روی هم افتاده نخواهیم داشت.
از جمله اولین تلاشها در زمینه ساخت زبانهای برنامه نویسی ساختیافته، زبان پاسکال بود که توسط پروفسور نیکلاس ویرث در سال ۱۹۷۱ برای آموزش برنامه نویسی ساختیافته در محیطهای آموزشی ساخته شد و بسرعت در دانشگاهها رواج یافت. اما بدلیل نداشتن بسیاری از ویژگیهای مورد نیاز مراکز صنعتی و تجاری در بیرون دانشگاهها موفقیتی نیافت.
کمی بعد زبان C ارائه گردید که علاوه بر دارا بودن ویژگیهای برنامه نویسی ساختیافته بدلیل سرعت و کارایی بالا مقبولیتی همه گیر یافت و هم اکنون سالهاست که بعنوان بزرگترین زبان برنامه نویسی دنیا شناخته شده است.
مراحل اجرای یک برنامه C
برای اجرای یک برنامه C ابتدا باید آن را نوشت. برای اینکار می توان از هر ویرایشگر متنی موجود استفاده کرد و سپس فایل حاصل را با پسوند .C ذخیره نمود (فایلهای C++ با پسوند .CPP ذخیره می گردند). به این فایل، کد مبدا (source code) گفته می شود. مرحله بعدی تبدیل کد مبدا به زبان ماشین است که به آن کد مقصد (object code) گفته می شود. همانطورکه قبلا نیز گفته شد برای اینکار از یک برنامه مترجم بنام کامپایلر استفاده می شود. کامپایلرهای متعددی برای زبان C توسط شرکتهای مختلف و برای سیستم عاملهای مختلف نوشته شده است که می توانید برحسب نیاز از هریک از آنها استفاده نمایید. اما هنوز برنامه برای اجرا آماده نیست. معمولا برنامه نویسان از در برنامه های خود از یک سری از کدهای از پیش آماده شده برای انجام عملیات متداول (مانند محاسبه جذر و یا سینوس) استفاده می کنند که برنامه آنها قبلا نوشته و ترجمه شده است. این برنامه ها یا در قالب کتابخانه های استاندارد توسط شرکتهای ارائه کننده نرم افزار عرضه شده است و یا توسط دیگر همکاران برنامه نویس اصلی نوشته و در اختیار وی قرار داده شده است. در این مرحله باید کد مقصد برنامه اصلی با کدهای مربوط به این برنامه های کمکی پیوند زده شود. برای اینکار نیاز به یک پیوند زننده (Linker) داریم و نتیجه این عمل یک فایل قابل اجرا خواهد بود (در ویندوز این فایل پسوند .EXE خواهد داشت). مرحله بعدی اجرای برنامه و دادن ورودیهای لازم به آن و اخذ خروجیها می باشد. در شکل زیر این مراحل نشان داده شده اند.
مسلما طی مراحل بالا برای اجرای هر برنامه زمانبر می باشد، بهمین دلیل اکثر تولید کنندگان کامپایلرها، محیطهایی را برای برنامه نویسی ارائه کرده اند که کلیه مراحل بالا را بطور اتوماتیک انجام می دهند.
به این محیطها IDE (Integrated Development Environment) یا محیط مجتمع توسعه نرم افزار گفته می شود. این محیطها دارای یک ویرایشگر متن می باشند که معمولا دارای خواص جالبی همچون استفاده از رنگهای مختلف برای نشان دادن اجزای مختلف برنامه مانند کلمات کلیدی، و یا قابلیت تکمیل اتوماتیک قسمتهای مختلف برنامه می باشد. پس از نوشتن برنامه و با انتخاب گزینه ای مانند Run کلیه عملیات فوق بطور اتوماتیک انجام شده و برنامه اجرا می گردد. علاوه براین، این محیطها معمولا دارای امکانات اشکالزدایی برنامه (Debug) نیز می باشند که شامل مواردی همچون اجرای خط به خط برنامه و یا دیدن محتویات متغیرها در زمان اجرا است. چند محیط معروف برنامه نویسی عبارتند از :
Borland C++ 3.1 برای محیط DOS
Borland C++ از نسخه ۴ به بالا برای Windows
Microsoft Visual C++ برای محیط Windows
Borland C++ Builder برای محیط Windows
برای شروع ما از محیط Borland C++ 3.1 تحت Dos که نحوه کار ساده تری نسبت به سایرین دارد استفاده می کنیم.
پس از نصب این نرم افزار، برنامه BC.exe را اجرا کنید تا وارد محیط borland c شوید

 

همانطور که می بینید، این محیط از ۳ قسمت اصلی تشکیل شده است :

- بخش ویرایش برنامه :
بخش آبی رنگ وسط می باشد که در حقیقت یک ویرایشگر است که برنامه در آن تایپ می شود. همانطور که می بینید در این ویرایشگر از رنگهای مختلف برای نشان دادن قسمتهای مختلف برنامه استفاده می شود. مثلا برای کلمات کلیدی از رنگ سفید استفاده شده است.
- بخش منوهای کاری :
این بخش که در قسمت بالا واقع شده است،- حاوی تعدادی منو (گزینه) برای انجام وظایف مختلف است. خلاصه این عملیات عبارتند از :
o منوی File : عملیاتی مانند باز کردن و یا ذخیره یک برنامه
o منوی Edit : عملیات ویرایش مانند حذف،o کپی و یا چسباندن یک قسمت از برنامه
o منوی Search : جستجوی و یا تعویض یک متن در برنامه
o منوی Run : اجرای برنامه بصورت کامل یا دستور به دستور
o منوی Compile : عملیات مربوط به کامپایل و پیوند برنامه
o منوی Debug : عملیات مربوط به اشکالزدایی مانند دیدن مقادیر متغیرها در زمان اجرا
o منوی Project : عملیات مربوط به مدیریت برنامه هایی که شامل چندین فایل مستقل هستند (پروژه)
o منوی Options : عملیات مربوط به تنظیمات سیستم مانند نحوه کامپایل و یا رنگ پیش فرض محیط
o منوی Windows : عملیات مربوط به پنجره های باز فعلی (مربوط به چندین برنامه یا نمایش متغیرها و … )
خطاهای برنامه نویسی
بنظر می رسد خطاها جزء جداناپذیر برنامه ها هستند. بندرت می توان برنامه ای نوشت که در همان بار اول بدرستی و بدون هیچگونه خطایی اجرا شود. اما خطاها از لحاظ تاثیری که بر اجرای برنامه ها می گذارند، متفاوتند. گروهی ممکن است باعث شوند که از همان ابتدا برنامه اصلا کامپایل نشود و گروه دیگر ممکن است پس از گذشت مدتها و در اثر دادن یک ورودی خاص به برنامه، باعث یک خروجی نامناسب و یا یک رفتار دور از انتظار (مانند قفل شدن برنامه) شوند. بطور کلی خطاها به دو دسته تقسیم می شوند:
خطاهای نحوی (خطاهای زمان کامپایل): این خطاها در اثر رعایت نکردن قواعد دستورات زبان C و یا تایپ اشتباه یک دستور بوجود می آیند و در همان ابتدا توسط کامپایلر به برنامه نویس اعلام می گردد. برنامه نویس باید این خطا را رفع کرده و سپس برنامه را مجددا کامپایل نماید. لذا معمولا این قبیل خطاها خطر کمتری را در بردارند.
خطاهای منطقی (خطاهای زمان اجرا): این دسته خطاها در اثر اشتباه برنامه نویس در طراحی الگوریتم درست برای برنامه و یا گاهی در اثر درنظر نگرفتن بعضی شرایط خاص در برنامه ایجاد می شوند. متاسفانه این دسته خطاها در زمان کامپایل اعلام نمی شوند و در زمان اجرای برنامه خود را نشان می دهند. بنابراین، این خود برنامه نویس است که پس از نوشتن برنامه باید آن را تست کرده و خطاهای منطقی آن را پیدا کرده و رفع نماید. متاسفانه ممکن است یک برنامه نویس خطای منطقی برنامه خود را تشخیص ندهد و این خطا پس از مدتها و تحت یک شرایط خاص توسط کاربر برنامه کشف شود. بهمین دلیل این دسته از خطاها خطرناکتر هستند. خود این خطاها به دو دسته تقسیم می گردند:
a. خطاهای مهلک:
در این دسته خطاها کامپیوتر بلافاصله اجرای برنامه را متوقف کرده و خطا را به کاربر گزارش می کند. مثال معروف این خطاها،b. خطای تقسیم بر صفر می باشد.
b. خطاهای غیرمهلک:
در این دسته خطا،d. اجرای برنامه ادامه می یابد ولی برنامه نتایج اشتباه تولید می نماید. بعنوان مثال ممکن است دراثر وجود یک خطای منطقی در یک برنامه حقوق و دستمزد،e. حقوق کارمندان اشتباه محاسبه شود و تا مدتها نیز کسی متوجه این خطا نشود!
با توجه به آنچه گفته شد، در می یابیم که رفع اشکال برنامه ها بخصوص خطاهای منطقی از مهمترین و مشکلترین وظایف یک برنامه نویس بوده و گاهی حتی سخت تر از خود برنامه نویسی است! بهمین دلیل است که بسیاری از شرکتها(همانند مایکروسافت) ابتدا نسخه اولیه نرم افزار خود را در اختیار کاربران قرار می دهند تا اشکالات آن گزارش شده و رفع گردد. بسیار مهم است که در ابتدا سعی کنید برنامه ای بنویسید که حداقل خطاها را داشته باشد، در گام دوم با آزمایش دقیق برنامه خود هرگونه خطای احتمالی را پیدا کنید و در گام سوم بتوانید دلیل بروز خطا را پیدا کرده و آنرا رفع نمایید. هر سه عمل فوق کار سختی بوده و نیاز به تجربه و مهارت دارد.
آخرین نکته اینکه در اصطلاح برنامه نویسی به هر گونه خطا، bug و به رفع خطا debug گفته می شود.

|
امتیاز مطلب : 7
|
تعداد امتیازدهندگان : 2
|
مجموع امتیاز : 2
موضوعات مرتبط: مقالات C++ / C , ,
تاریخ : چهار شنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

اکشن اسکریپت - Fscommand

چگونه در فلش فایل exe بسازیم ؟
همانطور که اکثرا میدانید برای ساخت فایل های اجرایی با فلش بعد از ساخت فایل swf به منوی فایل رفته و سپس روی گزینه publish setting کلیک میکنیم . در پنجره ای که باز میشود گزینه windows projector  را تیک میزنیم . حالا برای ساخت فایل exe دکمه publish را میزنیم . فایل exe ما آماده است . اما این فایل یک فیلم فلش است که همیشه در پنجره flash player اجرا میشود . با این فرق که اجراگر فلش همراه فایل ، ضمیمه شده است و در دستگاه هایی که این player را ندارند اجرا میشود . در ضمن برای اینکه کاربر فلش شما را ببندد باید flash player آن را ببندد . حال برای اینکه یک دکمه خروج در برنامه بگذاریم  چه میکنیم ؟

اکشن اسکریپت fscommand
یک دکمه روی فیلم خود بگذارید . حال آنرا انتخاب کنید و  با زدن دکمه F9 پنجره Actions را باز کنید . کتاب Actions و سپس کتاب Browser/network را باز کنید و روی fscommand را دوبل کلیک کنید . حالا از منوی بازشوی سمت راست ، گزینهquit  را انتخاب کنید . حال زدن این دکمه توسط کاربر در برنامه باعث بسته شدن فیلم فلش میشود ! .

اکشن اسکریپت برای full screen شدن
یک دکمه روی فیلم خود بگذارید . باز هم fscommand را دوبل کلیک کنید و اینبار از منوی سمت راست آن fullscreen را برگزینید. میبینید که در جعبه متنی بالای آن نام fullscreen و در قسمت پارامتر  true  نوشته شده است .این هم کد کامل آن که فلش برای شما ساخته است .

on (release) {
            fscommand("fullscreen", "true");
}

اگر خواستید فیلم با زدن دکمه از حالت فوق خارج شود خودتان پارامتر true را به false تغییر دهید .

تغییر سایز فلش با سایز صفحه شما
اگر بخواهید فیلم فلش شما هنگامی که کاربر سایز FLASH PLAYER  را عوض میکند ثابت بماند باید در منوی بازشوی fscommand گزینه allowscale را مساوی false قرار دهید . این هم کد کامل آن :

on (release) {
            fscommand("allowscale", "false");
}


|
امتیاز مطلب : 36
|
تعداد امتیازدهندگان : 8
|
مجموع امتیاز : 8
موضوعات مرتبط: ▼ برنامه نویسی , ,
تاریخ : چهار شنبه 25 مرداد 1391
نویسنده : hamidrezakhouri

قالب دستوری اكشن اسكریپت

 

در اكشن اسكریپت نقطه برای نشان دادن خواص یا متدهای وابسته به یك شیی یا سمبل مووی كلیپ استفاده میشود . همچنین برای تعیین target path  در یك مووی كلیپ یا متغیر ، فانكشن یا آبجكت ها استفاده میشود . عبارت نقطه دار با نام شیئ یا كلیپ موردنظر آغاز شده ، نقطه میگذاریم و در آخر با  یك المان كه توسط شما تعیین میشود پایان می یابد .

بطور مثال خاصیت

x

 

 

كه برای مووی ها میباشد مكان افقی مووی را روی صحنه مشخص میكند . مثلا عبارت

ball.x

نشان دهنده مشخصه

x

از كلیپ

ball

میباشد .


مثال دیگر :

submit

یك متغیر در كلیپ

Form

است كه در كلیپ

shop

قرار دارد . عبارت

shop.form.submit=True

 مقدار متغیر

submit

  از

form

را

True

میكند .


مثال دیگر : عبارت

ball.play();

را داریم .

play

یك متد از كلیپ

ball

است كه باعت اجرای این كلیپ میشود .


نقطه همچنین با شیی مجازی _root  و _parent كار میكند . شیی مستعار _root  به Timeline اصلی بر میگردد. شما از این شیی میتوانید برای خلق Target path های مطلق استفاده كنید . بطور مثال عبارت زیر باعث فراخوانی فانكشن Buildgameboard  در مووی كلیپ functions در Timeline اصلی میشود .
_root.functions.buildgameboard();
از شیی مجازی _parent برای مراجعه یه یك كلیپ كه كلیپ كنونی در آن قرار دارد استفاده میشود . همچنین میتوانید برای ساخت target path وابسته استفاده اش كنید .

آكولاد:
عبارات اكشن اسكریپت توسط آكولاد ها گروه میشوند .به مثال زیر توجه كنید .

on(release) {
            myDate = new Date();
            currentMonth = myDate.getMonth();
{

سمی كالن :
عبارات زبان اكشن اسكریپت با سمی كالن پایان میابد . مثال:

column = passedDate.getDay();
row    = 0;

اگر شما سمی كالن پایانی را فراموش كنید هیچ مشكلی برای اسكریپت شمل پیش نمی آید اما بهتر است برای شیوایی اسكریپت خود آنرا همیشه بگذارید .

پرانتز ها :
وقتی شما یك فانكشن تعریف میكنید ، باید پارامتر های فرستاده شده در فانكشن را در پرانتز قرار دهید . مثال :

function myFunction (name, age, reader){
            ...
}

همچنین برای آسانتر شدن عبارات ریاضی در اسكریپت نیز از پرانتز ها بصورت ذیل استفاده میشود .
(در زبان های برنامه نویسی اعمال ریاضی بترتیب خاصی در پراسیجر تفسیر میشوند . وقتی یك عبارت ریاضی داخل پرانتز باشد محاسبه آن قبل از بقیه عبارت صورت میگیرد . به مثال زیر دقت كنید :

Total =2+3*5 ;
Total =(2+3)*5 ;

در عبارت اولی ابتدا عمل ضرب و سپس جمع صورت میگیرد و پاسخ عدد 17 است
در عبارت دوم بعلت وجود پرانتز ابتدا پرانتز محاسه و سپس ضرب صورت میگیرد و جواب 25 است .

از پرانتز همچنین برای مقدار دهی عبارات استفاده میشود . قالب كلی آن مانند مثال زیر است :

(new Color(this)).setRGB(0xffffff);

اگر بخواهید از پرانتز استفاده نكنید باید از 2 عبارت استفاده كنید :

myColor = new Color(this);
               myColor.setRGB(0xffffff);

حساسیت به حروف كوچك و بزرگ :
فقط كلمات كلیدی اكشن اسكریپت به حروف حساسند و در بقیه موارد میتوانید از هر دو حالت استفاده كنید .
شما نمیتوانید از اسم های رزرو شده اكشن اسكریپت بجای نام اشیای خود استفاده كنید .
اگر كلمات كلیدی اسكریپت را از لحاظ كوچكی و بزرگی اشتباه بنویسید اسكریپت حاصل دچار مشكل خواهد شد . keyword ها در حالت پیش فرض در پنجره اكشن به رنگ آبی هستند

كامنت نویسی :
كامنت ها كد نیستند بلكه جملاتی اند كه طراح در میان كد ها برای توضیح درباره كد مینویسد تا در رجوع بعدی خود كاری كه انجام داده را بیاد آورد . در اكشن اسكریپت از دو بك اسلش پشت سر هم ، برای نوشتن كامنت استفاده میشود . خطی كه با //  شروع شود جزو كد ها به حساب نمی آید و در كامپایل فایل فلش نادیده گرفته میشود . در نوشتن كامنت محدودیت لغتی وجود ندارد .

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

break else instanceof typeof
case for new var
continue function return void
default if switch while
delete in this with

 

ثابت ها :
ثابت ها چیز هایی مانند متغیر ها هستند با این تفاوت كه مقدارشان هرگز تغییر نمیكند . بطور مثال ثابت های BACKSPACE, ENTER, QUOTE, RETURN از ثابت های شیی key هستند كه به كلید های كیبورد مربوطند . مثلا برای اینكه بفهمید كاربر كدام كلید را فشار داده از كد زیر استفاده میكنیم .

if(Key.getCode() == Key.ENTER) {
            alert = "Are you ready to play?";
            controlMC.gotoAndStop(5);
}


|
امتیاز مطلب : 19
|
تعداد امتیازدهندگان : 6
|
مجموع امتیاز : 6
موضوعات مرتبط: ▼ برنامه نویسی , ,
تاریخ : چهار شنبه 25 مرداد 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 انجام می داد. برای هر چیز بزرگتر یا پیچیده تر، من عادت کرده ام که ارزشهای لطیف پیتون را ترجیح بدهم و فکر کنم شما نیز همین کار را انجام بدهید.


|
امتیاز مطلب : 17
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: ▼ برنامه نویسی , ,
تاریخ : چهار شنبه 25 مرداد 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 می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین های نوعی استفاده می شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.


|
امتیاز مطلب : 16
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
موضوعات مرتبط: ▼ برنامه نویسی , ,
تاریخ : چهار شنبه 25 مرداد 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 ;

همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید


|
امتیاز مطلب : 18
|
تعداد امتیازدهندگان : 5
|
مجموع امتیاز : 5
موضوعات مرتبط: ▼ برنامه نویسی , ,

آخرین مطالب

/
از این که به وبلاگ من سر زدید خیلی خیلی ممنونم باتشکر حمیدرضاخوری