آموزش زبان دلفی (DELPHI)
#1
Note 
تاریخچه زبان دلفی
دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borlandاز زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsbergدر 15 سال پیش به بازار عرضه کرد.
برنامه نویسی به زبان پاسکال در سالیان سال از استواری و ثبات، زیبایی و ظرافت و البته سرعت بالای کامپایل سود برده است. دلفی هم از این قاعده مستثنی نیست. کامپایلر دلفی ترکیبی از بیش از یک دهه تجربه طراحی کامپایلر پاسکال و معماری بهبود یافته کامپایلر های 32 بیتی است. اگرچه قابلیت های کامپایلرها با گذشت زمان پیشرفت قابل توجهی داشته است ولی سرعت آن چندان کاهش نیافته و همچنان از سرعت بالایی برخوردار است. به علاوه استحکام و قدرت کامپایلر دلفی معیاری برای سنجش دیگر کامپایلر هاست.
در اینجا به بررسی تفصیلی روند حرکتی دلفی در هر یک از نسخه های آن می پردازیم و مشخصات مهم آن را بررسی می کنیم.

تاریخچه زبان دلفی

دلفی در واقع یک کامپایلر پاسکال است. دلفی 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 تبدیل شده است.

stcomputer.ir

پاسخ
#2
Note 
تخصیص خودکار حافظه
وقتی شما از نوع های پایه (Integer ،real ،wordو…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.
[DELPHI]
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}[/DELPHI]

دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.

تخصیص حافظه دینامیکی
در این حالت برنامه نویس احتیاج دارد تا انباره حافظه را شخصا" تخصیص و آزاد کند.

نوع Pointer
اشاره گرها در دلفی می توانند شکل های مختلفی را در برگیرد. نخست، نوع اشاره گری که یک آدرس حافظه را برای نوع ویژه ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed
[DELPHI]
Pointer ()
var
Number : ^Integer;
Name : ^String;[/DELPHI]

دوم، اشاره گرهای بدون نوع. اشاره گرهای بدون نوع (Untyped Pointers) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت هایی مثل اینکه باید به نوع خاصی اشاره (Point) کند را ندارد.
[DELPHI]
var
Something : Pointer;[/DELPHI]

حال اشاره گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه ای تخصیص نمیشود.
[DELPHI]
begin
New(Something);
Dispose(Something);
end;[/DELPHI]

برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:
[DELPHI]
type
IntPtr = ^Integer;

var
Something : Pointer;
begin
Something := New(IntPtr);
Integer(Something^) := 10;
Dispose(Something);
end;[/DELPHI]

تخصیص بلاکی از حافظه
ما می توانیم از اشاره به بلاک هایی از تخصیص حافظه در سیستم استفاده کنیم. این کار را با رویه های GetMemو FreeMemبرای تخصیص و آزاد سازی حافظه استفاده میکنیم.
[DELPHI]
var
Something : Pointer
begin
GetMem(Something, 100);
FreeMem(Something, 100);
end;[/DELPHI]

اشاره به حافظه از قبل تخصیص داده شده:

هر دو نوع اشاره گرها می توانند به هر جایی از حافظه اشاره بکنند. این بدان معناست که آنها می توانند اشاره به فضای اشغال شده با داده هایی که در حال حاضر موجودند داشته باشند. این نمونه اشاره گر احتیاجی به تخصیص حافظه ندارد.
[DELPHI]
var
Something : Pointer;
MyString : PChar; // type PChar = ^Char;

