<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iran Developers Network &#187; دلفی و پاسکال</title>
	<atom:link href="http://www.irandevelopers.com/category/programming/delphi-pascal/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.irandevelopers.com</link>
	<description>IDN بزرگترین مرجع توسعه دهندگان ایران - آموزش زبانهای برنامه نويسی</description>
	<lastBuildDate>Mon, 23 Aug 2010 08:51:43 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>زبان برنامه نویسی Delphi</title>
		<link>http://www.irandevelopers.com/programming/delphiprogramming88062-1937/</link>
		<comments>http://www.irandevelopers.com/programming/delphiprogramming88062-1937/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 12:23:05 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>
		<category><![CDATA[عمومی]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[کلیات دلفی < مقاله دلفی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1937</guid>
		<description><![CDATA[یک محیط نرم افزاری توسعه یافته برای برنامه‌های مخصوص پنجره‌های مایکروسافت است. این محیط همیشه پشتیبانی شده است برای توسعهٔ برنامه‌های کاربردی پنجره‌ای محلی توسط زبان برنامه نویسی Delphi، به علاوه توسعهٔ Opject Pascal. دلفی ۲۰۰۷، نسخه۱۱، همچنین توسعهٔ در C++ برای پایگاه‌های پنجره‌ای مایکروسات ۳۲بیتی، و در دلفی و C# برای پایگاه‌های Microsoft.NET را [...]]]></description>
			<content:encoded><![CDATA[<p>یک محیط نرم افزاری توسعه یافته برای برنامه‌های مخصوص پنجره‌های مایکروسافت است. این محیط همیشه پشتیبانی شده است برای توسعهٔ برنامه‌های کاربردی پنجره‌ای محلی توسط زبان برنامه نویسی Delphi، به علاوه توسعهٔ Opject Pascal. دلفی ۲۰۰۷، نسخه۱۱، همچنین توسعهٔ در C++ برای پایگاه‌های پنجره‌ای مایکروسات ۳۲بیتی، و در دلفی و C# برای پایگاه‌های Microsoft.NET را پشتیبانی می‌کند. دلفی ۲۰۰۹، نسخهٔ ۱۲ ، یعنی آخرین نسخهٔ آن که در آگوست سال ۲۰۰۸ منتشر شد، حمایت از Unicode برای VCL و IDE را به خوبی ویژگی های کامپایلر جدید (روش های عمومی و تخلصی) به برنامه اضافه کرد و IDE همراه اولین نسخه از مدیریت منابع و مدیریت بازرسی و نگهداری پروژه به خوبی پیکر بندی های ساخت تعریف شدهٔ کاربر آسان کرد. دلفی در اصل برای توسعهٔ برنامه‌های روی میزی و پایگاه‌های داده‌ای سازمانی استفاده می‌شود، اما ابزار توسعهٔ نرم افزاری با هدف کلی تری که مناسب با اکثر پروژه‌های نرم افزاری است ، می‌باشد. به همراه کتابخانه‌های ضمیمه شدهٔ بیشتر، امکان بهتری برای پروژه‌های تحت شبکه فراهم شده است. دلفی در نسخه‌های مختلف با ویژگی های متفاوتی گسترش یافته است: شخصی( فعلاً در دسترس نیست)، حرفه ای، سازمانی(قبلاً کارگزار و کاربری) و معماری.</p>
<p>[ویرایش]<br />
ویژگی های اختصاصی</p>
<p>دلفی و Kylix از زبان برنامه نویسی دلفی مبتنی بر پاسکال استفاده می‌کنند، و کد منبع دلفی را به کد محلی x86 یا کد مدیریت شدهٔ .NET کامپایل می‌کند. آن ها شامل VCL/CLX (کتابخانهٔ مؤلفه دیداری) هستند، که رابط های مستقل COM(ریزفیلم های خروجی کامپیوتر) همراه اجرای کلاس های فرض شده با مرجع ، و تعداد زیادی از اجزاء بیگانه را حمایت می‌کنند. پیاده سازی های رابط به قسمت هایی از قابلیت های کلاس ها واگذار می‌شود. گردانندهای پیام بوسیلهٔ علامت زدن شیوه‌ای از کلاس با عدد ثابت پیام برای اجرا پیاده سازی می‌شوند. تأکید مهم بر روی اتصال پایگاه داده قرار دارد، و این موجب شده دلفی در مورد پایگاه داده دچار اشتباه شود، (فقط) نرم افزار نهایی طراحی کننده، مجموعۀ پایگاه داده‌ای غنی خود را عرضه کرده است.</p>
<p>[ویرایش]<br />
مزیت ها</p>
<p>دلفی یک زبان برنامه نویسی قوی سطح بالا است. در اصل بر مبنای زبان برنامه نویسی خوب طراحی شدۀ پاسکال ایجاد شده است. دلفی بر خلاف پاسکال مقدمتاً برای اهداف تحصیلی طراحی نشد. اضافه بر ویژگی های زبان های سطح بالا ، برنامه نویسی سطح پایین نیز با فعال شدن اسمبلر و بوسیلۀ کدهای دستورالعمل پردازنده نیز ممکن است. ویژگی های شیئ گرایی زبان فقط چند ریختی بر مبنای کلاس- و رابط – که باعث می‌شود برنامه با وضوح بیشتری درظاهر یک برنامه نوشته شده به چند زبان نوشته شود، اجازه و استفاده چند ارثی داده شده. کلاس های خودی، اولین اشیاء کلاس هستند. اشیاء در حقیقت به اشیاء رجوع می‌کنند(شبیه جاوا) که دلفی به طور ضمنی ارجاع می‌دهد، بنابراین به اختصاص دادن حافظه برای اشاره گرها به اشیاء توسط خودمان یا تکنیک های مشابه آن در زبان های دیگر نیازی نیست. در آنجا مراجع اختصاصی که نوع رشته دارند وجود دارد.(به خوبی رشته‌های نا متناهی) ترجیحاً نسبت به توابع، رشته‌ها بوسیله علامت + می‌توانند ملحق شوند. برای آن دسته از انواع رشته‌ای اختصاص داده شده، مدیریت حافظه توسط خودمان لازم نیست، بلکه مدیر حافظه این را مدیریت می‌کند. مدیر حافظۀ پیشرفته که توسط Borland Developer Studio 2006 معرفی شده است، توابعی را برای اختصاص دادن حافظه فراهم می‌کنند. زبان برای پیشرفته سازی های بعدی مناسب است و از IDE جامع آمده است. دلفی با یک رابط گرافیکی بزرگ به اسم VCL ارتباط خوبی دارد، که شامل خیلی از کدهای منبع آن است. سوم-اجزا حزب (معمولا با منبع کامل قانون) موجود در بازار هم به منزله تقویت ide یا برای سایر کارهای دلفی مربوط به توسعه است. IDE شامل واسط گرافیکی برای محلی سازی و ترجمۀ برنامه‌های ایجادشده که می‌تواند به یک مترجم گسترش داده شود ، بدون هزینۀ اضافی.( برخی از گسترش دهنده‌ها دستۀ سوم محصولات را به خاطر عاملیتی که دارند ترجح می‌دهند.) رابط گرافیکی حالتی را پیش می‌آورد که نسخه‌های قدیمی به نسخه‌های جدید دلفی، تبدیل شوند. کتابخان های دسته سوم می‌توانند از طریق فروشنده یا قابلیت های کامپایل دوباره برنامه را ارتقا داده شوند. VCL سازگار کنندۀ قدیمی ای بود از تزریق وابستگی یا کنترل معکوس. VCL یک مدل با قابلیت استفاده دوباره ، خبره و توسعه پذیر با ارتقا دهنده هاست. با کمک کنندۀ کلاس ، می‌توان عملکرد هستۀ RTL و کلاس های VCL را بدون تغییر دادن منبع اصلی کد تغییر داد. بهینه سازی سریع وسادۀ انتقال کامپایلری می‌تواند به برنامۀ اجرایی تبدیل کند.CLX بیشتر پشتیبانی نشد چون Kylix از رده خارج شد.</p>
<p>[ویرایش]<br />
عیب ها</p>
<p>دلفی درون خود، یک ابزار گذر از پایگاه نیست. اما Delphi.NET برای چارچوب های گرافیکی .NET کامپایل می‌کند، که برای پایگاه‌های گذار با چند تنظیم کد منبع pre.NET اصل طراحی شده است. محصول Kylix، که انتقال برنامه‌ها را به لینوکس امکان می بخشد، خیلی به فروش نرفت. هر نسخه جدید دلفی سعی در سازگاری با نسخ قبلی دارد. این به کاربران امکان می‌دهد تا کدهای ارث برده شده بسازند بدون اینکه در توابع و رابط ها مشکلی پیش بیاید. اما بعضی از ارتقا دهندگان احساس می‌کنند ای توجه به سازگاری با قبل از تحول در دلفی جلو گیری کند، و باعث کهنگی و از رده خارج شدن تصمیمات طراحی در کتابخانه‌های استاندارد کلاس(VCL/RTL) شود. در حال حاضر توسعه‌های ۶۴ بیتی در دلفی موجود نیست، اما نسخه‌ای با نام Commodore که در اواسط ۲۰۰۹ به بازار خواهد آمد در حال برنامه ریزی است.</p>
<p>[ویرایش]<br />
تاریخچه</p>
<p>Turbo Pascal و Borland Pascal کامپایلرهای ۱۶بیت با کد محلی ارزان قیمتی بودند. آنها در طی سال ها تجدید چاپ شدند، و در اصل برای تولید برنامه‌های نمایش متن استفاده می‌شدند. وقتی استفاده از رابط های گرافیکی کاربر توسط ۳٫۱Microsoft Windows حمایت شد، استفاده از Borland Pascal تکمیل شده به عنوان زبان زیر مجموعه معرفی شد. دلفی یکی از اولی ابزارچیزی که آمد بود که به عنوان Rapid Application Development(RAD) شناخته می‌شد وقتی که در سال ۱۹۹۵ برای Windows 3.1 16 بیتی آمد. دلفی۲ ، یک سال بعد منتشر شد، که از طرف محیط Windows 32 بیتی حمایت می‌شد و استفاده‌های مختلفی از C++ به عنوان یک زبان زیرمجموعه می نمود. و C++ Builder چند سال بعد دنبال شد.</p>
<p>رئیس طراحی دلفی آندرس هجلسبرگ بود، کسیکه Turbo Pascal را توسعه داد. او در سال ۱۹۹۶ به Mhcrosoft رفت تا روی C# کار کند. در سال ۲۰۰۱ لینوکس Kylix منتشر شد. این نسخه نقد شده و با کیفیت پایین ارزیابی شد و به خوبی فروش نرفت و بعد از نسخهٔ سوم از رده خارج شد. برای حمایت از Windows و Linux طوئمان به منظور ارتقای پایگاه‌های گذار تلاش شد ، و نسخهٔ پایگاه گذاری از VCL که به عنوان CLX شناخته می‌شد در ۲۰۰۲ به همراه دلفی۶ منتشر شد. این تلاش ها برای تکنولوزی CLX بیهوده شد و به همراه متروک شدن Kylix ، CLX هم از میان رفت. از آنجایی که نسخه ۱٫۰ ارتقای پایگاه داده باقی ماندهٔ یکی از قوی ترین نقاط دلفی است. کتابخانه مؤلفهٔ دیداری (VCL) شامل کتابخانهٔ بزرگی از پایگاه داده کنترل های آگاه است، و پایگاه داده به مؤلفه‌ها دسترسی دارد. موتور پایگاه داده Borland پایگاه دادهٔ اصلی لایهٔ اتصال بود، و تنها انتخاب در نسخه‌های اولیهٔ دلفی بود، اگرجه الآن به ندرت استفاده می‌شود، اما آخرین نسخه به عنوان یکی از اختیارات قابل نصب در BDE وجود دارد. دلفی۷ که در آگوست ۲۰۰۲ منتشر شد، تبدیل به نسخهٔ استانداردی شد که بیشتر از دیگر نسخ ساده توسط توسعه دهندگان استفاده شد، و تا این تاریخ نیز استفادهٔ مؤثری از آن می‌شود. این نسخه قابلیت حمایت از قالب های Windows XP، و حمایت های بیشتری را نیز برای ساختن برنامه‌های تحت web اضافه کرده است. همچنین آخرین نسخهٔ دلفی بود که بدون فعال سازی قابل استفاده بود. این خصوصیت ثبت اختیاری دارد که می‌توان از آن صرف نظر نمود. دلفی۷ یکی از پر طرفدارترین IDEها است که توسط Borland تولید شده است، که به خاطر پایداری ، سرعت و نیاز کم به سخت افزار است. به هر حال، در تمام نسخه‌های دلفی مقدار زیادی از خطاهای شناخته شده وجود دارد که Borland آنها را برطرف نکرده است. وظیفهٔ برطرف کردن این خطاها در انجمن دلفی باقی ماند. دلفی۸ در دسامبر ۲۰۰۳ منتشر شد، که تنها .NET منتشر شده بود و به کاربران اجازه می‌داد اشیاء دلفی با کد پاسکال را به .NET CIL کامپایل کنند. این همچنان مهم بود که IDE های خود را برای اولین بار تغییر دهد، از نوع IDE پنجرهٔ چندگانه متغیر در روی میز کار(desktop) به نوع دیدن و احساس کردن شبیه Microsoft&#8217;s Visual Studio.NET . HDE های جدید هنوز لایهٔ پنجره‌های &#8220;Classic Undocked&#8221; را به عنوان Option در دسترس دارند. نسخهٔ بعدی، دلفی۲۰۰۵ (دلفی۹)، شامل ارتقای Win32 و .NET در یک IDE ساده ، که تعهدات Borland را برای کاربران Win32 تکرار کرد. دلفی ۲۰۰۵ شامل فرصت انجام طراحی بوسیله ترک داده در پایگاه داده است. همچنین شامل ID پیشرفته است و در متن برنامه for را نیز اضافه کرده است (شبیه foreach برای C#). به هر حال، به خاطر بعضی از خطا ها مورد انتقاد قرار گرفت. هردوی دلفی۸ و دلفی۲۰۰۵ مشکلات پایداری را در هنگام اجرا شدن دارند، که فقط تا اندکی در service packها بر طرف شده اند. بعدها در سال ۲۰۰۵ دلفی ۲۰۰۶ منتشر شد و مدل ارتقا یافته‌ای از C# و Delphi.NET ،DelphiWin32 و C++ را در IDE ساده‌ای ترکیب کرد. از دلفی ۸ یا دلفی ۲۰۰۵ وقتی که اجرا می‌شد پایدارتر بود، و حتی توسط انتشار بسته‌های خدماتی و برطرف سازی اساسی مشکلات پیشرفته تر شد. در ۸ فوریه سال۲۰۰۶ Borland اعلام کرد که به دنبال خریداری برای IDE هایش و خط پایگاه داده‌ای محصولاتش است، که شامل دلفی برای تأکید بر خط ALM است. اخبار دلگرم کننده‌ای برای کاربران باقیمانده آمد. در ۶ سپتامبر سال ۲۰۰۶ ابزار ارتقا دهندهٔ گروهی(اسم شرکتی که هنوز از بین نرفته) شرکت نرم افزاری Borland نسخه‌های تک زبانه از Borland developer studio را منتشر کرد، که به نام مشهور Turbo بازگشت.محصول مجموعهٔ Turbo شامل Turbo Delphi برای Win32 ،Turbo Delphi برای .NET، Turbo C++، و Turbo C# است. هر نسخه در دو ویرایش در دسترس است: Explorer(نسخه‌ای که Download آن رایگان است) و Professional( با قیمت ارزانتر US$899 برای کاربران جدید؛US$399 برای نو سازی) نسخه‌ای که دسترسی به هزاران مؤلفهٔ شخص ثالث را امکان پذیر می‌کند. بر خلاف نسخه‌های شخصی قبلی دلفی، ویرایش های جدید Explorer می‌توانند برای گسترش های تجاری قابل استفاده باشند. در ۱۴ نوامبر سال ۲۰۰۶ Borland اعلام کرد که ترجیح می‌دهد که فروش ابزار توسعهٔ گروهی متوقف و به به شرکت فرعی مستقلی با نام CodeGear تبدیل شود.</p>
<p>دلفی ۲۰۰۷، اولین نسخهٔ CodeGear، در ۱۶ مارس ۲۰۰۷ منتشر شد. در ابتدا ماهیت Win32 منتشر شد، قبل از اینکه ماهیت.NET از دلفی۲۰۰۷ منتشر شود، به عنوان بخشی از محصول CodeGear RAD Studio 2007 . ویژگی های جدید شامل حمایت از ساخت MS و ارتقای کتابخانه مؤلفه دیداری برای Windows vista است. CodeGear هم چنین DBX4 را به عنوان نسخهٔ بعدی dbExpress معرفی کرد. برای اولین بار دلفی می‌توانست از اینترنت Download و با اجازه نامه فعال سازی شود. نسخه‌های بین المللی از دلفی ۲۰۰۷ همزمان به انگلیسی ، فرانسوی، آلمانی و ژاپنی پیاده سازی می‌شد. RAD Studio 2007 که شامل .NET وC++Builder development می‌شود، در ۵ سپتامبر ۲۰۰۷ منتشر شد. آخرین نسخه ، دلفی ۲۰۰۹( با نام کد شدهٔ Tiburón)، خیلی از ویژگی های جدید مثل کار دوبارهٔ به صورت کامل روی VCL و RTL برای حمایت کامل از Unicode ، و روش های کلی با نام مستعار(برای هردویWin32 native و .Net development) را اضافه کرد. Borland ، CodeGear را به Embarcadero Technologies در سال ۲۰۰۸ فروخت. Embarcadero امتیاز CodeGear را که توسط Borland تولید شده بود ، برای شناسایی ابزار و راهنمایی های پایگاه داده‌ای آن، نگهداری می‌کند. و Embarcadero تصمیم گرفته است ابزار پایگاه دادهٔ آن را تحت DatabaseGear moniker شناسایی کند.</p>
<p>[ویرایش]<br />
نام</p>
<p>دلفی در اصل پروژهٔ تحقیقاتی محرمانه‌ای بود در Borland که منجر به محصولی شد که AppBuilder نامیده می‌شد. کمی قبل از اولین انتشار AppBuilder از طرف Borland ، Novell AppBuilder منتشر شد، که Borland را در نیاز اسمی جدید رها کرد. بعد از تلاش زیادی، نام دلفی غلبه کرد. توسعه دهنده Danny Thorpe کدنام دلفی را با مرجع Oracle at Delphi انتخاب کرد. یکی از اهداف اصلی دلفی تأمین اتصال پایگاه داده با برنامه نویس به عنوان یک ویژگی کلیدی بود و بستهٔ پایگاه داده‌ای رایج در آن زمان Oracle database بود. بنابراین&#8221; اگر می خواهید با Oracle صحبت کنید، به دلفی بروید.&#8221; همینطور که توسعه ادامه یافت ، نام بر آنها رشد کرد و حمایت Borland نیزاز نام دلفی بیشتر شد. دورهٔ بعدی تولید کنندگان Anders Hejlsberg، معمار اصلی دلفی و Turbo pascal ، در سال ۱۹۹۶ تحت استخدام Microsoft در آمد، جایی که او یک مهرهٔ کلیدی بود در تولید قالب های گرافیکی Microsoft.NET و منجر به طراحی هر دوی Java با گرایش J++ و C# شد. Chuck Jazdzewski، کسیکه دانشمند رئیس و معمار در تکنولوژی دلفی Borland بود،در سال ۲۰۰۴ Borland را ترک کرد و به Microsoft پیوست. Danny Thorpe ، دانشمند رئیس در آن موقع در ۲۰۰۵ به Google پیوست و در ۲۰۰۶ به Microsoft پیوست. نرم افزار مربوط</p>
<p>[ویرایش]<br />
دلفی برای PHP</p>
<p>دلفی بزای PHP یکIDE برای PHP است. این عملکرد صحیح RAD را فراهم می‌کند. این ویژگی های دلفی یا Visual basic از طرف طراح، اصلاح کنندهٔ خطا(بنا شده بر خدمات دهندهٔ شبکه)، شبیه هستند. این همچنین شامل کتابخانه VCL که به PHP منتقل شده است می‌باشد. برای حمایت از ویژگی های Web2 شبیه AJAX، آن را به یک IDE منحصر به فرد تبدیل کرده است. این محصول در ۲۰ مارس ۲۰۰۷ معرفی شد و برQadram Qstudio بنا شده است، که CodGear الآن کاملاً و انحصاراً مالک آن است.</p>
<p>[ویرایش]<br />
محصولاتی که توسط دلفی تولید شده است</p>
<p>در میان خیلی از محصولاتی که توسط دلفی تولید شده است داریم: • محاسباتی: Intuit Lacerte • محصولات CodeGear : CodeGear Delphi, CodeGear C++ Builder, Borland JBuilder versions 1 and 2 • گسترش ومدیریت پایگاه داده: MySQL Tools (Administrator, Query Browser), TOAD • نرم افزارهای مهندسی: Altium Designer/Protel (electronics design) • نمایش دهنده عکس: FastStone Image Viewer, FuturixImager, Photofiltre • پیام دهندهٔ اینترنت: Skype (VoIP and IM), QIP (IM), The Bat! (e-mail کاربر), PopTray (e-mail چک کننده), FeedDemon (feed viewer), XanaNews, Xnews (خوانندهٔ اخبار گروهی) • تولید Music : FL Studio • توسعهٔ نرم افزار: Dev-C++ (IDE), DUnit (unit testing), Help &amp; Manual (help system authoring), Inno Setup (installer engine) • نویسندگی شبکه: Macromedia HomeSite (HTML ویرایش گر), TopStyle Pro (CSS ویرایش گر), Macromedia Captivate (screencast) • جستجوگر شبکه (پوشش MSIE): Avant Browser, Netcaptor • تسهیلات: Spybot &#8211; Search &amp; Destroy, Ad-Aware (anti-spyware), jv16 PowerTools, Total Commander (file manager), Copernic Desktop Search, PowerArchiver, Beyond Compare(file comparison)], WordWeb (dictionary/thesaurus(</p>
<p>[ویرایش]<br />
همزادها و جایگزین ها</p>
<p>خیلی از کامپایلر های Pascalشئ گرا وجود دارند که در اصل بوسیلهٔ Borland توسعه یافته اند، و همچنین محصولاتی که قالب های گرافیکی را مثل دلفی کاملاً فراهم کردند. بعضی از آنها کارهایی را انجام می‌دهند که دلفی نمی‌تواند، مثل حمایت از سیستم عامل های مختلف، و اجازه برای امتحان کد منبع کامپایلر. آنها بعضی مواقع عادت دارند بخش های server از برنامه‌های دلفی را در سیستم عامل هایی به غیر سیستم عامل های Microsoft اجرا کنند. اکثراً حمایت Linux را در سال های قبل از Kylix داشتند. • Bloodshed Dev-Pascal: ویرایش گر Windows 32 بیتی خیلی از لحاظ گرافیکی آراسته شده(هر چند غیر RAD) به عنوان تنظیم کنندهٔ GNU Pascal و Free Pascal • Lazarus: IDE RAD که از کامپایلر رایگان Pascal استفاده می‌کند.</p>
<p>[ویرایش]<br />
تبصره</p>
<p>۱٫ ^ &#8220;A First Look at (Borland Developer Studio) Delphi 2006 &#8211; Refactoring in Delphi 2006&#8243;. About.com. Retrieved on 2007-12-19. 2. ^ &#8220;Delphi and C++Builder Roadmap&#8221;. CodeGear.com. Retrieved on 2008-09-29. 3. ^ David Intersimone. &#8220;Press Release: Borland forming CodeGear to focus exclusively on developer productivity&#8221;. Retrieved on 2006-11-28. 4. ^ David Intersimone. &#8220;Borland History: Why the name &#8220;Delphi?&#8221;". Retrieved on 2006-11-28. 5. ^ &#8220;Borland Brain Drain Continues&#8221;. eWeek (2004-02-02). Retrieved on 2007-12-19. 6. ^ &#8220;Into the Maelstrom&#8221; (2006-04-14). Retrieved on 2007-12-19</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/delphiprogramming88062-1937/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>آرایه ها در برنامه نویسی دلفی</title>
		<link>http://www.irandevelopers.com/programming/arrayindelphi880528-1886/</link>
		<comments>http://www.irandevelopers.com/programming/arrayindelphi880528-1886/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 14:25:44 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1886</guid>
		<description><![CDATA[بسمه تعالی یک آرایه مجموعه ای از متغیر های هم نام است که در آن هر متغیر با یک شماره مشخص می شود. آرایه های با طول ثابت (Static Arrays) مثلا در برنامه ای می خواهیم معدل بیست درس را محاسبه کنیم. یک راه این است که از بیست متغیر با نام های متفاوت استفاده [...]]]></description>
			<content:encoded><![CDATA[<p>بسمه تعالی</p>
<p>یک آرایه مجموعه ای از متغیر های هم نام است که در آن هر متغیر با یک شماره مشخص می شود.<br />
آرایه های با طول ثابت (Static Arrays)</p>
<p>مثلا در برنامه ای می خواهیم معدل بیست درس را محاسبه کنیم. یک راه این است که از بیست متغیر با نام های متفاوت استفاده کنیم! اما راه بهتری نیز وجود دارد. از یک آرایه که شامل بیست متغیر است استفاده می کنیم. در متغیرهای آرایه ای، یک نام برای کل مجموعه انتخاب می کنند و هر متغیر را با یک شماره مشخص می کنند. در این مثال متغیر های آرایه با اعداد صفر تا نوزده شماره گذاری می شوند، توسط یک حلقه for می توان اعداد صفر تا نوزده را تولید کرد. به همین سادگی.</p>
<p>برای تعریف کردن یک آرایه باید از الگوی زیر پیروی کنیم:</p>
<p>var x : array[index1, ..., indexN] of baseType;</p>
<p>که در الگوی فوق، x نام متغیر آرایه ای، index1 شماره اولین خانه، indexN شماره آخرین خانه و baseType نوع متغیر آرایه ای می باشد.مثلا:</p>
<p>var nomre : array[0..19] of integer;</p>
<p>دستور فوق بیست متغیر از نوع integer می سازد که اولین متغیر nomre[0] و آخرین متغیر   nomre[19] می باشد. برای دسترسی یافتن به هر کدام از متغیر ها، شماره آن متغیر را داخل یک جفت کروشه در مقابل آن می نویسیم. در مثال زیر معدل بیست عدد را با استفاده از آرایه محاسبه می کنیم: procedure DoIt;</p>
<p>var<br />
nomre : array[0..19] of integer;<br />
i : integer;<br />
m : real;<br />
begin<br />
nomre[0] := 15;<br />
nomre[1] := 20;<br />
.<br />
.<br />
.<br />
nomre[19] := 19;</p>
<p>m := 0;<br />
for i := 0 to 19 do<br />
m := m + nomre[i];<br />
m := m / 20;<br />
Edit1.Text := FloatToStr(m);<br />
end;</p>
<p>می توانید در صورت نیاز، متغیر های آرایه را با شماره های دیگری شماره گذاری کنید. مثلا:</p>
<p>var x : array[12..46] of string;</p>
<p>دستور فوق، ۳۵ متغیر با نام x ایجاد می کند که با شماره های ۱۲، ۱۳، &#8230; ۴۶ مشخص می شوند.</p>
<p>آرایه های دو بعدی: یک صفحه شطرنجی را در نظر بگیرید که هر خانه آن را می توان با دو عدد طول و عرض شماره گذاری کرد. به همین ترتیب می توان در دلفی نیز یک جدول دو بعدی داشت. برای در مثال زیر یک آرایه دو بعدی تعریف می شود که ۱۰ در ۵۰ می باشد. یعنی به تعدد یک جدول ۱۰ در ۵۰ متغیر دارد.</p>
<p>var s : array[1..10, 1..50] of integer;</p>
<p>در مثال زیر یک آرایه دو بعدی ۱۰ در ۱۰ تعریف می کنیم و هر کدام از خانه های آرایه را با عدد مربوطه جدول ضرب پر می کنیم:</p>
<p>var jadval : array[1..10, 1..10] of integer;<br />
var i, j : integer;<br />
begin<br />
for i := 1 to 10 do<br />
for j := 1 to 10 do<br />
jadval[i, j] := i * j;</p>
<p>for i := 1 to 10 do<br />
for j := 1 to 10 do<br />
form1.Canvas.TextOut(i*20, j*20, inttostr(jadval[i, j]));<br />
end;</p>
<p>آرایه های دو بعدی را به صورت دیگری نیز می توان تعریف نمود، مثلا دستور زیر آرایه دو بعدی آرایه jadval در مثال بالا تعریف می کند:</p>
<p>var jadval : array[1..10] of array[1..10] of integer;</p>
<p>با کمی دقت می توان منطق ساده این دستور را درک کرد!</p>
<p>چند نکته در مورد آرایه های با طول ثابت:</p>
<p>• اگر آرایه های a و b از یک نوع باشند، دستور b := a متغیر های متناظر a را در b کپی می کند.<br />
• طول آرایه های استاتیک را نمی توان تغییر داد.<br />
• می توان خانه های آرایه را با کاراکتر نیز مشخص نمود! مثال:</p>
<p>var x : array['a'..'e'] of integer;<br />
begin<br />
x['a'] := 1;<br />
x['b'] := 2;<br />
x['c'] := x['a'] + x['b'];<br />
end;</p>
<p>آرایه های با طوی متغیر (Dynamic Arrays)</p>
<p>آرایه های دینامیک اندازه ثابتی ندارند و در طول اجرای برنامه می توان اندازه آن ها را به میزان مورد نیاز تعیین کرد و در حافظه صرفه جویی نمود. در مثال زیر یک آرایه دینامیک یک بعدی از اعداد صحیح به نام dyna تعریف شده است.</p>
<p>var dyna : array of integer;</p>
<p>برای تعیین اندازه آرایه دینامیک باید از دستور SetLength استفاده کرد. مثلا دستور SetLength(dyna, 10); تعداد ۱۰ متغیر در آرایه dyna تعریف می کند. این متغیر ها از ۰ تا ۹ شماره گذاری می شوند. در آرایه های متغیر شماره خانه اول همواره ۰ می باشد.</p>
<p>برای از بین بردن آرایه و آزاد کردن حافظه اشغال شده، از دستور dyna := nil; استفاده کنید.</p>
<p>آرایه های دینامیک از نوع اشاره گر ها هستند. در مثال زیر اگرx و y دو آرایه دینامیک از یک نوع باشند، دستور x := y; باعث می شود که x به حافظه اشغال شده توسط y اشاره کند. یعنی x برای خودش حافظه جداگانه اشغال نمی کند.</p>
<p>برنامه زیر را در نظر بگیرید:</p>
<p>var<br />
A, B: array of Integer;<br />
begin<br />
SetLength(A, 1);<br />
A[0] := 1;<br />
B := A;<br />
B[0] := 2;<br />
end;</p>
<p>مقدار a[0] پس از اجرای برنامه بالا برابر ۲ می باشد، چراکه b[0] به همان a[0] اشاره می کند. همانطور که در بالا ذکر شد در آرایه های استاتیک، عمل x := y; متغیر y را در متغیر x کپی می کند.</p>
<p>برای ساختن یک کپی حقیقی از یک آرایه دینامیک باید از تابع Copy استفاده نمایید.</p>
<p>var<br />
A, B: array of Integer;<br />
begin<br />
SetLength(A, 1);<br />
A[0] := 1;<br />
B := Copy(A);<br />
B[0] := 2;<br />
end;</p>
<p>توجه داشته باشید که دستور b := copy(a) برای آرایه b بصورت جدا از a، حافظه اشغال می کند و سپس مقدار a را در b کپی می نماید.</p>
<p>وقتی متغیر های آرایه های دینامیک را با یکدیگر مقایسه می کنید در حقیقت اشاره گر آنها با یکدیگر مقایسه می شود. در مثال زیر دو آرایه همنوع a و b هر یک حافظه مخصوص به خود را اشغال کرده اند، عبارت مقایسه ای a = b مقدار false را باز می گرداند زیرا a و b به جاهای مختلفی از حافظه اشاره می کنند:</p>
<p>var<br />
A, B: array of Integer; begin<br />
SetLength(A, 1);<br />
SetLength(B, 1);<br />
A[0] := 2;<br />
B[0] := 2;<br />
end;</p>
<p>توجه داشته باشید که عبارت مقایسه ای a[0] = b[0] مقدار true بر می گرداند چون a[0] و b[0] هر دو برابر ۲ هستند.</p>
<p>در آرایه های دینامیک، برای به دست آوردن اندازه آرایه از تابع length استفاده می کنند. همچنین تابع low شماره اولین خانه آرایه و تابع high شماره آخرین خانه آرایه را باز می گرداند. توجه داشته باشید که مقدار تابع low برای آرایه های دینامیک برابر ۰ می باشد. مثال:</p>
<p>var<br />
A : array of Integer;<br />
x0, x1, x2 : integer;<br />
begin<br />
SetLength(A, 123);<br />
x0 := length(A);<br />
x1 := low(A);<br />
x2 := high(A);<br />
end;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/arrayindelphi880528-1886/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>تبدیل اعداد به حروف در زبانهای برنامه نویسی گوناگون</title>
		<link>http://www.irandevelopers.com/programming/convertnumbertoalpha880528-1884/</link>
		<comments>http://www.irandevelopers.com/programming/convertnumbertoalpha880528-1884/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 14:22:56 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1884</guid>
		<description><![CDATA[بسمه تعالی می خواهیم تابعی بنویسیم که یک عدد بگیرد و آن را به حروف تدیل کند. ورودی و خروجی تابع از نوع string هستند. در این مقاله، متن برنامه به زبان delphi آورده شده است. همچنین متن برنامه به زبان های c#, vb6, js نیز ضمیمه مقاله هستند. { نمونه کد مقالات در زیانهای [...]]]></description>
			<content:encoded><![CDATA[<p>بسمه تعالی</p>
<p>می خواهیم تابعی بنویسیم که یک عدد بگیرد و آن را به حروف تدیل کند. ورودی و خروجی تابع از نوع string هستند.</p>
<p>در این مقاله، متن برنامه به زبان delphi آورده شده است. همچنین متن برنامه به زبان های c#, vb6, js نیز ضمیمه مقاله هستند. { نمونه کد مقالات در زیانهای برنامه نویسی گوناگون }</p>
<p>با استفاده از برنامه به زبان vb6 می توانید از این قابلیت در excel, access نیز استفاده کنید.</p>
<p>جدول زیر مثالی از نحوه عملکرد تابع می باشد:</p>
<p>عدد<br />
به حروف</p>
<p>۱۲۳<br />
یکصد و بیست و سه</p>
<p>۱۲۳۰۰۰<br />
یکصد و بیست و سه میلیون</p>
<p>۱۲۳۰۰۰۰۰۰<br />
یکصد و بیست و سه میلیارد</p>
<p>۷۲۱۰<br />
هفت هزار و دویست و ده</p>
<p>۱۲۰۰۰۰۵<br />
یک میلیون و دویست هزار و پنج</p>
<p>۱۶۴۸۱۹۵<br />
یک میلیون و ششصد و چهل و هشت هزار و یکصد و نود و پنج</p>
<p>قبل از اینکه دست به کار کد نویسی بشویم باید مسئله را تحلیل کنیم و راه حل آن را دقیق بدست بیاوریم. وقتی که راه حل را یافتیم، می توانیم راه حل مورد نظرمان را به برنامه تبدیل کنیم!</p>
<p>با این ایده ساده کارمان را شروع کنیم که : نام هر عدد را می توانیم با استفاده از ترکیب تعدادی اجزای اصلی به دست آورد. با این ایده، باید اجزای اصلی را به دست آوریم. (منظور از اجزای اصلی قسمت های تکراری در اسامی اعداد است برای مثال : یک، دو، سه، بیست، پانصد، هزار، میلیون و &#8230; می باشد).</p>
<p>علاوه بر اجزای اصلی که مبنای تشکیل اعداد می باشند، با کمی دقت در مثال بالا متوجه می شوید که ترکیب های سه رقمی اعداد، خود می توانند به عنوان اجزای تکرار شونده به کار روند. بر حسب اینکه ترکیب سه رقمی مورد نظر در چه جایگاهی قرار بگیرد، پسوند های هزار، میلیون، میلیارد و &#8230; را می توان به آن اضافه کرد. مثلا ترکیب سه رقمی ۱۲۳ را در نظر بگیرید. اگر ۱۲۳ در سه رقم اول قرار بگیرند، آن را یکصد و بیست و سه می خوانیم و اگر در سه رقم دوم قرار بگیرند آن را یکصد و بیست و سه هزار می خوانیم و &#8230;</p>
<p>مراحل زیر برای تبدیل اعداد به حروف می توان پیشنهاد کرد :<br />
تجزیه عدد مورد نظر به قسمت های سه رقمی<br />
ساختن نام هر یک از قسمت های سه رقمی (این مرحله ر باید بیشتر بررسی کنیم.)<br />
افزودن پسوند مناسب به قسمت های سه رقمی<br />
ترکیب قسمت های سه رقمی</p>
<p>برای ساختن نام قسمت های سه رقمی به روش زیر عمل می کنیم:</p>
<p>ابتدا باید تک تک رقم های عدد را به دست بیاوریم. می توانیم رقم ها را در یک آرایه ذخیره کنیم. با توجه به اینکه هر رقم با توجه به جایگاهی که در آن قرار دارد خوانده می شود باید جایگاه رقم به دست آمده را نیز در نظر داشته باشیم. . مثلا رقم ۳ در عدد ۱۲۳ چون در یکان قرار دارد به صورت &#8220;سه&#8221; خوانده می شود، اما در عدد ۱۳۵ به صورت &#8220;سی&#8221; خوانده می شود و در عدد ۳۹۸ به صورت &#8220;سیصد&#8221; خوانده می شود.</p>
<p>حالت های استثنا کارمان را سخت می کنند و باید همه آن ها را شناسایی کنیم. مثلا اعداد ۱۰ تا ۱۹ حالت استثنا هستند.</p>
<p>فهرست زیر شامل اجزای اصلی مورد نیاز می باشد :</p>
<p>صفر، یک، دو، سه، چهار، پنج، شش، هفت، هشت، نه</p>
<p>بیست، سی، چهل، پنجاه، شصت، هفتاد، هشتاد، نود</p>
<p>ده، یازده، دوازده، سیزده، چهارده، پانزده، شانزده، هفده، هجده، نوزده</p>
<p>یکصد، دویست، سیصد، چهارصد، پانصد، ششصد، هفتصد، هشتصد، نهصد</p>
<p>هزار، میلیون، میلیارد، تریلیون</p>
<p>البته آرایه هایی که در برنامه تعریف شده اند، اعضای دیگری نیز وجود دارند که برای پوشش دادن حالت های استثنا در نظر گرفته شده اند.</p>
<p>متن برنامه دلفی به همراه توضیحات:</p>
<p>const</p>
<p>yekan : array[0..9] of string = (&#8216;صفر&#8217;,'یک&#8217;,'دو&#8217;,'سه&#8217;,'چهار&#8217;,'پنج&#8217;,'شش&#8217;,'هفت&#8217;,'هشت&#8217;,'نه&#8217;);</p>
<p>dahgan : array[0..9] of string = (&#8221;,&#8221;,&#8217;بیست&#8217;,'سی&#8217;,'چهل&#8217;,'پنجاه&#8217;,'شصت&#8217;,'هفتاد&#8217;,'هشتاد&#8217;,'نود&#8217;);</p>
<p>dahyek : array[10..19] of string = (&#8216;ده&#8217;,'یازده&#8217;,'دوازده&#8217;,'سیزده&#8217;,'چهارده&#8217;,'پانزده&#8217;,'شانزده&#8217;,'هفده&#8217;,'هجده&#8217;,'نوزده&#8217;);</p>
<p>sadgan : array[0..9] of string = (&#8221;,&#8217;یکصد&#8217;,'دویست&#8217;,'سیصد&#8217;,'چهارصد&#8217;,'پانصد&#8217;,'ششصد&#8217;,'هفتصد&#8217;,'هشتصد&#8217;,'نهصد&#8217;);</p>
<p>base : array[0..4] of string = (&#8221;,&#8217;هزار&#8217;,'میلیون&#8217;,'میلیارد&#8217;,'تریلیون&#8217;);</p>
<p>// تابع تبدیل عدد به حروف</p>
<p>function num2str(snum : string) : string;</p>
<p>// تابع تبدیل عدد سه رقمی به حروف</p>
<p>function getnum3(num3 : integer) : string;</p>
<p>var</p>
<p>s : string;</p>
<p>d1, d2, d3, d12 : integer;</p>
<p>begin</p>
<p>d12 := num3 mod 100; // دو رقم اول</p>
<p>d3 := num3 div 100; // صدگان</p>
<p>if d3 &lt;&gt; 0 then</p>
<p>s := sadgan[d3] + &#8216; و &#8216;;</p>
<p>// نام گذاری اعداد ۱۰ تا ۱۹ در بین</p>
<p>// اعداد دو رقمی استثنا است</p>
<p>if (d12 &gt;= 10) and (d12 &lt;= 19) then</p>
<p>begin</p>
<p>s := s + dahyek[d12];</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>d2 := d12 div 10; // دهگان</p>
<p>if d2 &lt;&gt; 0 then</p>
<p>s := s + dahgan[d2] + &#8216; و &#8216;;</p>
<p>d1 := d12 mod 10; // یکان</p>
<p>if d1 &lt;&gt; 0 then</p>
<p>s := s + yekan[d1] + &#8216; و &#8216;;</p>
<p>// حذف حرف &lt;و&gt; اضافی</p>
<p>s := copy(s, 1, length(s) &#8211; 3);</p>
<p>end;</p>
<p>getnum3 := s;</p>
<p>end;</p>
<p>var</p>
<p>L, i, b : integer;</p>
<p>stotal : string;</p>
<p>begin</p>
<p>// اگر عدد صفر بود، یکراست نتیجه را برگردان</p>
<p>if snum = &#8217;0&#8242; then</p>
<p>result := yekan[0]</p>
<p>else</p>
<p>begin</p>
<p>// برای اینکه بتوان عدد را به قسمت های سه رقمی تقسیم کرد</p>
<p>// به سمت چپ عدد، به اندازه کافی صفر می افزاییم</p>
<p>for i := Length(snum) to ((Length(snum) &#8211; 1) div 3 + 1) * 3 &#8211; 1 do</p>
<p>snum := &#8217;0&#8242; + snum;</p>
<p>L := Length(snum) div 3 &#8211; 1; // تعداد قسمت های سه رقمی منهای یک</p>
<p>// سه رقم سه رقم حلقه را تکرار کن</p>
<p>// از چپ به راست</p>
<p>for i := 0 to L do</p>
<p>begin</p>
<p>// به دست آوردن سه رقم مورد نظر</p>
<p>b := strtoint(copy(snum ,i * 3 + 1, 3));</p>
<p>// اگر سه رقم به دست آمده صفر باشد، در نام عدد تاثیری ندارد</p>
<p>// نام قسمت سه رقمی را بدست می آوریمgetnum3 با استفاده از تابع</p>
<p>// پسوند را به آن اضافه می کنیمbase با استفاده از آرایه</p>
<p>if b &lt;&gt; 0 then</p>
<p>stotal := stotal + getnum3(b) + &#8216; &#8216; + base[L - i] + &#8216; و &#8216;;</p>
<p>end;</p>
<p>// حذف حرف &lt;و&gt; اضافی</p>
<p>stotal := copy(stotal, 1, length(stotal) &#8211; 3);</p>
<p>result := stotal;</p>
<p>end;</p>
<p>end;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/convertnumbertoalpha880528-1884/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ارث بری فرم ویژوال در دلفی قسمت دوم</title>
		<link>http://www.irandevelopers.com/programming/delphiobejcts8712110957p2-1558/</link>
		<comments>http://www.irandevelopers.com/programming/delphiobejcts8712110957p2-1558/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:27:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1558</guid>
		<description><![CDATA[پشت نقاب VFI یکی از چیزهایی که مرا به دلفی علاقمند می کند، رو راست بودنش است. دلفی هیچ چیز را از ما مخفی نمی کند، هر کاری انجام دهیم، به کد برنامه منعکس می کند. برای اینکه بدانید VFI دقیقا چگونه کار می کند، کافی است کدی را که ابزار طراحی فرم دلفی تولید [...]]]></description>
			<content:encoded><![CDATA[<p><strong>پشت نقاب VFI</strong><br />
یکی از چیزهایی که مرا به دلفی علاقمند می کند، رو راست  بودنش است. دلفی هیچ چیز را از ما مخفی نمی کند، هر کاری انجام دهیم، به کد برنامه  منعکس می کند. برای اینکه بدانید VFI دقیقا چگونه کار می کند، کافی است کدی را که  ابزار طراحی فرم دلفی تولید کرده بررسی کنید. اجازه بدهید با کدی شروع کنیم که با  انتخاب گزینهء Copy در Object Repository تولید می شود. دوباره همان Dual list box  را انتخاب می کنیم. شکل ۳ تعریف کلاس ایجاد شده را نشان می دهد.</p>
<pre class="Code"><strong>type</strong>
  TDualListDlg = <strong>class</strong>(TForm)
    OKBtn: TButton;
    CancelBtn: TButton;
    HelpBtn: TButton;
    SrcList: TListBox;
    DstList: TListBox;
    SrcLabel: TLabel;
    DstLabel: TLabel;
    IncludeBtn: TSpeedButton;
    IncAllBtn: TSpeedButton;
    ExcludeBtn: TSpeedButton;
    ExAllBtn: TSpeedButton;
    <strong>procedure</strong> IncludeBtnClick(Sender: TObject);
    <strong>procedure</strong> ExcludeBtnClick(Sender: TObject);
    <strong>procedure</strong> IncAllBtnClick(Sender: TObject);
    <strong>procedure</strong> ExcAllBtnClick(Sender: TObject);
    <strong>procedure</strong> MoveSelected(List: TCustomListBox;
      Items: TStrings);
    <strong>procedure</strong> SetItem(List: TListBox; Index: Integer);
    <strong>function</strong> GetFirstSelection(List: TCustomListBox):
      Integer;
    <strong>procedure</strong> SetButtons;
  <strong>private</strong>
    <em>{ Private declarations }</em>
  <strong>public</strong>
    <em>{ Public declarations }</em>
<strong>end</strong>;</pre>
<p><strong>شکل ۳</strong></p>
<p>این فقط بخش interface برنامه است. بخش implementation  در اینجا نشان داده نشده. برای ما همان خط اول مهم است که تعریف کلاس باشد:</p>
<div class="Code">TDualListDlg = <strong>Class</strong>(Tform)</div>
<p>این کلاس وارث TForm  است. همه چیز Dual list box در همین فایل PAS. و DFM. مربوطه اش آمده. حال شکل ۴ را  در نظر بگیرید. این شکل فایل PAS. مربوط به Dual list box را در حالتی نشان می دهد  که گزینهء Inherit را انتخاب کرده باشیم.</p>
<pre class="Code"><strong>unit</strong> Unit3;

<strong>interface</strong>

<strong>uses</strong>
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, DUALLIST, StdCtrls, Buttons;

<strong>type</strong>
  TDualListDlg3 = <strong>class</strong>(TDualListDlg)
  <strong>private</strong>
    <em>{ Private declarations }</em>
  <strong>public</strong>
    <em>{ Public declarations }</em>
  <strong>end</strong>;

<strong>var</strong>
  DualListDlg3: TDualListDlg3;

<strong>implementation</strong>

<em>{$R *.DFM}</em>

<strong>end</strong>.</pre>
<p><strong>شکل ۴</strong></p>
<p>باز خط مهم همان خط تعریف کلاس است:</p>
<div class="Code">TDualListDlg3 = <strong>class</strong>(TDualListDlg)</div>
<p>که نشان می  دهد فرم جدید وارث کلاس دیگری به نام TDualListDlg است. روشن است که TDualListDlg  همان فرم توی انبار است. به عبارت uses این کلاس توجه کنید، ببینید که شامل یونیت  DUALLIST است. اگر دقت کنید می بینید که این یونیت در عبارت uses فایل .DPR یعنی  خود پروژه هم هست:</p>
<pre class="Code"><strong>uses</strong>
Forms,
Unit1 <strong>in</strong> 'Unit1.pas' <em>{ Form1 }</em>,
Unit2 <strong>in</strong> 'Unit2.pas' <em>{ Form2 }</em>,

DualList <strong>in</strong> '..\OBJREPOS\DUALLIST.pas' <em>{ DualListDlg }</em>,
Unit3 <strong>in</strong> 'Unit3.pas' <em>{ DualListDlg3 }</em>;</pre>
<p>چون فرم جدیدتان وارث فرم دیگری است، پروژهء شما باید هر دو را در بر  داشته باشد.</p>
<p>تغییراتی که در فرم خود می دهید، فقط در فایلهای PAS. و DFM.  فرم خودتان منعکس می شود. برای نمونه اگر روی فرمتان جای چیزی را عوض کنید، این  تغییر فقط در فایل DFM. کلاس پایین دست (کلاس شما) ثبت و ضبط می شود. در واقع فایل  DFM. یک فرم پایین دست، در بر دارندهء آن ویژگیهای فرم پایین دست است که نسبت به  فرم بالادست تغییر کرده. بهترین راه برای فهمیدن تغییرات بین دو فرم همین است.</p>
<p>برای حسن ختام این بخش نگاهی هم به ساختار خود انبار اشیاء می اندازیم.  انبار اشیاء دلفی یک فایل INI. بیشتر نیست. انبار اشیاء دلفی در فایلی با نام  Delphi32.DRO در زیر شاخهء bin\ شاخهء نصب دلفی نگهداری می شود. می توانید آن را با  Notepad یا یک ویرایشگر متن دیگر باز کنید تا خودتان ببینید. شکل ۵ بخش مربوط به  Dual list box را نمایش می دهد.</p>
<pre class="Code">[C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST]
Type=FormTemplate
Name=Dual list box
Page=Forms
Icon=C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST.ICO
Description=Dialog box with two list boxes. Supports moving items from one list to the other.
Author=Borland
DefaultMainForm=0
DefaultNewForm=0
Ancestor=
Designer=dfm</pre>
<p><strong>شکل پنج</strong></p>
<p>مهمترین خط همان خط اول است. می بینید که این خط جای  فایلها را روی دیسک به دلفی نشان می دهد. همهء فرمها همین جور در انبار نگهداری می  شوند.</p>
<p><strong>VFI در جهان واقع</strong><br />
مقالات فنی معمولا تصویری روشن و امید  بخش از برنامه نویسی و تولید نرم افزار پیش رویتان می گذارند. همین چند کار را  انجام دهید و&#8230; به بهشت برنامه نویسی خوش آمدید! در دنیای واقعی، VFI می تواند  جلوی هدر رفتن وقتتان را بگیرد و برنامه هایتان را پایدارتر کند. ولی کار زیادی هم  می برد. اولین باری که VFI را به کار ببرید، مدت زیادی از وقتتان صرف طراحی سلسله  مراتب فرمها خواهد شد. اینجا سعی می کنم آنچه را بار اول استفاده تان از VFI پیش می  آید برایتان مجسم کنم.</p>
<p>نوشتن برنامه تان را مانند همیشه آغاز می کنید.  تعدادی فرم می سازید و مقداری کد می نویسید. یک باره متوجه می شوید که چندتا از  فرمهایتان خیلی به هم شبیه هستند و کدهایی هم که برایشان می نویسید یکی است. این جا  می فهمید که VFI جایش همین جاست و تصمیم می گیرید از آن استفاده کنید. اشتراکات  کدها و طراحی فرمها را پیدا می کنید و آنها را به یک فرم کلی منتقل می کنید. آن فرم  را در انبار اشیاء می گذارید و فرمهای اول کارتان را طوری بازسازی می کنید که وارث  آن باشند. ولی این پایان داستان نیست. بعید است همان بار اول بتوانید یک طراحی بی  عیب و نقص ارایه دهید. آنچه معمولا اتفاق می افتد این است که شما به توسعهء فرمهای  پایین دست ادامه می دهید، ولی همیشه مراقبید که اگر مورد مشترکی پیدا شد، آن را به  کلاسهای بالاتر ببرید. این جور طراحی کلاس خیلی شبیه نرمال سازی بانکهای اطلاعاتی  است. می خواهید از دوباره کاری و تکرار داده ها جلوگیری کنید و این وقتگیر است.</p>
<p>این سبک طراحی یک عملیات مکرر است. ممکن است بار اولی که از آن استفاده می  کنید تغییر محسوسی در بهره وری مشاهده نکنید، ولی بعدا خواهید دید. یک مثال از  کارهای خودم یادم می آید. ما یک رابط کاربری استاندارد برای ویرایش جداول بانک  اطلاعاتی طراحی کردیم. تمام امکانات لازم &#8211; مانند add، delete، edit، search – را  ایجاد کردیم و به کاربر اجازه دادیم هم از راه منوها و هم با دکمه های روی Coolbar  به آنها دستیابی داشته یاشد. همهء کد و ظواهر مشترک را در یک کلاس در بالادست جمع  کرده و آن را در تمام برنامه هایمان به کار می بردیم. فرمهای اصلی برنامه مان همه  از همان فرم مشتق می شدند. از قضا کاربر ما از Coolbar خوشش نیامد و دوست داشت که  جایش با یک چیز ساده تر عوض شود. ما ۳۰ فرم را به همین صورت ساخته بودیم، ولی تمام  کاری که حالا می بایست می کردیم، عوض کردن Coolbar در آن فرم کلی با یک Toolbar  بود. بعد هم برنامه را کامپایل کردیم!</p>
<p>برتریهای واقعی VFI تازه بار دوم یا  سومی که از یک طراحی خاص استفاده کنید معلوم می شود. به یاد داشته باشید که انبار  اشیاء را می توانید برای به اشتراک گذاشتن فرمها بین برنامه هایتان به کار ببرید.  در کار ما، مرحلهء اول طراحی برنامه تهیهء فهرست فرمهای لازم برای برنامه و  شباهتهای میان آنهاست. پس از آن است که تصمیم می گیریم همان فرمهای پیش ساخته مان  را به کار ببریم، آنها را کمی تغییر دهیم، یا اینکه اصلا فرمهای جدیدی بسازیم. به  هر حال هیچ گاه از صفر آغاز نمی کنیم.</p>
<p>اگر می خواهید کار با VFI را آغاز  کنید، پیشنهاد می کنم از یک فرم برای کار با بانکهای اطلاعاتی آغاز کنید. تصمیم خود  را در مورد قیافه اش بگیرید، طراحی اش کنید و آن را در انبار اشیاء بگذارید. تا می  توانید، و تا آنجا که می شود کدهای مشترکتان را به آن منتقل کنید. بعد فرمهای  برنامه تان را از همین فرم به ارث ببرید و به آنها اطلاعات مختص جدولتان را  بیافزایید. زمانی که دارید برای فرمها کد می نویسید همیشه توجه داشته باشد که اگر  کد مشترکی پیدا شد، آن را به کلاسهای بالاتر ببرید. هر بخش از کد را که می نویسید،  از خود بپرسید که آیا این کد مختص همین فرم است یا می شود آن را در فرمهای دیگر به  کار برد. اگر کلی به نظر می رسد، حتما آن را به کلاسهای بالاتر ببرید.</p>
<p><strong>خلاصه</strong><br />
VFI یه شما توانایی ساخت فرمهای جدید بر پایهء فرمهای  موجود را فراهم می کند. VFI همان برتریهای وراثت را دارد، در نتیجه توسعهء برنامه  را سریعتر و آن را استوار و متناسب تر می کند.</p>
<p>درک شیوهء کارکرد VFI وابسته  به فهم درست مدل شیئی دلفی و بخصوص وراثت است. به نظر من یکی از قویترین امکانات  دلفی است و خودم خیلی زیاد استفاده اش می کنم.</p>
<p>نویسنده اصلی: Rick  Spence<br />
منبع: Delphi Informant Magazine</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/delphiobejcts8712110957p2-1558/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ارث بری فرم ویژوال در دلفی قسمت اول</title>
		<link>http://www.irandevelopers.com/programming/objectdelphi8712110956p1-1554/</link>
		<comments>http://www.irandevelopers.com/programming/objectdelphi8712110956p1-1554/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:26:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1554</guid>
		<description><![CDATA[ارث بری فرم ویژوال چیست؟ VFI قابلیتی در دلفی است که اجازه می دهد فرمهای جدید از فرمهای موجود مشتق شوند یا قابلیتهای آن را به ارث برند. VFI به طور کلی همان مزایای ارث بری را در اختیار می گذارد که اولین آنها قابلیت بر گرفتن شباهتهای کلاسهای مختلف از کلاسهای بالاتر در یک [...]]]></description>
			<content:encoded><![CDATA[<p>ارث بری فرم ویژوال چیست؟<br />
VFI قابلیتی در دلفی است که اجازه می دهد فرمهای جدید از فرمهای موجود مشتق شوند یا قابلیتهای آن را به ارث برند. VFI به طور کلی همان مزایای ارث بری را در اختیار می گذارد که اولین آنها قابلیت بر گرفتن شباهتهای کلاسهای مختلف از کلاسهای بالاتر در یک سلسله مراتب است. در این مورد، کلاسها فرمهایی هستند که در ابزار طراحی فرم دلفی ساخته شده اند. به زبان دیگر VFI به شما اجازه می دهد یک کد را در جایی بنویسید که بین چندین فرم مشترک باشد. واضح است که یک بار نوشتن کد کارایی را بالا برده و امکان خطا را کاهش می دهد. حال این فرمهاممکن است همگی مربوط به یک برنامه یا برنامه های مختلف باشند.</p>
<p>VFI چیزی بیش از استفادهء مجدد از کد است. این همان جایی است که بخش ویژوال VFI وارد می شود. شما می توانید فرمهایی را در دلفی طراحی کنید، وهمان طرح بندی و ظاهر را بین فرمهای متفاوت به اشتراک گذارید. واداشتن فرمها به داشتن طرح بندی مشترک باعث ایجاد ثبات در ظاهر و بالا رفتن کارایی می شود.</p>
<p>همچنین استفاده از VFI به شما امکان طراحی سلسله وار فرمها را می دهد. هر تغییری در فرمهای مراتب بالاتر در فرمهای وارث تاثیر می گذارد. همین طور، می توانید اجزاء و یا کدهایی را به فرمها اضافه و در نتیجه تمام فرمهای وارث را تغییر دهید.</p>
<p>فرض کنید در حال نوشتن برنامه ای برای مدیریت مشتریان و صورتحساب هایشان هستید. شما برنامه را طراحی کرده و معین می کنید که برای کار با داده ها به سه فرم کلی نیاز دارید: یکی برای مشتریان، دومی برای صورتحساب ها و سومی برای قطعاتی که می فروشید. گرچه هر فرم اطلاعات متفاوتی ارائه می کند، عناصر مشابهی در فرمها هست. مثلا هر فرم باید دوبرگ داشته باشد. یکی با یک DBGrid بر رویش و دیگری با کنترلهای متفاوت برای ویرایش جدولی که در نظر دارید. همچنین هر برگ به چند دکمه برای ذخیره و لغو تغییرات و اضافه و حذف کردن رکوردها نیاز دارد. شما می توانید هر فرم را جداگانه طراحی کرده و برای هر کدام جداگانه کد بنویسید. اما راه بهترش آغاز کار با یک فرم کلی پیش ساخته حاوی کنترلها و کد مشترک است. بعد می توانید از VFI استفاده کرده، فرمهای مورد نظرتان را مبتنی بر این فرم اولیه بسازید و تغییرات لازم را در آنها ایجاد کنید.</p>
<p>وقتی فرمها را ساختید، باز هم می توانید امکانات جدیدی به فرم اولیه اضافه کنید. مثلا اگر بخواهید در پس زمینهء همهء فرمها آرم خاصی را نمایش دهید یا در همه امکاناتی کلی برای جستجو فراهم آورید. کافی است هر آنچه را می خواهید به فرم اولیه بیافزایید. فرمهای پایین دست خود به خود رفتار یا ظاهر جدید را به ارث می برند.</p>
<p>مروری کوتاه بر وراثت<br />
وراثت یکی از ویژگیهای برنامه نویسی شیء گراست که به شما اجازهء ساخت کلاسهای تازه مبتنی بر کلاسهای موجود را می دهد. کلاس قدیمی، کلاس مافوق یا بالادست و کلاس جدید، کلاس زیر دست یا پایین دست خوانده می شود. کلاسها بالطبع دارای داده ها و کدهایی هستند. کلاسهای پایین رتبه تر می توانند داده ها و کدهای عمومی کلاسهای بالادست خود را ببینند. دلفی از یک مدل وراثت تکی پشتیبانی می کند. بدین معنی که هر کلاس می تواند به طور مستقیم وارث فقط یک کلاس باشد. (بعضی زبانها از نوع دیگری وراثت به نام وراثت چندتایی پشتیبانی میکنند. در این زبانها یک کلاس می تواند وارث چندین کلاس بالادست خود باشد.) همچنین می توانید به طور مکرر از وراثت استفاده کنید. یعنی می توانید مثلا کلاس A را وارث کلاس B و کلاس B را وارث کلاس C بسازید. در این حالت کلاس A می تواند کدها و داده های عمومی هر دو کلاس B و C را ببیند (شکل ۱ را ببینید).<br />
شکل ۱<br />
<img class="alignnone size-full wp-image-1555" title="11111" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/11111.jpg" alt="11111 ارث بری فرم ویژوال در دلفی قسمت اول" width="103" height="220" /></p>
<p>کلاس زیر را که ابزار طراحی فرم دلفی به طور خودکار برای فرم ما ایجاد کرده در نظر بگیرید:</p>
<p>Type<br />
TFrmRichEdit = class(TForm)<br />
btnCancel: TButton;<br />
btnOk: TButton;<br />
rtfNotes: TRichEdit;<br />
private<br />
{ Private declarations }<br />
public<br />
{ Public declarations }<br />
end;</p>
<p>نام این کلاس TFrmRichEdit است و می بینید که به صورت وارثی از TForm تعریف شده. TForm یکی از کلاسهایی است که از قبل در VCL تعریف شده. TForm و کلاسهای بالاترش داده و کدی را که برای همهء انواع فرمها متعارف است تعریف می کند. خاصیتهایی مانند Font, Caption و Color و همین طور روالهایی چون Show, Close و ShowModal در همین کلاسها تعریف می شوند. پس TForm و پدرانش همهء شباهتهای میان انواع فرمها را در بر می گیرند. اگر دلفی از وراثت پشتیبانی نمی کرد، ابزار طرحی فرم دلفی می بایست هربار، برای هر فرم تمام این روالها و داده های مشترک را از اول می نوشت.</p>
<p>برای نمونه سازی از کلاس TFrmRichEdit، ابتدا باید یک شیء از آن نوع تعریف کنید:</p>
<p>Var<br />
frmRichEdit: TFrmRichEdit</p>
<p>سپس می توانید کلاس را با صدا زدن روال سازنده اش ، Create، نمونه سازی کنید. Create یک پارامتر می گیرد، که به آن شیء Application را رد می کنیم:</p>
<p>frmRichEdit := TFrmRichEdit.Create(Application);</p>
<p>اینجا هم وراثت توی کار است! چه کسی Create را تعریف کرده؟ یکی از کلاسهای بالادست TFrmRichEdit. اگر بخواهیم دقیقتر بگوییم، TCustomForm.</p>
<p>هنگامی که از روی یک کلاس، شیئی می سازید، می توانید به طور مستقیم به روالها و داده های آن شیء دسترسی داشته باشید:</p>
<p>frmRichEdit.btnOk.Enabled := False;</p>
<p>همچنین به روالها و داده های کلاسهای بالادستش:</p>
<p>frmRichEdit.Caption := ‘RTF Editor’;<br />
frmRichEdit.Show;</p>
<p>Caption در TControl (که چندین مرتبه بالاتر است) تعریف شده. روال Show هم در TCustomForm تعریف شده.</p>
<p>بالاتر دربارهء داده و کدهای عمومی یک کلاس صحبت کردیم. می دانید منظور ما از &#8220;Public&#8221; دقیقا چیست؟ آیا می شود کد و داده هایمان را به صورت دیگری هم تعریف کنیم؟ در حقیقت عمومی، میدان یا قلمرو تعریفمان را مشخص می کند. نشان می دهد که شیء یا متغیر تعریف شده در کجاها باید مرئی و قابل دستیابی باشد و در کجاها نباشد. داده و کد عمومی یک کلاس برای کاربرانش قابل رویت هستند. در مثال بالا هر سهء btnOk, btnCancel و rtfNotes، متغیرهای عمومی نمونهء ما هستند.</p>
<p>متغیرها، کدها و روالهای یک کلاس را دو جور دیگر هم می توانیم تعریف کنیم. به صورت خصوصی و حفاظت شده . اکنون اگر دوباره به کلاسی که تعریف کردیم، نگاهی بیندازید، دو بخش به نامهای public و private می بینید که هر دو تهی هستند. آنچه در این بخشها تعریف کنید، قلمروی همنام همان بخش خواهد داشت. کد و داده های شخصی تنها در روالهای درونی کلاس قابل رویت هستند و کاربران کلاس نمی توانند آنها را ببینند.</p>
<p>گرچه دلفی به طور پیش فرض بخش حفاظت شده را برای شما نمی سازد، ولی اگر نیاز باشد، خودتان می توانید آن را بسازید. هر چه در بخش حفاظت شده تعریف شود، مانند تعریفهای بخش خصوصی برنامه در اختیار روالهای خود کلاس خواهد بود. آنچه که این دو (خصوصی و حفاظت شده) را با هم متفاوت می سازد، روش برخورد با کلاسهای پایین دست است. کلاسهای زیر دست می توانند چیزهایی را که حفاظت شده تعریف شده، ببینند. اما آن چه که خصوصی تعریف شده، محدود به خود کلاس است و بس.</p>
<p>حال که وراثت را هر چند کوتاه مرور کردیم، اجازه بدهید VFI را در عمل ببینیم.</p>
<p>فوت و فن VFI<br />
برای ساختن فرمهای جدید بر پایهء فرمهای موجود، باید از انبار اشیاء دلفی استفاده کنید. این انبار در بر گیرندهء تعدادی فرمهای پیش ساخته و همچنین فرمهای موجود برنامهء شماست که با انتخابشان می توانید فرمهای جدیدی مبتنی بر آنها بسازید. برای ساختن یک فرم جدید معمولا منوی File | New | Form را انتخاب می کنیم. ولی برای ساختن فرمی بر پایهء فرمهای موجود باید File | New | Other… را انتخاب کرد. این گزینه انبارهء اشیاء دلفی یا همان Object Repository را در مقابل ما می گشاید. اکنون می توانید آنچه را می خواهید بسازید، انتخاب کنید. شما می توانید خودتان فرمهایی به انبار اضافه کنید، ولی تعدادی فرم هم پیشاپیش همراه دلفی ارائه شده که به عنوان نقطهء شروع می توانید از آنها استفاده کنید.</p>
<p>حالا صفحهء Forms را انتخاب کنید. چندین فرم از جمله About box و Dual list box را مشاهده می کنید (شکل ۲ را ببینید). این فرمها را در همهء برنامه ها می توان به کار برد.</p>
<p>شکل ۲</p>
<p><img class="alignnone size-full wp-image-1556" title="22221" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/22221.jpg" alt="22221 ارث بری فرم ویژوال در دلفی قسمت اول" width="443" height="365" /></p>
<p>به سه گزینهء Use, Copy و Inherit در پایین توجه کنید. اینها به دلفی می گویند که بین فرم جدید شما و فرمهای درون انبار چه رابطه ای باید برقرار باشد:</p>
<p>Copy: یعنی اینکه می خواهید عین فرم درون انبار در برنامهء شما بازنویسی شود. فرم جدید از فرم درون انبار کاملا&#8221; مستقل خواهد بود و تغییر در فرم درون انبار هیچ تاثیری بر فرم جدید نخواهد داشت.<br />
Inherit: یعنی فرم جدید بر پایهء فرم درون انبار است و پیوندهایش را با آن برقرار نگه می دارد. اگر فرم درون انبار را تغییر دهید، تمام فرمهای مبتنی بر آن هم تغییر می کنند. معمولا در VFI این گزینه را انتخاب می کنیم.<br />
Use: یعنی می خواهید فرم درون انبار را از همان جا که هست، مستقیما استفاده کنید. در این حالت دستکاری و تغییر در فرم، در واقع تغییر دادن فرم درون انبار است. این تغییرات بر همهء فرمهای وارث تاثیر خواهد داشت.<br />
فرمهای برنامهء خودتان را هم به همین صورت می توانید مجددا استفاده کنید. پنجرهء Object Repository چندین برگ دارد. وقتی این پنجره را باز می کنید، یکی از صفحات باید همنام برنامهء شما باشد، که در بر گیرندهء فرمهای پروژهء حاضر است. فرق این فرمها با فرمهای خود انبار در این است که فرمهای برنامهء خودتان را فقط می توانید به ارث ببرید. در نتیجه تنها گزینهء قابل انتخاب در این صفحه، گزینهء Inherit است. به هر حال تنها گزیته ای هم هست که معنی می دهد.</p>
<p>وقتی بر مبنای یکی از فرمهای درون انبار یک فرم جدید می سازید، امکان تغییر در این فرم جدید وجود دارد. می توانید اجزاء جدیدی به آن افزوده یا روالهای جدیدی بنویسید. همین طور می توانید آنچه را به ارث برده اید تغییر دهید. می توانید اجزاء به ارث برده را حرکت داده یا تغییر اندازه دهید، ولی نمی توانید آنها را حذف کنید. اگر بخواهید چنین کاری بکنید، دلفی از شما ایراد خواهد گرفت. گر چه نمی توانید اجزاء به ارث برده را حذف کنید، ولی به جایش می توانید آنها را نامرئی کنید، یعنی ویژگی Visible آن را False کنید.</p>
<p>هنگامی که مقدار یکی از ویژگیهای به ارث برده را تغییر می دهید، پیوند بین ویژگیهای دو فرم بالا دست و پایین دست را شکسته اید. مثلا فرض کنید بر روی فرم پایین دست دکمه ای را به سمت چپ حرکت می دهید. حالا همان دکمه را در فرم توی انبار تکان می دهید. چون فرم پایین دست پیوند خود را با ویژگی Left فرم بالا دست شکسته، دکمهء روی فرم زیر دست حرکتی نمی کند. (روشن است که اگر پیوند را بر هم نزده بودید حرک می کرد.) می توانید این پیوند را با کلیک راست بر روی دکمه و انتخاب Revert to inherited دوباره برقرار سازید. این کار تمام تغییراتی را که در آن جزء فرم پایین دست (در اینجا دکمهء فرم جدید ما) ایجاد کرده اید، به حالت نخست بر می گرداند.</p>
<p>وقتی با روالهای ارث برده از کلاسهای بالا دست کار می کنید، اوضاع کمی متفاوت است و انتخابهای بیشتری دارید. می توانید روال بالا دست را جایگزین کنید، یا این که کدی بنویسید که علاوه بر روال بالا دست اجرا شود. در صفحهء Forms از پنجرهء New Items، گزینهء Inherit را کلیک کنید و Dual list box را برگزینید. فرم مورد نظر ساخته می شود. اگر روی دکمهء &lt; دوبار کلیک کنید، دلفی برایتان روال زیر را می سازد. این دکمه برای جابجا کردن آیتمها از لیست چپ به لیست راست است.</p>
<p>procedure TDualListDlg2.IncludeBtnClick(Sender: TObject);<br />
begin<br />
inherited;</p>
<p>end;</p>
<p>سرواژهء inherited به معنی فراخوانی روال همنام در کلاس بالا دست است. در حقیقت کد مربوط به کلاس بالا دست است که موارد انتخابی را از لیست دست راست به لیست دست چپ جابجا می کند:</p>
<p>procedure TDualListDlg.IncludeBtnClick(Sender: TObject);<br />
var<br />
Index: Integer;<br />
begin<br />
Index := GetFirstSelection(SrcList);<br />
MoveSelected(SrcList, DstList.Items);<br />
SetItem(SrcList, Index);<br />
end;</p>
<p>این سرواژهء inherited در روال بالاست که روال پایین را اجرا می کند. شما می توانید آزادانه کد دلخواهتان را قبل یا بعد از inherited اضافه کنید. همین طور می توانید آن را حذف کنید و دیگر روال بالا دستی را صدا نکنید.</p>
<p>یک مثال کوتاه<br />
فرض کنید چندین فرم از Dual list box توی انبار به ارث برده اید. آنها را جوری که مناسب برنامه تان است آراسته اید و حالا ناگهان به این فکر افتاده اید که به کاربرتان اجازه دهید در فرمهایتان آیتمهای مورد نظرش را از یک لیست کشیده و در لیست دیگر بیندازد . اگر از VFI استفاده نکرده بودید، حالا ناگزیر بودید این قابلیت کشیدن و انداختن را برای همهء فرمهایتان یکی یکی بنویسید. ولی چون VFI را به کار برده اید، می توانید فقط یک بار این کد را به فرم درون انبار شیء بیافزایید. به صورت قدم به قدم:</p>
<p>box را در حالت Use از Object Repository برگزینید.<br />
ویژگی DragMode لیست دست چپ، SrcList، را برابر dmAutomatic قرار دهید. این مقدار به لیست شما می فهماند که باید به طور خودکار به کاربر شما اجازهء کشیدن را بدهد. همین که کاربر یک آیتم را انتخاب کرده و دکمهء سمت چپ ماوس را نگه دارد، کشیدن آغاز می شود. روش دیگر، dmManual است که در آن برنامهء شما، خود باید مسوولیت آغاز کشیدن را بر دوش بگیرد.<br />
رویداد OnDragOver را برای لیست دست راست، DstList، یه صورت زیر بنویسید:</p>
<p>Accept := (Source = SrcList);</p>
<p>رویداد OnDragOver هنگامی رخ می دهد که کاربر یک آیتم را به روی کنترل بکشد. این رویداد برای اطمینان یافتن از تناسب کنترل مقصد با آیتم کشیده شده به کار می رود. کدی که نوشتیم به DstList می گوید اگر مبدا آیتم کشیده شده SrcList بود، در صورت رها شدن بپذیرش.<br />
رویداد OnDragDrop را برای DstList به صورت زیر بنویسید:</p>
<p>IncludeBtnClick(Sender);</p>
<p>رویداد OnDragDrop هنگامی رخ می دهد که کاربر یک آیتم را رها کند. این کد دقیقا همان کاری را باید بکند که به هنگام کلیک بر روی کلید &lt; اتفاق می افتاد، پس بی دلیل آن را بازنویسی نمی کنیم.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/objectdelphi8712110956p1-1554/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>استفاده از Microsoft Agent در برنامه های خودتان</title>
		<link>http://www.irandevelopers.com/programming/microsoftagentinyourprogram8712110950-1552/</link>
		<comments>http://www.irandevelopers.com/programming/microsoftagentinyourprogram8712110950-1552/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:21:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>
		<category><![CDATA[عمومی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1552</guid>
		<description><![CDATA[اولین باری که از این تکنولوژی استفاده شد در برنامه Office 97 بود که خیلی مورد علاقه کاربران قرار گرفت. من اون موقع خیلی گشتم تا بتونم از این امکان استفاده کنم ولی خوب نتونستم ): اما بعدها با پیشرفت کردن علم برنامه نویسی این تکنولوژی در اختیار دیگران هم قرار گرفت. برای همین در [...]]]></description>
			<content:encoded><![CDATA[<p>اولین باری که از این تکنولوژی استفاده شد در برنامه Office 97 بود که خیلی مورد علاقه کاربران قرار گرفت. من اون موقع خیلی گشتم تا بتونم از این امکان استفاده کنم ولی خوب نتونستم ): اما بعدها با پیشرفت کردن علم برنامه نویسی این تکنولوژی در اختیار دیگران هم قرار گرفت. برای همین در اوایل فقط در Office بود که از این امکان استفاده می شد. </p>
<p>حالا اینا رو گفتم اما ببینیم اصلاً Agent چی هست؟<br />
شما اگه از Office استفاده میکنید حالا هر کدوم از برنامه هاش که باشه (Word ،Excel ،FrontPage&#8230;) یک شکلکی رو میبینید که همیشه نسبت به کارهایی که انجام میدین یک سری حرکات از خودش نشون میده که هم سرگرم کننده هست هم آموزنده. حالا حتماً متوجه شدین که در مورد چی صحبت میکنیم (هر چند که میدونم میدونستید (; ) خوب حالا می خواهیم ببینیم که چطور میشه از این امکان تو برنامه های خودمون استفاده کنیم مثلاً وقتی برنامه داره کار میکنه یه شکلکی بیاد برای کاربر ادا در بیاره تا طرف نفهمه که برنامه چیکار میکنه (: یا مثلا موقع ذخیره کردن و بازیابی کردن و یا جستجو و&#8230; یک سری حرکات مربوط به آن عمل انجام بده. </p>
<p>اینکار خیلی ساده است و فقط کافی هست شما یک Agent رو انتخاب کنید و در برنامتون تعریفش کنید و بعد هر کاری که خواستین رو بهش دستور بدین تا براتون انجام بده. ضمنا شما لازم نیست اصلاً غصه درست کار کردن اون رو بخورین چون خود Windows اونو کنترل میکنه که یه وقت کار بدی نکنه ((: </p>
<p>شما نمیتونید که Agent رو داخل یک جعبه مکالمه (Dialog Box) قرار بدین و فقط میتونید جای اولیه اون رو انتخاب کنید بعد نمایش بدین و کاربر میتونه اونو به دلخواه خود تغییر مکان بده با Drag کردن اینکار رو انجام میده. خوب حالا برای شروع کار به یک سری Agent نیاز داریم که البته همراه ویندوز همیشه یک سری همراه هستند بهترین اونها که میتونه کارهای زیادی انجام بده (منظور حالتهای زیادی براش تعریف شده) Merlin هست که یک جادوگر پیر می باشد. برای Download کردن اینها میتونید به سایتهایی که معرفی میکنم یک سری بزنید. ضمناً شما خودتون هم میتونید یک Agent طراحی بکنید که برای اینکار باید از یک سری نرم‌افزار استفاده کنید. </p>
<p>برای اینکه کاربر بتونه از Agent برنامه شما استفاده کنه باید حتماً Microsoft Agent Server‌ رو نصب کنه. که البته من تا حالا تو هر ویندوزی که برنامم رو اجرا کردم نصب شده بوده فکر کنم این برنامه همراه خود ویندوز هست (; ولی اگه نبود شما میتونید یک سری به آدرس زیر بزنید اونجا چیزهای جالبی در این مورد داره که یکم مطالعه کنید بد نیست:</p>
<p>http://www.microsoft.com/msagent</p>
<p>این مطالب تحت عنوان Microsoft Agent Software Development Kit هست که در اونجا شما همچنین میتونید نرم افزار Microsoft Agent Character Editor رو برای درست کردن Agent دریافت کنید. در این مقاله ما در مورد Voice Command‌ (فرمان‌های صوتی) و طراحی Agent صحبت نمیکنیم و فقط طرز استفاده از این امکان رو شرح میدم که خودتون بعداً میتونید در موردش بیشتر جستجو کنید. ما برای کارمون فقط احتیاج به Agent Server و یک کاراکتر داریم. </p>
<p>خوب حالا میریم سر اصل مطلب. بعد از اینکه مطمئن شدین روی ویندوزتون AgentServer رو دارین دلفی رو اجرا کنید و مراحل زیر رو مو به مو انجام بدین:<br />
Component | Import ActiveX Control رو انتخاب کنید.<br />
Microsoft Agent Control رو از تو لیست پیدا کنید و رو ی دکمه Install کلیک کنید.<br />
خوب حالا باید تو قسمت ActiveX یک آیکونی شبیه به MenInBlack داشته باشید.<br />
خوب تا یادم نرفته اینو بگم که برای پیدا کردن یک کاراکتر روی ویندوزتون باید برای acs.* جستجو کنید که البته به طور عادی اگر Agent Server نصب باشه توی شاخه Windows یک msagent باید وجود داشته باشه و داخل اون هم یک شاخه دیگه به نام Char هم هست که توش یک یا چند کاراکتر وجود داره که اگر از XP استفاده میکنید حتماً یکیش Merlin.acs هست (که من خیلی بهش علاقه دارم (: ) برای همین ما باید تو برنامه مون چک کنیم که آیا این شاخه وجود داره یا نه اگه وجود داشت میدونیم که Agent Server روی ویندوز کاربر نصب هست و ما می تونیم از Agent استفاده کنیم. </p>
<p>خوب برای اینکار باید اول ActiveX رو به روی فرم منتقل کنیم با اینکار یک type با نام TAgent به تعاریف فرم اضافه میشه. بعد باید یک متغییر تعریف کنیم که از نوع Boolean باشه تا با اون چک کنیم که آیا Agent Server نصب هست یا نه برای اینکار میشه از Code زیر استفاده کرد: </p>
<p>TYourObject<br />
   private<br />
     AgentInstalled: Boolean;<br />
     function AgentIsInstalled: Boolean;<br />
     procedure CreateAndLoadAgentIfInstalled;<br />
     function GetColorDepth: Word;<br />
     function GetWinDir: String;<br />
     procedure SetFormColor;<br />
     function AgentWasClicked</p>
<p>شما میتونید روی ویندوز کاربر به دنبال اون شاخه و کاراکتری که می خواهید از او استفاده کنید بگردید و اگه بود کار رو باهاش شروع کنید اگه هم نبود خوب دیگه کاربر باید محیط خشک برنامتون رو تحمل کنه (; </p>
<p>حالا مثلاً ما می خواهیم از Merlin استفاده کنیم: </p>
<p>function TYourObject.AgentIsInstalled: Boolean;<br />
begin<br />
   Result := (FileSearch(&#8216;Merlin.acs&#8217;, Format(&#8216;%s\MSAGENT\CHARS&#8217;, [GetWinDir]))<>&#8221;);<br />
end;</p>
<p>function TYourObject.GetWinDir : string;<br />
var<br />
   WinDirZ : array[0..256] of Char; </p>
<p>begin<br />
   GetWindowsDirectory(WinDirZ, SizeOf(WinDirZ));<br />
   Result := StrPas(WinDirZ);<br />
end;</p>
<p>نکته: در بالا برای بدست آوردن نام شاخه ای که ویندوز در آن نصب هست از API استفاده شده که مسیر کامل ویندوز را به ما میدهد. </p>
<p>حال که فهمیدیم کاربر امکان استفاده از Agent رو داره می تونیم کار رو شروع کنیم. در ادامه باید یک Object برای Agent خودمون بسازیم تا از این به بعد از اون استفاده کنیم و مجبور نباشیم از ActiveX استفاده کنیم. برای اینکار از کد زیر میشه استفاده کرد: </p>
<p>implementation</p>
<p>uses<br />
   AgentDemoConsts,<br />
   Registry,<br />
   OLECtrls, AgentObjects_TLB;</p>
<p>procedure<br />
   TYourObject.CreateAndLoadAgentIfInstalled;<br />
const<br />
   RightBias = 80;<br />
   TopBias   = 70;<br />
var<br />
   tp: TPoint;</p>
<p>begin<br />
   if (AgentInstalled) and not (Assigned(RobotAgent)) then begin<br />
      RobotAgent := TAgent.Create(Application);<br />
      RobotAgent.Characters.Load(&#8216;Merlin&#8217;,'Merlin.acs&#8217;);</p>
<p>      { Move the Agent to the center of the screen }<br />
      tp.x := (Screen.Width div 2)-(Width div 2);<br />
      tp.y := (Screen.Height div 2)-(Height div 2);</p>
<p>      with RobotAgent.Characters.Item['Merlin'] do begin<br />
         MoveTo(tp.x+RightBias, tp.y+TopBias, 0);<br />
         Show(0);<br />
         Play(&#8216;Greet&#8217;);<br />
         Play(&#8216;Explain&#8217;);<br />
         Speak(SDemoIntro, &#8221;);<br />
         Play(&#8216;Pleased&#8217;);<br />
         Play(&#8216;RestPose&#8217;);<br />
         Speak(SWhisper, &#8221;);<br />
         Speak(SMonotone, &#8221;);<br />
         Speak(SMap, &#8221;);<br />
      end;<br />
   end;<br />
end;</p>
<p>چند خط اول که مشخص هست چه کار میکنه. اما بعد از اینکه کاراکتر تعریف شد (RobotAgent) اونو به Merlin نسبت میدیم وبعد هم اونو به وسط صفحه نمایش منتقل میکنیم و حالا میرسیم به مهمترین قسمت کار که دستور دهی به Merlin هست. </p>
<p>با استفاده از Play شما میتونید به Agent دستور بدین اما برای هر Agnet دستورات متفاوت هست یعنی ممکن هست که دستوارتی که برای Merlin کار میکنه برای Robby (که یکی دیگر از Agent ها هست) کار نکنه. شما اگه کاراکترتون رو خودتون درست میکنید خوب پس لیست دستوراتش رو دارید اما اگه اونو از جایی Download میکنید حتما لیست دستوراتش هم همراش هست. مثلا شما میتونید در مورد Merlin و یا Robby و یا چند Agent دیگه از تو همون آدرسی که در بالا دادم لیست دستوارتش رو بگیرید. </p>
<p>حالا در کد بالا میبینید که در ابتدا از دستور Show استفاده شده این دستور برای به نمایش در آوردن Agent هست و در تمامی آنها کار میکنه. بعد با استفاده از Play کارهای مورد نظرمون رو به Agent‌ میگیم. مثلاً من در ابتدا با استفاده از دستور Greet از Agent خواستم که سلام کنه و بعد هم با استفاده از Explain خواستم که شروع کنه به گفتن یک سری مطالب که با دستور Speak اونها رو که در متغییر SDemoIntro قرار داده ام به صورت یک بالون که بالای سرش باز میشه میگه. شما برای اینکه بگین مطالب رو با چه حالتهایی بخونه می تونید از دستواراتی که در جدول زیر آوردم استفاده کنید: </p>
<p>Addition Resulting capability<br />
\Chr=&#8221;Whisper&#8221;\ The Agent will whisper the following text.<br />
\Pau=N\ The Agent will pause for the designated number of milliseconds.<br />
\Emp\ The Agent will give special emphasis to the following phrase.<br />
\Chr=&#8221;Montone&#8221;\ The Agent will emphasize nothing at all.<br />
\Map=<spoken text> The Agent will say one thing, and =<spoken text> &#8220;think&#8221; another. </p>
<p>خوب حالا برای اینکه بیشتر متوجه بشین در زیر یک سری مثال آوردم که میتونید اونها رو در برنامه استفاده کنید و نقش هر کدوم از دستوارت رو ببینید: </p>
<p>SFuzzyWuzzy = &#8216;Fuzzy wuzzy was a bear;\Pau=500\ &#8216; +<br />
   &#8216;fuzzy wuzzy had no hair;\Pau=500\  &#8216; +<br />
   &#8216;fuzzy wuzzy wasn&#8217;t very \Emp\fuzzy, \Emp\was he?&#8217;;</p>
<p>SWhisper = &#8216;\Chr=&#8221;Whisper&#8221;\Now I will whisper: &#8216; +<br />
   &#8216;Whisper whisper whisper.&#8217;;</p>
<p>SMonotone = &#8216;\Chr=&#8221;Monotone&#8221;\Now I will speak in a &#8216; +<br />
   &#8216;monotone. Pat Paulsen for President.&#8217;;</p>
<p>SMap = &#8216;\Map=&#8221;I will now continue to speak in &#8216; +<br />
   &#8216;English, but you will see my words &#8216; +<br />
   &#8216;translated into German in the balloon above &#8216; +<br />
   &#8216;my head. How are you today? I am just &#8216; +<br />
   &#8216;\Emp\dandy!&#8221;=&#8221;Jetzt werde ich zwar immer &#8216; +<br />
   &#8216;noch in Englisch reden, sie werden  &#8216; +<br />
   &#8216;aber meine Woerte im Balloon obenauf ins &#8216; +<br />
   &#8216;Deutsch uebersetzt sehen. Wie geht es  &#8216; +<br />
   &#8216;Ihnen heute? Mir geht es ganz gut!&#8221;\&#8217;;</p>
<p>خوب دیگه همین بود تمام ماجرا حالا شما اگه می خواهین بیشتر در این مورد کار کنید من در مقالات بعدی یکی سری سایت و مطلب دیگه هم براتون میزارم البته به زبون اصلی خودشون حتماً خیلی مفید خواهد بود. ضمنا شما میتونید از Event ها هم در Agent استفاده کنید و مثلا برای رویداد OnClick روی Agent‌ یک چیزی تعریف کنید. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/microsoftagentinyourprogram8712110950-1552/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>محدودکردن تغییر اندازه فرم در دلفی</title>
		<link>http://www.irandevelopers.com/programming/restricformssizeindelphi8712110946-1548/</link>
		<comments>http://www.irandevelopers.com/programming/restricformssizeindelphi8712110946-1548/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:16:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1548</guid>
		<description><![CDATA[گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages، تابع WM_GetMinMaxInfo میباشد. unit MinMax; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private [...]]]></description>
			<content:encoded><![CDATA[<div class="articleBody">گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج  از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از  Windows Messages، تابع WM_GetMinMaxInfo میباشد.</p>
<pre class="Code">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;

end.</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/restricformssizeindelphi8712110946-1548/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>استفاده از DLL‌ها در دلفی</title>
		<link>http://www.irandevelopers.com/programming/usedllindelphi8712110945-1546/</link>
		<comments>http://www.irandevelopers.com/programming/usedllindelphi8712110945-1546/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:15:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1546</guid>
		<description><![CDATA[ایجاد یک DLL با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ایجاد یک DLL</strong><br />
با استفاده از منو فایل گزینه New Items را انتخاب کنید و  آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از  روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال  اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید.  باید در فایل DLL بصورت زیر کد نویسی نمایید:</p>
<pre class="Code">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.</pre>
<p>دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره  گردیده است.</p>
<p>حال بر روی فرم موجود تمام دکمه‌ها و آبجکت‌های مورد نظرتان را  اضافه و کد نویسی کنید (اختیاری). در پایان در منو Project گذینه Build DemoDll را  انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dll ایجاد می گردد که برای  استفاده آماده است.</p>
<p><strong>استفاده از یک DLL بصورت دینامیکی</strong><br />
برای  استفاده از یک DLL ‌بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود  است بصورت زیر تعریف نمایید:</p>
<pre class="Code">unit UMain;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, ExtCtrls;

type
TShowdemoFormModal= Function :integer;
.
.
.</pre>
<p>دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره  گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت  زیر کد نویسی کنید:</p>
<pre class="Code">var
hndDLLHandle:THandle;
ShowdemoFormModal:TShowdemoFormModal;

procedure TFMain.Button1Click(Sender: TObject);
begin
   try
      hndDLLHandle:=LoadLibrary('Demodll.dll');

      if hndDLLHandle &lt;&gt; 0 then begin
         @ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal');

         if addr(ShowdemoFormModal) &lt;&gt; nil then begin
            ShowdemoFormModal;
         end
         else
            showmessage ('function not exists ...');
         end
      else
         showMessage('Dll Not Found!');
      finally
         freelibrary(hndDLLHandle);
      end;
end;</pre>
<p>فرم شما آماده اجراست. در پایان متذکر می شوم که استفاده ار روش دینامیکی  در لود کردن DLL ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت  برنامه خواهد شد.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/usedllindelphi8712110945-1546/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>نصب ProgressBar روی StatusBar در دلفی</title>
		<link>http://www.irandevelopers.com/programming/progressbaronstatusbardelphi8712110944-1544/</link>
		<comments>http://www.irandevelopers.com/programming/progressbaronstatusbardelphi8712110944-1544/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:14:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1544</guid>
		<description><![CDATA[بتازگی بعضی از برنامه نویسان میخواهند فرمهایی شبیه فرمهای ویندوز XP بسازند که خاصیت زیبای آن قراردادن ProgressBar روی StatusBar می باشد. انجام این کار بسیار ساده است. برای این کار کافی است بر روی فرم خود یک StatusBar اضافه نمایید حالا در قسمت تعاریف متغیر های عمومی کد زیر را بنویسید: ProgressBar1: TProgressBar; در [...]]]></description>
			<content:encoded><![CDATA[<div class="articleBody">بتازگی بعضی از برنامه نویسان میخواهند فرمهایی شبیه فرمهای ویندوز XP بسازند که  خاصیت زیبای آن قراردادن ProgressBar روی StatusBar می باشد. انجام این کار بسیار  ساده است. برای این کار کافی است بر روی فرم خود یک StatusBar اضافه نمایید حالا در  قسمت تعاریف متغیر های عمومی کد زیر را بنویسید:</p>
<div class="Code">ProgressBar1: TProgressBar;</div>
<p>در ادامه دستورات زیر را در  خاصیت OnCreate فرم خود بنویسید:</p>
<pre class="Code">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;</pre>
<p>حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در  قسمت OnDestroy در Event فرمتان دستور زیر را اضافه نمایید:</p>
<div class="Code">ProgressBar1.free;</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/progressbaronstatusbardelphi8712110944-1544/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>نمایش میزان کپی شدن فایل با ProgressBar در دلفی</title>
		<link>http://www.irandevelopers.com/programming/copyprogressbardelphi8712110943-1542/</link>
		<comments>http://www.irandevelopers.com/programming/copyprogressbardelphi8712110943-1542/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:14:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی و پاسکال]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1542</guid>
		<description><![CDATA[چطور میتوان زمان کپی شدن فایل را با استفاده از 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, [...]]]></description>
			<content:encoded><![CDATA[<div class="articleBody"><strong>چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBar نمایش  داد؟</strong><br />
برای انجام این کار ابتدا بر روی یک فرم یک ProgressBar اضافه کنید سپس  تابع زیر را تایپ کنید:</p>
<pre class="Code">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 &gt; 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;</pre>
<p>در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا  یک دکمه اضافه کرده کد زیر رو اضافه نمایید:</p>
<pre class="Code">procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFileWithProgressBar1('c:\Welcome.exe', 'c:\temp\Welcome.exe');
end;</pre>
<p><strong>چطور می توان زمان کپی شدن فایل را محاسبه و نمایش  داد؟</strong><br />
برای این کار نیز میتوانید از تابع زیر استفاده کنید:</p>
<pre class="Code">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 &gt; 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;</pre>
<p>در این تابغ ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن  هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی  مانده تا کپی کامل فایل بدست می آید.</p>
<div dir="ltr">((t2 &#8211; t1) / min * maxi &#8211; t2 + t1) / 100</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/copyprogressbardelphi8712110943-1542/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