begin
GetMem(Something, 100);
MyString := Something;
StrCopy(Something, 'Hello World’);
FreeMem(Something, 100);
end;
[/DELPHI]


حافظه Heap
Heapشامل قسمتی از حافظه موجود در یک برنامه است که آنرا حافظه پویا می نامیم. Heapبخشی است که در آن تخصیص و تعریف حافظه به صورت تصادفی (Random) اتفاق می افتد. این به آن معناست که اگر شما سه بلاک از حافظه را به طور متوالی تخصیص دهید، می توانید بعد از هر دستور آنرا از بین ببرید. مدیر Heapجزئیات را برای شما نگهداری می کند. بنابراین شما به سادگی می توانید یک حافظه جدید را با GetMemو یا بوسیله صدا زدن constructorهنگام ساختن یک شی درخواست کنید و دلفی به شما یک بلاک جدید را برخواهد گرداند. Heapیکی از سه فضای موجود در برنامه کاربردی را استفاده کرده و دوتای دیگر به صورت فضای یکپارچه (Global) و پشته قرار می گیرند.

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

پاسخ
#3
Note 
نكات مفید كار در محیط دلفی
محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی 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را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.

آرایه ها در دلفی:
دلفی به ما امکان می دهد آرایه هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
[DELPHI]
var
array[indexType1, ..., indexTypen] of baseType;[/DELPHI]

در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
[DELPHI]
d(.i.):= 3 + i; // Equivalent d:= 3 + i;[/DELPHI]

نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
[DELPHI]
var
A : array [Boolean] of integer;
begin
A[True] := 50;
A[False] := 100;
end;[/DELPHI]

نکته: توابع Lowو Highکران های پایین وبالای یک متغییر آرایه ای یا نوعی یا ترتیبی را بر میگردانند:
[DELPHI]
for I := 0 to High(X) do S := S + X;[/DELPHI]

آرایه های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Constتعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
[DELPHI]
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;[/DELPHI]

آرایه های دینامیکی:
آرایه های دینامیکی، آرایه های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
[DELPHI]
var MyFlexibleArray: array of Real;[/DELPHI]

قبل از به کار گیری آرایه های دینامیکی، ابتدا باید از رویه SetLengthبرای تخصیص حافظه آرایه استفاده کرد:
[DELPHI]
SetLength (MyFlexibleArray, 2);[/DELPHI]

نکته: آرایه های دینامیکی همیشه مبتنی بر صفر می باشند.

نکته: شما می توانید آرایه های دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:
[DELPHI]
MyFlexibleArray := nil;
[/DELPHI]
نکته: مقدار حافظه ای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایه ای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص می یابد.

فشرده سازی آرایه ها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید می توانید با استفاده از کلمه کلیدی packedاطلاعات ذخیره شده خود را متراکم کنید:
[DELPHI]
type TNumbers = packed array[1..100] of Real;[/DELPHI]

نکته: استفاده از packedسرعت دسترسی به اطلاعات را کند میکند. در مورد آرایه ای از کاراکترها این مورد سازگارتر می باشد.

آرایه های چند بعدی دینامیکی:
برای تعریف آرایه های چند بعدی دینامیکی، تنها کافی است ...array ofرا در ساختار خود تکرار کنید. به طور مثال:
[DELPHI]
type
TMessageGrid = array of array of string;

var
Msgs: TMessageGrid;[/DELPHI]

این تعریف یک آرایه دو بعدی از رشته ها می باشد. سپس باید به آرایه خود فضا نسبت داد:
[DELPHI]
SetLength(Msgs, I, J);[/DELPHI]

شما می توانید آرایه های چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular) ایجاد کنید. ابتدا رویه SetLengthرا صدا زده و پارامتر بعد اول را بدهید:
[DELPHI]
var
Ints: array of array of Integer;

SetLength(Ints, 10);[/DELPHI]

ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازه های مختلف) تخصیص دهید:
[DELPHI]
SetLength(Ints[2], 5);[/DELPHI]


تغییر Hintبرای هر ستون از DBGridدر دلفی:
ابتدا باید یک عنصر جدید مبتنی بر TDBGridایجاد کنید و رویداد OnMouseMoveرا فراخوانی کنید:
[DELPHI]
type
TMyDBGrid = class(TDBGrid)
published
property OnMouseMove;
end;[/DELPHI]

اگرچه شما در رویداد OnMouseMoveمختصات Xو Yرا بدست خواهید آورد، اما شما باید ستون مورد نظر را پیدا کنید. برای ادامه کار لازم است که سطر زیر را در قسمت protectedقرار دهید:
[DELPHI]
procedure WMMouseMove(var Message : TWMMouse); message WM_MOUSEMOVE;[/DELPHI]

همچنین متغیر های زیر را در قسمت publicاضافه نمایید:
[DELPHI]
MouseRow : integer;
MouseCol : integer;
[/DELPHI]
بنابراین متد WMMouseMoveبصورت ریر خواهد بود:
[DELPHI]
procedure TMyDBGrid.WMMouseMove(var Message : TWMMouse);
var
t : TGridCoord;
begin
t := MouseCoord(Message.XPos, Message.YPos);
MouseCol := t.x;
MouseRow := t.y;
inherited;
end;[/DELPHI]

ما ابتدا فیلدهای XPostو YPosرا از ساختار WMMouseMoveتنظیم میکنیم:
[DELPHI]
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;
[/DELPHI]
حالا مجددا" تعریف زیر را در قسمت publicقرار دهید:
[DELPHI]
HintMouseMessage(Control : TControl; var Message : TMessage)[/DELPHI]

در قسمت OnMouseMoveاز TDBGridنیز فرامین زیر را اضافه نمایید:
[DELPHI]
var
r : TMessage;
begin
Application.HintMouseMessage(self, r);
TWMMouse®.XPos := X;
TWMMouse®.YPos := Y;
Application.HintMouseMessage(MyDBGrid1, r);
end; [/DELPHI]

پاسخ
#4
Note 
چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBarنمایش داد؟
برای انجام این کار ابتدا بر روی یک فرم یک ProgressBarاضافه کنید سپس تابع زیر را تایپ کنید:

[DELPHI]
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;
[/DELPHI]
در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا یک دکمه اضافه کرده کد زیر رو اضافه نمایید:
[DELPHI]
procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFileWithProgressBar1('c:Welcome.exe', 'c:tempWelcome.exe’);
end;[/DELPHI]

چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟
برای این کار نیز میتوانید از تابع زیر استفاده کنید:
[DELPHI]
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;
[/DELPHI]
در این تابع ابتدا زمان اولیه در متغیر t1ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.
[DELPHI]
((t2 - t1) / min * maxi - t2 + t1) / 100[/DELPHI]

نصب ProgressBarروی StatusBarدر دلفی
انجام این کار بسیار ساده است. برای این کار کافی است بر روی فرم خود یک StatusBarاضافه نمایید حالا در قسمت تعاریف متغیر های عمومی کد زیر را بنویسید:
[DELPHI]
ProgressBar1: TprogressBar;[/DELPHI]

در ادامه دستورات زیر را در خاصیت OnCreateفرم خود بنویسید:
[DELPHI]
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;[/DELPHI]

حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در قسمت OnDestroyدر Eventفرمتان دستور زیر را اضافه نمایید:
[DELPHI]
ProgressBar1.free;[/DELPHI]

استفاده از DLLها در دلفی:
ایجاد یک DLL:
با استفاده از منو فایل گزینه New Itemsرا انتخاب کنید و آیتم DLL Wizardرا انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Applicationرا بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demoباشد و بانام UDemo.pasآنرا ذخیره کرده باشید. باید در فایل DLLبصورت زیر کد نویسی نمایید:
[DELPHI]
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.[/DELPHI]

دقت کنید که نام DLLفوق DemoDllمی باشد و با نام DemoDll.dprذخیره گردیده است.
حال بر روی فرم موجود تمام دکمه ها و آبجکت های مورد نظرتان را اضافه و کد نویسی کنید (اختیاری). در پایان در منو Projectگذینه Build DemoDllرا انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dllایجاد می گردد که برای استفاده آماده است.

استفاده از یک DLLبصورت دینامیکی:
برای استفاده از یک DLL بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLLشما موجود است بصورت زیر تعریف نمایید:
[DELPHI]
unit UMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TShowdemoFormModal= Function :integer;
.
.
.[/DELPHI]

دقت کنید که نام برنامه انتخابی پیش فرض Mainو با نام UMain.pasذخیره گشته است. حال برای لود کردن DLLیادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:
[DELPHI]
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;[/DELPHI]

محدودكردن تغییر اندازه فرم در دلفی:
گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages، تابع WM_GetMinMaxInfoمیباشد.
[DELPHI]
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; [/DELPHI]

پاسخ
#5
Note 
سلام مهندس یه سوال دارم؟من میخوام دلفی رو یاد بگیرم!آیا اگر وقتم رو گذاشتم رو این زبان در آینده واقعا میتونه تو کار و شغلم کمکم کنه؟

بلخره باید از این دنیا رفت...پس چه بهتر اگر با دست پر از نیکی و خوبی به سرای باقی بریم!
برای شادی روح رفتگان خودتان و سلامتی خود و خانواده و ظهور حضرت قائم مهدی صاحب الزمان(عج) صلوات شاید هر بار صلوات شما باعث نزدیکی ظهور و برآورده شدن حاجاتمون بشه!
پاسخ
#6
Note 
Emperor نوشته است:سلام مهندس یه سوال دارم؟من میخوام دلفی رو یاد بگیرم!آیا اگر وقتم رو گذاشتم رو این زبان در آینده واقعا میتونه تو کار و شغلم کمکم کنه؟

با یاد گرفتنش که ضرر نمیکنی اما اگر دنبال زبانهای مدرن بری شاید بهتر باشه

***********
پاسخ
#7
Note 
خب ضرر از این که وقتمو میتونستم بزارم رو یه زبان دیگه رو میگم...
خب حالا مثلا چه زبان هایی رو؟
چه زبانی قدرتمنده که بشه باهاش سیستم عامل ساخت؟
سی و اسمبلی رو میدونم بجز اینا...؟

بلخره باید از این دنیا رفت...پس چه بهتر اگر با دست پر از نیکی و خوبی به سرای باقی بریم!
برای شادی روح رفتگان خودتان و سلامتی خود و خانواده و ظهور حضرت قائم مهدی صاحب الزمان(عج) صلوات شاید هر بار صلوات شما باعث نزدیکی ظهور و برآورده شدن حاجاتمون بشه!
پاسخ
ایجاد موضوع جدید   پاسخ به موضوع  

موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Note کتاب آموزش دلفی SOFTAFZAR 0 648 01-09-2012 ساعت 18:17
آخرین ارسال: SOFTAFZAR

کاربرانِ درحال بازدید از این موضوع:   1 مهمان