آموزش دلفی در مجید آنلاین

saalek110

Well-Known Member
منبع:
http://programingc.persianblog.com/
=======================
آموزش دلفی فقط بخاطر پروژه


قسمت اول:

مقدمه:

دلفي زباني شي گرا، رويداد گرا، ويژوال و داراي محيط RAD مي باشد. دلفي علاوه بر ساختن شالوده مستحكم Object Pascal ويژگي توليد ويژوال محصولاتي چون ويژوال بيسيك را نيز ارائه نموده و مزاياي توليد حقيقي را نيز براي برنامه ساز ارائه مي كند.

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

امروزه برنامه نويسان با داشتن ابزار قدرتمند RAD ، Rapid Application Development همچون دلفي قادرند در كوتاه ترين زمان به بهترين شكل نرم افزارهاي تجاري را تهيه كنند.

حال براي شروع به چه چيزهايي احتياج داريم:

ابتدا بايد يكي از جديد ترين نسخه هاي دلفي را روي سيستم نصب كنيم.

در قدم بعد سوالي كه مطرح مي شود اين است كه آيا تا بحال يك زبان ويژوال را تجربه كرده ايد يا نه؟!

در صورتي كه تابحال با يك زبان ويژوال كار نكرده ايد مطلب بعد مي تواند تا حدودي شما را با اين مفهوم آشنا سازد ولي براي شناخت بهتر كتابهايي كه در اين زمينه وجود دارد مي تواند به شما كمك كند.

توجه! حرفه اي ها نخوانند

سه تا از ويژگي هاي بارز زبانهايي مانند دلفي شي گرايي، رويداد گرايي و ويژوال بودن آنها مي باشد.

شي گرايي چيست؟

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

اشيا داراي دو مفهوم Method ، Properties مي باشند. براي تشريح اين دو مفهوم يك شي در دنياي واقعي را در نظر مي گيريم.

براي مثال ماشين را در نظر بگيريد، ماشين ابزاري براي كنترل قسمتهاي مختلف خود دارد مانند كليد چراغ جلو يا كليد برف پاك كن چنين ابزاري شما را ياري مي كنند بدون اينكه از نكات فني و طرز ساخت اينكونه وسايل با خبر باشيد از آنها استفاده كنيد در واقع مشخصات فني هر برف پاك كن در هر ماشين متفاوت مي باشد ولي طرز براه انداختن همه آنها همانند هم است اين ويژگي همانند مفهوم متد در اشيا مي باشد.

همچنين ماشين داراي خصوصياتي است كه نشان دهنده وضعيت آن در يك لحظه زماني مي باشد مانند سرعت اين ويژگي قابل تغيير در ماشين همانند مفهوم Property در اشيا مي باشد.

رويداد گرايي چيست؟

رويدا گراي به اين صورت است كه در نرم افزارهاي جديد مانند Word Pad نرم افزار در حالت عادي در انتظار به سر مي برد تا اينكه اتفاقي كه مربوط به آن باشد رخ دهد در صورت رخداد يك اتفاق سيستم عامل اين رويداد را به برنامه درحال اجرا منتقل كرده و برنامه در حال اجرا به آن عكس العمل نشان مي دهد. به همين دليل در اين گونه زبانها برنامه نويس بايد براي اين رويداد برنامه بنويسد.

ويژوال چيست؟

اتفاق شي گرا شدن برنامه ها برنامه نويسي را به كارهاي روزمره نزديك كرد اما هنوز اين اشيا واقعي به نظر نمي رسيدند و براي رفع اين مشكل برنامه نويسي Visual يا بصري مرسوم شد كه در اينگونه زبانها برنامه نويس اشياي مورد استفاده را مي توانست ببيند و بدين صورت اشيا ملموس تر بودند اكنون VCL هاي دلفي كه به صورت ويژوال طراحي شده اند به شما اين قدرت را مي دهند كه مثلاً يك دكمه را برداشته و روي فرم خود بگذاريد.

---------------------------------------------------------

قسمت دوم:

كاربرد علامت تساوي در دلفي:

در دلفي براي تخصيص عملگر =: استفاده مي شود.
کد:
y:=mx+b
همچنين براي بررسي تساوي از = استفاده مي شود.
کد:
If A=B then Writeln ('A and B are equal')
شكل ديگر استفاده از علامت تساوي در معرفي ثابت ها است.

کد:
Const
    TaxRate = 0.0075
ثابت ها:

براي مقادير خاص كه در برنامه زياد استفاده مي شود مي توان از ثابت ها استفاده كرد كه مثال آن در بالا آمده.

متغييرها:

متغیر در همه زبانها وجود دارد که انواع آن عبارتند از:

b9.gif
------------------------------------------------------

قسمت سوم:

قبل از شروع مطلب اين نكته را متذكر مي شوم كه اين سري مقالات براي افرادي كه آشنايي اوليه با برنامه نويسي و ترجيحاً برنامه نويسي تحت ويندوز دارند مفيد تر مي بلشد چون آموزش جزئيات بيشتر در حوصله اين سري مقالات نمي گنجد.

براي نوشتن كدهاي آزمايشي اين بخش كارهاي زير را انجام بدهيد:

دلفي را اجرا كنيد.

اگر پروژه جديدي به طور خودكار باز نشد، File|New Project را از منوي دلفي انتخاب كنيد.

Project|Options|Linker را انتخاب كنيد، كادر مكالمه Generate Consol Application را انتخاب كنيد، و سپس OK را به وسيله ماوس انتخاب كنيد. اين كار براي دلفي مشخص مي كند برنامه اي كه ايجاد مي كنيد، يك برنامه پنجره دار نيست، بلكه برنامه اي از نوع «پنجرهDos » است.

View|Project Source را انتخاب كنيد، متن اصلي پروژه در پنجره ويراستار قابل رويت خواهد بود. اگر چه اين متن عموماً ويرايش نمي شود، اما در اين حالت بايد اين متن را با متن خودتان جايگزين كنيد. اين يك روش آسان براي ايجاد يك برنامه است

زمانيكه برنامه را اجرا مي كنيد، حاصل آن در پنجره خودش ظاهر مي شود. براي بستن پنجره خروجي، Alt+F4 را فشار دهيد، يا x را از گوشه بالايي پنجره خروجي انتخاب كنيد.

نكته اي كه در اينجا وجود دارد. زماني كه متن قديمي را با متن برنامه خود جايگزين مي كنيد، پروژه را ابتدا با نام جديدي ذخيره كنيد، و يا خط Program پروژه را تغيير ندهيد.

كنترل جريان برنامه:

دلفي دو ساختار براي كنترل جريان برنامه دارد كه به تفصيل به آنها مي پردازيم.

دستور If...Then...Else

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


کد:
program IfDemo;

uses Forms;

var  UserInput : Integer;

begin

Write('How old are you ? ');

ReadLn(UserInput);

If (UseerInput < 1) or (UserInput > 130) Then

WriteLn('You are not telling the truth.')

Else

WriteLn('Being ', UserInput, 'yers old is great!');

WriteLn('Press Enter to Exit program');

ReadLn {To keep the window from closing until you press Enter}

end {InDemo}
در برنامه فوق عبارت بين If...Then در صورتي كه عدد ورودي توسط كاربر كوچكتر از 1 يا بزركتر از 130 باشد برابرTrue شده در نتيجه كد نوشته شده بين Then...Else اجرا مي شود. در غير اين صورت عبارت بعد از Else اجرا مي شود.

درصورتي كه بخواهيم بيش از يك دستور را بين Then...Else و يا بعد ازElse قرار دهيم بايد از يك بلاك استفاده كنيم

بلاك:

مجموعه اي از دستورات كه بين Begin...End واقع مي شوند.

دستور Case...of

همانند دستور If...Then مي باشد ولي با اين تفاوت كه بجاي دو حالت True و False چند حالت را بررسي مي كند. براي تشريح اي ساختار به مثال زير توجه كنيد.
کد:
program CaseDemo;

Uses Forms;

var UserIn : Char;

begin

Write('Type in character followed dy the Enter key: ');

ReadLn(UserIn);

Case UserIn of

'a'    :WriteLn('That is a Small a');

'z','Z':WriteLn('That is a small or capital z')

else

WriteLn('That is a character other than an a, z, or Z.')

end;

WriteLn('Press Enter to exit program');

ReadLn {To keep the window from closing until you press Enter}

end {CaseDemo}
در مثال فوق در صورتي كه مقدار بين Case...of برابر با هر يك از ثابتهاي قبل از علامت :)) باشد، دستور يا بلاك دستورات بعد از علامت :)) اجرا مي شود. همچنين، توجه به اين امر كه يك دستور end در پايان به عنوان پايان بخش دستور Case قرار مي گيرد نيز بسيار مهم است. در ضمن قسمت else نيز در اين ساختار اختياري بوده و مي تواند حذف شود.
 
آخرین ویرایش:

saalek110

Well-Known Member
در این سایت:
http://www.parsa-system.net/More-145.ASPX

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

a1.GIF

پسورد فایل های زیپ شده هم همان طور که در سایت مشخصه این است:
www.parsa-system.net

از فهرست این کتاب عکس گرفتم و در آدرس زیر قرار دادم:
http://saalek110.250free.com/site/a1/fehrest1.htm

اگر مشکل دانلود فایلهای 10 مگائی را ندارید دانلود کنید. فایلها مستقل از همند.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
منبع:
http://www.salarsoft.somee.com/magaleh/m_delphi_component_install.htm
=============================
یک فایل ورد زیپ شده با حجم 400 کیلو.

آموزش نصب کامپوننت در دلفی
 
آخرین ویرایش:

saalek110

Well-Known Member
منبع:
http://www.iritn.com/?action=show&type=news&id=9719
====================================



مدیریت حافظه در دلفی
تخصیص خودکار حافظه
وقتی شما از نوع‌های پایه (Integer ،real ،word و…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.


کد:
type 
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) 
var 
Name : String; {256 Bytes} 
X, Y : Integer; {4 + 4 = 8 Bytes} 
List : array [0..10] of Double; {8 * 11 = 88 Bytes} 
Today : TDay; {1 Byte}
دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.


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

نوع Pointer
اشاره‌گرها در دلفی می‌توانند شکل‌های مختلفی را در برگیرد. نخست، نوع اشاره‌گری که یک آدرس حافظه را برای نوع ویژه‌ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed Pointer).


کد:
var 
;Number : ^Integer 
;Name : ^String
دوم، اشاره‌گرهای بدون نوع. اشاره‌گرهای بدون نوع (Untyped Pointers) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت‌هایی مثل اینکه باید به نوع خاصی اشاره (Point) کند را ندارد.


کد:
var 
;Something : Pointer
حال اشاره‌گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه‌ای تخصیص نمیشود.


کد:
begin 
New(Something); 
Dispose(Something); 
end;
برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:


کد:
type 
IntPtr = ^Integer; 

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

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


کد:
var 
Something : Pointer 
begin 
GetMem(Something, 100); 
FreeMem(Something, 100); 
end;

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


کد:
var 
Something : Pointer; 
MyString : PChar; // type PChar = ^Char; 

begin 
GetMem(Something, 100); 
MyString := Something; 
StrCopy(Something, 'Hello World'); 
FreeMem(Something, 100); 
end;

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


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

=======================================


آموزش دلفی (بخش سوم)

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

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

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

ایجاد فرورفتگی در کد:
بعضی اوقات - که خیلی هم پیش می‌آید - لازم است که یک مقداری از متن را بصورت بلوک شده به جلو و یا عقب ببریم. منظور دندانه دار کردن متن است که به خوانایی برنامه کمک می کند. برای اینکار می تونید از کلید Ctrl +Shift+I برای جلو بردن و Ctrl+Shift+U برای عقب برگرداندن متن بلوک شده استفاده کنید.

پرش به قسمت تعریف یک شی (Object):
ببنید شی مورد نظرتون (از قبیل VCL, Procedure, Function,...) در کجا و چطور تعریف شده می توانید کلید Crtl رو پایین نگه داشته و روی شی مورد نظر Click کنید.

برای تغییر حالت کاراکترها:
شما می توانید یک قسمت از متن (که ممکن است با حروف بزرگ و یا کوچک تایپ شده باشد) را انتخاب کنید و با زدن کلیدهای Ctrl+O+U به ترتیب تمامی حروف کوچک آن قسمت از متن را به حروف بزرگ و تمامی حروف بزرگ آنرا به حروف کوچک تبدیل کنید. برای تعییر حالت یک کلمه نیز میتوانید روی کلمه مورد نظر رفته و کلیدهای Ctrl+K+F برای بزرگ کردن و کلیدهای Ctrl+K+E را برای کوچک کردن حروف آن کلمه بکار برد.

درست کردن ماکرو متنی:
این امکان بسیار مفید است و می تواند بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای Ctrl+Shift+R را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای Ctrl+Shift+R را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید.

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

گذاشتن علامت روی متن:
این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای Ctrl+Shift را نگه دارید و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره‌ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.

ایجاد کلاس مورد نظر:
شما هنگامی که در قسمت Private و یا Public یک type، روال یا تابع درست کردید لازم دارید که قسمتی را برای قرار دادن کدهای مربوط به آن روال یا تابع را ایجاد کنید. برای اینکار شما پس از اینکه نام تابع را تایپ کردید می توانید کلیدهای Ctrl+Shift+C را فشار دهید تا دلفی یک قسمت برای نوشتن کدهای مورد نظرتان ایجاد کند.

ظاهر کردن پنجره Code insight:
شما حتما به اهمیت و مفید بودن این قسمت دلفی واقفید که در هنگام کد نویسی تا چه حد می تواند کارها را راحت کند. بله در هنگام وارد کردن کدها بعد از وارد کردن نام یک کلاس و یا Object با زدن یک نقطه (.) پنجره Code Insight ظاهر می شود. حال در بعضی وقتها شما ممکن است که نقطه را قبلا وارد کرده باشید و یا در مواقع دیگر این پنجره ظاهر نشود. در این صورت برای اینکه پنجره را ظاهر کنید باید دوباره نقطه را وارد کنید ولی راه آسانتری هم وجود دارد و آن اینست که کلیدهای Ctrl+Speacebar را فشار دهید.

ظاهر کردن پنجره Code Parameter:
همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنمای توابع که معمولاً بعد از گذاشتن پرانتز مربوط ظاهر میشود و در مورد پارامترهای لازم می باشد نیز می توانید از کلیدهای Ctrl+Shift+SpaceBar استفاده کنید.

رفتن از قسمت تعریف توابع و روالها به قسمت کد آنها:
همیشه این نیاز وجود خواهد داشت که شما در هنگامی که دارید به دنبال یک روال در قسمت type میگردید بعد از پیدا کردن نام آن می خواهید که خود آن تابع یا روال را نیز ببنید. برای اینکار خوب حتما نام آن را جستجو میکنید ولی یک راه آسانتر اینست که شما روی نام آن تابع قرار گیرید و کلیدهای Ctrl+Shift+Up/Down را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.


=========================================


آموزش دلفی (بخش چهارم)


آرایه‌ها در دلفی
دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
کد:
var 
array[indexType1, ..., indexTypen] of baseType;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.

نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
کد:
d(.i.):= 3 + i; // Equivalent d:= 3 + i;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
کد:
var 
A : array [Boolean] of integer; 
begin 
A[True] := 50; 
A[False] := 100; 
end;
نکته: توابع Low و High کران‌های پایین وبالای یک متغییر آرایه‌ای یا نوعی یا ترتیبی را بر میگردانند:
کد:
for I := 0 to High(X) do S := S + X;

آرایه‌های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته‌ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
کد:
type 
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); 

const 
DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday', 
'Wednesday', 'Thursday', 
'Friday', 'Saturday'); 
var 
Today : TDay; 

begin 
Today := TDay(DayOfWeek(Date) - 1); 
ShowMessage('Today is ' + DayNames[Today] + '!'); 
end;

آرایه‌های دینامیکی:
آرایه‌های دینامیکی، آرایه‌های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
کد:
var MyFlexibleArray: array of Real;
قبل از به کار گیری آرایه‌های دینامیکی، ابتدا باید از رویه SetLength برای تخصیص حافظه آرایه استفاده کرد:
کد:
SetLength (MyFlexibleArray, 2; (
نکته: آرایه‌های دینامیکی همیشه مبتنی بر صفر می باشند.

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


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


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

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

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

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

=================================


آموزش دلفی (بخش پنجم)



تغییر Hint برای هر ستون از DBGrid در دلفی
ابتدا باید یک عنصر جدید مبتنی بر TDBGrid ایجاد کنید و رویداد OnMouseMove را فراخوانی کنید:

کد:
type 
TMyDBGrid = class(TDBGrid) 
published 
property OnMouseMove; 
end;
اگرچه شما در رویداد OnMouseMove مختصات X و Y را بدست خواهید آورد، اما شما باید ستون مورد نظر را پیدا کنید. برای ادامه کار لازم است که سطر زیر را در قسمت protected قرار دهید:


کد:
procedure WMMouseMove(var Message : TWMMouse); message WM_MOUSEMOVE;
همچنین متغیر های زیر را در قسمت public اضافه نمایید:


کد:
MouseRow : integer; 
MouseCol : integer;
بنابراین متد WMMouseMove بصورت ریر خواهد بود:


کد:
procedure TMyDBGrid.WMMouseMove(var Message : TWMMouse); 
var 
t : TGridCoord; 
begin 
t := MouseCoord(Message.XPos, Message.YPos); 
MouseCol := t.x; 
MouseRow := t.y; 
inherited; 
end;
ما ابتدا فیلدهای XPost و YPos را از ساختار WMMouseMove تنظیم میکنیم:


کد:
procedure TForm2.MyDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: 
Integer); 
begin 
if (((dgIndicator in MyDBGrid1.Options) and (MyDBGrid1.MouseCol > 0)) or 
((not (dgIndicator in MyDBGrid1.Options)) and (MyDBGrid1.MouseCol <> -1))) 
and (MyDBGrid1.MouseCol <> OldMouseCol) then begin 
OldMouseCol := MyDBGrid1.MouseCol; 
if dgIndicator in MyDBGrid1.Options then 
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol - 1].FieldName 
else 
MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol].FieldName; 
end; 
end;
حالا مجددا" تعریف زیر را در قسمت public قرار دهید:


کد:
HintMouseMessage(Control : TControl; var Message : TMessage)
در قسمت OnMouseMove از TDBGrid نیز فرامین زیر را اضافه نمایید:


کد:
var 
r : TMessage; 
begin 

Application.HintMouseMessage(self, r); 
TWMMouse(r).XPos := X; 
TWMMouse(r).YPos := Y; 
Application.HintMouseMessage(MyDBGrid1, r); 
end;
همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید

===========================================


آموزش دلفی (بخش ششم)


نمایش میزان كپی شدن فایل با ProgressBar در دلفی

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

کد:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string); 
var 
FromF, ToF: file of byte; 
Buffer: array[0..4096] of char; 
NumRead: integer; 
FileLength: longint; 
begin 
AssignFile(FromF, Source); 
reset(FromF); 
AssignFile(ToF, Destination); 
rewrite(ToF); 
FileLength := FileSize(FromF); 
with Progressbar1 do 
begin 
Min := 0; 
Max := FileLength; 
while FileLength > 0 do 
begin 
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); 
FileLength := FileLength - NumRead; 
BlockWrite(ToF, Buffer[0], NumRead); 
Position := Position + NumRead; 
end; 
CloseFile(FromF); 
CloseFile(ToF); 
end; 
end;
در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا یک دکمه اضافه کرده کد زیر رو اضافه نمایید:

کد:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
CopyFileWithProgressBar1('c:\Welcome.exe', 'c:\temp\Welcome.exe'); 
end;

چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟
برای این کار نیز میتوانید از تابع زیر استفاده کنید:

کد:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string); 
var 
FromF, ToF: file of byte; 
Buffer: array[0..4096] of char; 
NumRead: integer; 
FileLength: longint; 
t1, t2: DWORD; 
maxi: integer; 
begin 
AssignFile(FromF, Source); 
reset(FromF); 
AssignFile(ToF, Destination); 
rewrite(ToF); 
FileLength := FileSize(FromF); 
with Progressbar1 do 
begin 
Min := 0; 
Max := FileLength; 
t1 := TimeGetTime; 
maxi := Max div 4096; 
while FileLength > 0 do 
begin 
BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); 
FileLength := FileLength - NumRead; 
BlockWrite(ToF, Buffer[0], NumRead); 
t2 := TimeGetTime; 
Min := Min + 1; 
// Show the time in Label1 
label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100); 
Application.ProcessMessages; 
Position := Position + NumRead; 
end; 
CloseFile(FromF); 
CloseFile(ToF); 
end; 
end;
در این تابغ ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.

کد:
((t2 - t1) / min * maxi - t2 + t1) / 100


================================


آموزش دلفی (بخش هفتم)


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

کد:
var 
ProgressBarStyle: LongInt; 
begin 
{create a run progress bar in the status bar} 
ProgressBar1 := TProgressBar.Create(StatusBar1); 
ProgressBar1.Parent := StatusBar1; 
{remove progress bar border} 
ProgressBarStyle := GetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE); 
ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE; 
SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE, ProgressBarStyle); 
{set progress bar position and size - put in Panel[2]} 
ProgressBar1.Left := StatusBar1.Panels.Items[0].Width + 
StatusBar1.Panels.Items[1].Width + 4; 
ProgressBar1.Top := 4; 
ProgressBar1.Height := StatusBar1.Height - 6; 
ProgressBar1.Width := StatusBar1.Panels.Items[2].Width - 6; 
{set range and initial state} 
ProgressBar1.Min := 0; 
ProgressBar1.Max := 100; 
ProgressBar1.Step := 1; 
ProgressBar1.Position := 0; 
end;
حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در قسمت OnDestroy در Event فرمتان دستور زیر را اضافه نمایید:
کد:
ProgressBar1.free;

==================================


آموزش دلفی (بخش هشتم)


استفاده از DLLها در دلفی
ایجاد یک DLL
با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید. باید در فایل DLL بصورت زیر کد نویسی نمایید:

کد:
library demodll; 

{ Important note about DLL memory management: ShareMem must be the 
first unit in your library's USES clause AND your project's (select 
Project-View Source) USES clause if your DLL exports any procedures or 
functions that pass strings as parameters or function results. This 
applies to all strings passed to and from your DLL--even those that 
are nested in records and classes. ShareMem is the interface unit to 
the BORLNDMM.DLL shared memory manager, which must be deployed along 
with your DLL. To avoid using BORLNDMM.DLL, pass string information 
using PChar or ShortString parameters. } 

uses 
SysUtils, 
Classes, 
UDemo in 'UDemo.pas' {Demo}; 

{$R *.res} 
procedure ShowdemoForm;stdcall; 
begin 
Demo :=Tdemo.Create(nil); 
demo.Show; 
end; 

function ShowdemoFormModal:integer;stdcall; 
begin 
demo :=Tdemo.Create(nil); 
Result := demo.ShowModal; 
end; 

Exports 
ShowDemoForm, 
ShowdemoFormModal; 
begin 
end.
دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره گردیده است.

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


استفاده از یک DLL بصورت دینامیکی
برای استفاده از یک DLL ‌بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود است بصورت زیر تعریف نمایید:


کد:
unit UMain; 

interface 

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

type 
TShowdemoFormModal= Function :integer; 
. 
. 
.
دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:


کد:
var 
hndDLLHandle:THandle; 
ShowdemoFormModal:TShowdemoFormModal; 

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

if hndDLLHandle <> 0 then begin 
@ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal'); 

if addr(ShowdemoFormModal) <> nil then begin 
ShowdemoFormModal; 
end 
else 
showmessage ('function not exists ...'); 
end 
else 
showMessage('Dll Not Found!'); 
finally 
freelibrary(hndDLLHandle); 
end; 
end;

===================================

آموزش دلفی (بخش نهم)


محدودكردن تغییر اندازه فرم در دلفی
گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages، تابع WM_GetMinMaxInfo میباشد.

کد:
unit MinMax; 

interface 

uses 
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, 
Forms, Dialogs; 

type 
TForm1 = class(TForm) 
private 
{ Private declarations } 
procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo; 
public 
{ Public declarations } 
end; 

var 
Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage); 
Begin 
inherited; 
with PMinMaxInfo(MSG.lparam)^ do 
begin 
with ptMinTrackSize do 
begin 
X := 300; 
Y := 150; 
end; 
with ptMaxTrackSize do 
begin 
X := 350; 
Y := 250; 
end; 
end; 
end; 

end.
 
آخرین ویرایش:

saalek110

Well-Known Member
منبع:
http://libertyir.blogfa.com/
=================

سلام دوستان

بعد یک وقفه طولانی حالا نوبت به آموزش بعدی میرسه . در این قسمت قصد توضیح در مورد کلاس نقاشی یا ( Class TCanvas ) می رسیم .

کلاس نقاشی ( Class TCanvas ) :

در این کلاس متدها و روالهای متعددی وجود دارد ( Function And Procedure ) شما با استفاده از این روالها و دستورات به راحتی می توانید به طراحی و ترسیم بپردازید . این کلاس که معمولا در بخش گرافیک کامپیوتری و ترسیمات مورد استفاده قرار می گیرد امکانات متعددی را برای ایجاد ترسیمات دلخواه و حتی ایجاد کامپوننتهایی با اشکال مختلف در اختیار شما قرار می دهد . و ما در این بخش شما را با اجزای مختلف این کلاس آشنا می سازیم . که به علت فراوانی دستورات و پروسه ها این آموزش را در 3 درس ارائه می دهیم .

درس اول ***


چگونگی استفاده از TCanvas :

این کلاس که از کلاسهای درونی دلفی محسوب می شود معوملا در بعضی از کلاسهای گرافیکی مورد استفاده قرار می گیرد ولی در کل شما در مواردی مانند ترسیمات کامپوننتها و حتی در مواردی همچون آبجیکت های TLabel , TForm , TListBox , .... نیز برای انجام ترسیمات در اختیار شما قرار گرفته است .
در اینجا نوبت به چگونگی دست رسی به این کلاس می رسد :
استفاده درون اشیاء آماده :
اگر از اشیا خود دلفی و یا از کلاسهای دارای این کلاس درونی استفاده می کنید ، می توان گفت که برای دست رسی در اکتر مواقع مشخصه یا Property به نام Canvas در اختیار شما قرار دارد که شما با استفاده از این مشخصه می توانید همانند مشخصه های دیگربه زیر روال ها و متدهای این کلاس دست رسی پیدا کنید . مانند روشهای زیر :
کد:
Label1.Canvas.Refresh();
Image1.Canvas.Refresh();
ListBox1.Canvas.Refresh();
همانطور که در بالا مشاهده می کنید با استفاده از نام یک شی ( Object ) به راحتی می توان به کلاس زیرین نقاشی آن دست پیدا کرد . البته به شرط وجود و توانایی دست رسی به آن .
پس از دست رسی به مشخصه نقاشی ما احتیاج به دست رسی به صفت ها ، مشخصه ها و دستورات درونی مشخصه می باشیم . برای این کار کافیست تا با زدن نقطه پس از نام مشخصه Canvas به لست متدها و روالهای آن دست رسی پیدا کنید . همانند مثال بالا که علامت نقطه با رنگ قرمز مشخص شده است .

ایجاد و ساخت کلاسهای دلخواه :
برای ایجاد کلاسهای دلخواه برای دست رسی به اشیاء و محیطهای دلخواه به صورت زیر عمل می کنیم .
1- ابتدا یک متغییر از نوع کلاس TCanvas تعریف می کنیم . که این متغییر بسته به نیاز ما می تواند سراسری و یا درونی باشد . در اینجا به یک مثال توجه کنید که تا انتها در مراحل بعد نیز با همین مثال پیش می رویم :
کد:
Var 
   ADesktop:TCanvas;
2- پس از تعریف متغییر در اینجا نوبت به ساخت و تخصیص حافظه به متغییر می رسد . توجه کنید که اگر بدون ساخت یک متغییر قصد استفاده از آن را داشته باشید با خطای هین برنامه با پیام عدم درسترسی به محافظه بر خورد می کنید . برای این کار مجدد از کلاس TCanvas استفاد می کنیم . همانند مثال
کد:
Var 
   ADesktop:TCanvas;
begin
  ADesktop := TCanvas.Create;
...
End;
3- در این قسمت می بایست دسته یا دستگیره Handel متغییر را به یک کنترل نصبت بدهیم تا بتوانیم از آن کنترل استفاده کنیم . این کار معمولا با استفاده از Function به نام GetDC صورت می پذیرد . به طور مثال م قصد دست یابی به کنترل دسکتاپ Desktop را داریم تا بر روی آن طراحی انجام دهیم . با توجه به مثال بالا این چنین عمل می کنیم.
نکته : Handel یا HWND ها شماره های خاصه هر کنترل یا پنجره می باشند که سیستم عامل با توجه به آنان به اشیاء دست رسی پیدا می کند . به طور مثال دست گیره صفحه دسکتاپ ( 0 ) صفر و یا برای دستیابی به دستگیره Form1 از Form1.Handel استفاده می کنیم . برای راهنمایی بیشتر می توانید از راهنمای خود محیط دلفی استفاده کنید . کافیست تا کلمه را تایپ کرده و کلیدهای CTRL+F1 را فشار دهید .
کد:
...
ADesktop.Handel :=  GetDC(0);
....
حال کلاس شما آماده برای استفاده می باشد . شما می توانید با استفاده از زیر روالها و متدهای درونی متغییر تعریف شده به طراحی بپردازید .

توجه به این نکته ضروریست که پس از اتمام کار با متغییر حتما فضای اختصاص یافته به متغییر را رها کنید همانند زیر .
کد:
....
ADesktop.free;
End
برای دریافت اینکه چگونه می توانید عملیات ترسیمی را انجام دهید می بایست تا ارسال بعد منتظر بمانید یا اینکه با استفاده از راهنمای مشخصه های خود دلفی با استفاده از کنجاوی خودتان به انجام این کار بپردازید .

تا ارسال بعد منتظر بمانید .
بالا |+| نوشته شده توسط محمود آزادی در جمعه شانزدهم تیر 1385 | موضوع: آموزش دلفی و برنامه نویسی

==============================================


منبع:
http://delphiland.persianblog.com/
======================

هندل؟!

بورلند دلفي - كه آخرين نگارش موجود آن در بازار دلفي 7 است - علاوه بر دستوراتي كه براي كنترل محيط برنامه دارد، براي كنترل اكثر اشياي ويندوز (Windows) نيز امكانات زيادي را در اختيار برنامه نويس قرار مي دهد. از اين ميان امكان دستكاري (Handling) اجزاي برنامه هاي مختلف را مورد مطالعه قرار مي دهيم.

بطوريكه مي دانيد، هريك از اجزايي كه در پنجره هاي مختلف ويندوز مشاهده ميشود و يا حتي آنهايي كه قابل مشاهد نيست، با اعداد صحيح بزرگتر از صفر (Cardinal) و متمايز از هم شماره گذاري مي شوند. به اين اعداد اصطلاحاً هندل (Handle) گفته مي شود. اشيايي مانند Textbox,lable,button,... هركدام هندلي منحصربفرد دارند. اجزا (components) بكار رفته پروژة دلفي شما نيز اگر از فرزندان TWinControl باشد، داراي هندل هستند. در برنامه هاي مختلف مي توان با استفاده ازش هندل يك شئ (object) به داده هاي مربوط به شئ دسترسي يافته و حتي در اغلب موارد مي توان مشخصات مربوط به اشياء را تغيير داد. در مثالي كه خواهد آمد، با استفاده از هندل Desktop ، يك تايمر، گرافيك يا متن دلخواه خود را بر روي آن خواهيم نوشت.

اولين سؤالي كه پيش مي آيد اين است كه هندل محتويات Desktop را چگونه بايد يافت؟! جواب اين سؤال تابع Get Device Context زير است:
کد:
Handle:=GetDC(Hwnd_Desktop);
سپس با اختصاص اين هندل به يك Canvas مي توانيم مانند ساير ترسيمهايي كه در دلفي مي توان انجام داد، بر روي Desktop نيز بنويسيم.
کد:
CustomCanvas.Handle:=Handle;

پس از اينكه با نحوة يافتن هندل آشنا شديم، به بررسي خواص (properties) و روالهايي (Methods) مي پردازيم كه در كلاس TCanvas براي اينكار مهيا است.

Canvas وسيله ايست كه توسط آن مي توان در ظاهر اجزاي ويژوال تغييراتي ايجاد نمود. در زير برخي خواص و روالهاي مربوط به Canvas آورده شده است:


Properties:
کد:
Brush مشخصات مربوط به مساحتها

Pen مشخصات قلم ترسيم

Handle هندل

Pixels رنگ يك پيكسل خاص از تصوير

Font خصوصيات قلم متن

Methods:
کد:
Arc ترسيم كمان

CopyRect كپي قسمتي از تصويربه تصويري ديگر

Creat ايجاد 

Draw رسم يك گرافيك

Ellipse رسم بيضي و دايره

FillRect رنگ كردن يك مستطيل

FloodFill رنگ كردن داخل يك شكل بسته

LineTo رسم خط از نقطة جاري

MoveTo تغيير نقطة جاري

Pie رسم قسمتي از بيضي

Polygon رسم چندضلعي

Rectangle رسم مستطيل

RoundRect رسم مستطيل با گوشه هاي دايروي

TextOut نوشتن متن
حال كه بخشهاي مهم برنامه را شناختيم، به سراغ خود برنامه مي رويم.


برنامه اي براي نوشتن متن روي Desktop

يك برنامه جديد را در دلفي ايجاد كنيد. با دوبل كليك كردن فرم، رويداد (event) مربوط به زمان بار شدن فرم را ظاهر كنيد:
کد:
Procedure TForm1.FormCreate(Sender:TObject);

Begin

End;

كدها را به طرف بالا اسكرول كرده و در قسمت Var و قبل از implementation متغير را معرفي كنيد:
کد:
var

Form1: TForm1;

DesktopCanvas:TCanvas;

implementation

سطرهاي زير را براي ايجاد Canvas و اختصاص هندل بين سطرهاي شروع و پايان پروسيجر FormCreate وارد كنيد:
کد:
DesktopCanvas:=TCanvas.Create;
اين سطر متغير را از نوع TCanvas ايجاد مي كند.
کد:
DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
در اين سطر نيز هندل مختص Desktop را به ترسيم خود نسبت مي دهيم.

حال يك Button به فرم خود اضافه كنيد. آنرا دوبل كليك كرده و كدهاي زير را وارد كنيد:
کد:
DesktopCanvas.Brush.Style:=bsClear;
زمينة (Background) سطح متني كه در سطر بعد مي نويسيم را رنگي نمي كند. اين سطر را اگر حذف كنيد، زمينة متن پاك خواهد شد.
کد:
DesktopCanvas.TextOut(10,10,'This is your text on the Desktop!');
اين سطر موجب مي شود تا به هنگام فشار دادن كليد در برنامه، عبارت This is your text on the Desktop! در گوشة بالا سمت چپ بر روي Desktop شما نوشته شود، البته با قلم و رنگ پيش فرض.

تمام شد! برنامه را مي توانيد Compile و يا اجرا (Run) كنيد. مي توانيد كارهاي ديگري را نيز انجام دهيد، كارهايي مانند آنچه در نرم افزارهاي Desktop Toys يا نرم افزار نگار انجام شده است.

مثلا براي نمايش ساعت جاري مي توانيد يك Timer از صفحة System به برنامة خود اضافه كنيد. تايمر را دوبل كليك كرده و كدهاي زير را براي رويداد ontimer آن اضافه كنيد:
کد:
DesktopCanvas.TextOut(10,40,TimeToStr(Time));
برنامه را بار ديگر اجرا كنيد. حالا شما يك ساعت در گوشه سمت چپ داريد. مي توانيد بيشتر وقت شناس باشيد!

اگر نگران خط خطي شدن Desktop خود شده ايد، اگر برنامه اي در آن گوشه اجرا شود همة متنها پاك خواهد شد.

در پايان يكبار ديگر تمام متن فايل ذكر مي شود تا اگر در درج كدها اشتباهي شده باشد، براحتي اصلاح شود. در پايان لازم به ذكر است كه اين دستورات تقريبا در تمامي نگارشهاي دلفي موجود است و در نگارشهاي 3 و 6 و7 (client/server-proffesional-personal) توسط نگارنده آزمايش شده است.
کد:
unit dsktop_handling;


interface


uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;


type

TForm1 = class(TForm)

Button1: TButton;

Timer1: TTimer;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;

DesktopCanvas:Tcanvas;


implementation


{$R *.DFM}


procedure TForm1.FormCreate(Sender: TObject);

begin

DesktopCanvas:=TCanvas.Create;

DesktopCanvas.Handle:=GetDC(HWND_DESKTOP);

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

DesktopCanvas.Brush.Style:=bsClear;

DesktopCanvas.TextOut(10,10,'This is a text');

end;


procedure TForm1.Timer1Timer(Sender: TObject);

begin

DesktopCanvas.TextOut(10,40,TimeToStr(Time));

end;


end.



Ref:
 
آخرین ویرایش:

saalek110

Well-Known Member
منبع:
http://www.freefard.mihanblog.com/
-----------------------------------------------

نگاه اجمالي بر IDE دلفي(integrated development environment)
به درس دوم آموزش دلفي به صورت آنلاين فري فرد خوش آمديد.(راهنماي برنامه نويسان مبتدي)

نگاه اجمالي بر قسمت هاي مهم و ابزار هايي از integrated development environmen.

IDE دلفي:
براي شروع كار در قدم اول ،يكي از روش ها براي اجرا دلفي انتخاب كنيد Programs | Borland Delphi 7| Delphi 7 از منوي Start.
وقتي كه دلفي اجرا ميشود (حدودا يك دقيقه كامل طول مي كشد،بستگي به كارايي سخت افزار شما دارد) شما در حال حاضر در IDE قرار داريد: رابط كاربر جايي است كه
شما مي توانيد پروژه خود را طراحي،كامپايل(compile) و اشكازدايي(Debugging) كنيد

f9ba3b037b57da3c4b9bdcddb0e8cf75.jpg


IDE دلفي تشكيل شده از چندين پتجره مجزا.

d2e37f17ec1f1bd99937e40afa8076ca.jpg


پنجره اصي كه در بالاي صفحه نمايش قرار گرفته ، شامل منو اصلي ،نوار ازار ها و پلت كامپوننت ها مي باشد. عنوان ، نوار عنوان برابر است با نام دلفي و ورژن آن به علاوه نام پروژه اي كه هم اكنون باز مي باشد.
نوار منو شامل چندين منو مي باشد. كه توضيح مي دهم در باره اين منو ها در جلسات بعد.نوار ابزار فراهم مي كند تعداد زيادي ميانبر براي دسترسي به فرمان ها (به عنوان مثال: اجراي پروژهRun ، ايجاد فرم جديدNew Form .)
براي اينكه متوجه شويد كه يك دكمه مخصوص براي انجام چه كاري مي باشد ، موس را روي آن دكمه براي چند لحظه نگه داريد سپس توضيحات مربوط به آن ظاهر مي شود(ToolTip).
نكته: نوار منو و دكمه ها براحتي قابل دستي كردن هستند(Customizable)(مرتب كردن بر اساس آن چه خود مي خواهيد).پيشنهاد مي كنم آنها را بر اساس كار خود منظم كنيد تا دسترسي به آنها راحتتر باشد.


c66ac4c56868de88d7d2abb3c3ca8956.jpg


كامپوننت؟؟؟
شايد تا كنون با تعداد زيادي آبجكت در ويندوز هاي استاندارد آشنا شده باشيد(مثل: دكمه ها، فيلدهاي حاوي نوشته ،دكمه هاي راديوي ، دكمه هاي چك شونده و غيره ... .
در اصطلاح برنامه نويسي دلفي به چنين آبجكت هايي كامپوننت مي گويند.
كامپوننت ها مورد استفاده در هر برنامه اي كه با دلفي نوشته ميشود. براي قرار دادن يك كامپوننت روي يك پنجره(فرم) كافي است آن كامپوننت را از برگه(پلت) مورد نظر گرفته و در پنجره مورد نظر رها كنيد.
يا اينكه دوبار كليك بر روي آن كامپوننت كنيد.
هر كامپوننت داراي يكسري صفت ها مخصوص به خود مي باشد كه آن صفت ها شما را در طراحي و هنگام اجراي پروژه توانا (قادر) به كنترل آن كامپوننت ها مي سازند

در نسخه Delphi 6 Personal حدود 85 كامپوننت موجود مي باشد كه البته تعداد كامپوننت ها بستگي به ورژن دلفي دارد.
همچنين شما متوانيد به كامپوننت ها ،كامپوننت جديد نيز اضافه كنيد و يا حتي خودتان كامپوننت بنويسيد(در جلسات آتي اشاره ميشود)

هر برگه (پلت) از كامپوننت گروه بندي شده اند بر اساس نياز كار بر به آنها و عمل و خاصييتي كه آن كامپوننت دارد.
مثلا براي كامپوننت هاي رابط كاربر(InterFace) مي توانيد از برگه هاي Standard, Additional كه شامل كامپوننت هايي از قبيل box, button , scroll box مي باشد.
براي ديدن همه كامپوننت ها از يك برگه (پلت) خاص كافي است روي عنوان آن برگه كليك كنيد.
اگر ليست برگه كامپوننت ها قادر به نمايش همه كامپوننت ها ي آن برگه نبود در انتهاي سمت راست آن برگه كليدي جهت نمايش بقيه كامپوننت ها ظاهر مي شود (براي پيمايش)


Object Inspector, TreeView, Form window, Code explorer

e4ca57594a41e89c9dfd9ef3f57d6a90.jpg


هر زماني كه برنامه دلفي را اجرا مي كنيد ، يك پروژه جديد هميشه بوجود مي آيدكه شامل يك پنجره خالي(فرم) مي باشد.
يك برنامه ساده دلفي ،شامل چندين پنجره مي باشد، اين پنجره ها ارجاء داده مي شوند به فرم ها. هر فرمي داري يك نام است مثلا: Form1.
اين فرم ها مي توانند تغيير نام ،تغيير اندازه و مكان ، و يك عنوان جديد به خود بگيرند و داراي دكمه هاي سيستمي(بستن-بيشينه-كمينه)(Close-Minimize-Maximize) باشند يا نباشند.
شما ميتوانيد فرم هاي خود را مانند پنجره هاي استاندارد ويندوز فرض كنيد.

Unit1.pas پنجره ويرايش گر كد ها:

64e7160d023b074b101b9f1a45c48807.jpg

اگر Form1 فعال باشد با زدن كليد F12 پنجره ويرايش گر كد قرار ميگيرد در جلوي همه پنجره هاي ديگر(On Top) (اين پنجره نمايش داده ميشود.
وقتي كه شما طراحي مي كنيد رابط كاربر خود را و استفاده مي كنيد از كامپوننت ها ، دلفي به صورت خودكار كد هاي آبجكت پاسكال آنها را در اين پنجره قرار مي دهد.
بيشتر كدها و خطها به اين پنجره بدون آنكه نياز به نوشتن كدها توسط شما اضافه ميشوند.
اين پنجره (پنجره ويرايش گر كد) كد هاي مربوط به فرم جاري(فعال) (Form1)را نمايش مي دهد.
شما ميتوانيد چندين فايل را در پنجره ويرايش گر كد به طور همزمان باز كنيد.هر فايلي باز مي شود در يك صفحه جديد در پنجره ويرايش گر كد و هر صفحه نمايش داده ميشود با يك سربرگ در بالاي پنجره ويرايش گر كد.

679cf8f90bf99483e36ab00bbb497129.jpg

پنجره Object Inspector (ناظر اشياء)
هر كامپوننت و هر فرمي ، داراي يكسري مشخصه(خصيصه)( properties) مي باشند -به عنوان مثال: رنگ، اندازه ، موقعيت مكاني (Positon) و عنوان-كه اين مشخصه ها را مي توان در محيط IDE دلفي يا در قسمت كد نويسي تغيير داد .
همچنين هر كامپوننت و هر فرمي داراي مجموعه اي از رخداد ها (Events) مي باشند- به عنوان مثال: كليك كردن موس ، فشرده شدن صفحه كليد و ...
هر كامپوننتي رخداد هاي مربوط به خود را داراست
پنجره Object Inspector (ناظر اشياء) مشخصه و رخداد هر كامپوننتي را كه انتخاب شده باشد (در دو برگه نمايش مي دهد) و شما قادر به تغيير مشخصه كامپوننت ها و نوشتن كد براي رخداد ها خواهيد بود.

به عنوان مثال : هر فرمي داري يك عنوان (Caption) (همان عنواني كه در نوار عنوان ظاهر ميشود) مي باشد. براي تغيير اين عنوان از Form1 : در ابتدا فعال كنيد فرم خود را با كليك بر روي آن .
سپس در پنجره Object Inspector مشخصه Caption (عنوان) را پيدا كنيد (البته در برگه Property) ،سمت چپ نوشته شده Caption و در سمت راست(مقدار) مقدار Form1 ثبت شده .
براي تغيير عنوان فرم كافي است مقدار جديد را تايپ كنيد. مثل : My Form يا فرم نخست يا سلام و... . وقتي فشار دهيد كليد Enter ، عنوان فرم شما تغيير پيدا مي كند.

بيشتر مشخصه هاي كامپوننت ها و فرم ها به همين سادگي قابل تغيير هستند .مثلا موقعيت فرم در صفحه قابل جابجايي است با مقدار دادن به دو مشخصه Left , Top كه با مقدار دادان عددي به اين دو موقعيت جديدي براي فرم در نظر گرفته ميشود.

پنجره Object TreeView

44ac09e1823f96e5f28ca83424171fb1.jpg


اين پنجره را در بالاي پنجره Object Inspector (ناظر اشياء) خواهيد ديد. (پنجره Object TreeView تا حد خيلي زيادي ساده و در عين حال كارآمد است).
وقتي كه شما به فرم اصلي خود يك كامپوننت اضافه مي كنيد(مثلا يك دكمه) . شما نحوه رابطه پدر -فرزندي(parent-child) فرم و دكمه (كامپوننت) را در يك نمودار درختي خواهيد ديد .

يكي از مزاياي بزرگ پنجره Object TreeView قابليت drag and drop(گرفتن و رها كردن) كامپوننت ها از يك پدر به پدر ديگر مي باشد(در جلسات بعدي در باره اين مبحث بيشتر توضيح مي دهم).

نكته: پنجره Object TreeView و پنجره Object Inspector (ناظر اشياء) و طراحي فرم ، همگي با هم و مشتركا انجام وظيفه مي كنند. مثلا اگر يك كامپوننت روي فرم خود قرار دهيد و بر روي آن كليك كنيد،
پنجره Object Inspector (ناظر اشياء) مشخصات آن كامپوننت را براي شما فراهم مي كند ، همچنين در پنجره Object TreeView اين كامپوننت را مورد انتخاب قرار مي دهد.


بستن دلفي:

وقتي كار كردن شما با محيط IDE دلفي تمام مي شود (كارتون تموم مي شود) ، انتخاب كنيد File | Exit از منو اصلي.
اگر در پروژه جاري كه باز كرده ايد تغيير ايجاد كرده ايد از شما سوال پرسيده مي شود كه آيا تغييرات ذخيره شود.


پايان بخش دوم

در بخش سوم به توضيح نحوه استفاده از help دلفي و آبجكت پاسكال و رابط كاربر و VCL و .... خواهيم پرداخت.
نوشته شده توسط فری فرد ساعت 16:20 موضوع مطلب :‌ عمومي
 
آخرین ویرایش:

saalek110

Well-Known Member
منبع:
http://www.aachp.ir/post.aspx?no=77
-----------------------------------------------

آشنایی با محیط برنامه نویسی دلفی - ارائه شده توسط مسعود اقالیمی

دلفی با ويژگيهای متعددی چون روند شی گرايی و مبتنی بر فرم، كامپايلر فوق العاده سريع، پشتيبانی از تكنولوژيهای روز برنامه نويسی دنيا، پشتيبانی عالی از بانكهای اطلاعاتی و . . . طرفداران بسياری پيدا كرده است. تا آنجا كه بسياری به حق آن را سريعترين محيط برنامه نويسی توليد برنامه های كاربردی تحت ويندوز می دانند.

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

دلفی يك ابزار بسيار ايده آل است. اما دارای محيط برنامه نويسی بسيار پيچيده ای است كه عناصر بسيار زيادی در آن مطرح هستند. لذا ابتدا محيط اصلی نرم افزار را بررسی مي کنیم:

77.jpg


Form Designer:

يك ابزار ويژوال برای قرار دادن اجزاء ساخت بر روی فرمهاست. در اين ابزار می توان هر يك از اجزاء ساخت را مستقيما با ماوس انتخاب كرد. زماني كه يك شیء كنترلی بسيار كوچك است يا در پشت يك شیء كنترلی ديگر قرار دارد، می توانيم از Object Inspector يا Object Treeview استفاده كنيم.



Object Inspector:

برای اينكه خصوصيات اجزای ساخت يك فرم را در زمان طراحی ببينيم و يا تغيير دهيم از این قسمت استفاده می كنيم. فهرست بالای Object Inspector كه يك منوی كشويی است نوع شیء رانشان می دهد، و امكان انتخاب اجزاي ديگر را فراهم می كند. اگر بر روي Object Inspector راست كليك كنيم از طريق گزينه Arrange می توانيم نوع طبقه بندی خصوصيات اجزا ساخت را تغيير دهيم.



Object Treeview:

تمام اجزای ساخت و اشياء يك فرم را به صورت يك درخت نشان می دهد، و رابطه های آنها را به تصوير می كشد. آشكارترين اين روابط رابطه "والد - فرزند" است. علاوه بر آن روابطی چون "ساخت - جزء زير ساخت"، "مجموعه - عنصر" و روابط خاصی چون "Datasource/Dataset" را نشان می دهد. می توانيم محتوای Object Treeview را برای مستند سازی (Documentation) برنامه چاپ كنيم. براي اينكار پنجره را انتخاب و از فرمان File → Print استفاده می كنيم.



Source Viewer:

اين قسمت ويراستار كد است، كه كدهای خود را بايد از اين قسمت وارد و يا حذف كنيم. هر Unit كه به برنامه اضافه می شود يك تب به اين صفحه اضافه می شود. با كشيدن و رها كردن تب های نشان دهنده نام Unit ها می توانيم ترتيب آنها را تغيير دهيم. با راست كليك روی اين پنجره و انتخاب Properties پنجره Editor Properties ظاهر می شود كه می توان تنظيمات ويراستار را بر اساس آن انجام داد.



‍Code Explorer:

اين پنجره - كه عموما در يك طرف ويراستار قرار دارد - فهرست تمام متغيرها، انواع داده ها و توابع تعريف شده در يك Unit را به همراه ساير Unit هاي موزد استفاده در عبارات USES را نمايش می دهد. برای انواع داده های مركبی مانند كلاسها اطلاعات كاملی چون فهرست فيلدها، خصوصيات و متد ها نمايش داده می شود.



‍Component Pallet:

براي انتخاب اجزاء ساختی كه می خواهيم به برنامه بيفزاييم مورد استفاده قرار می گيرد. پالت Component زبانه های زيادی دارد كه در آينده درباره آنها صحبت خواهيم كرد. با استفاده از زبانه Pallet واقع در Tools → Environment Option می توانيم نمايش اين اجزا ساخت را تنظيم كنيم.
 
آخرین ویرایش:

saalek110

Well-Known Member
با سلام.
در پستهای قبلی یکسری وبلاگ و سایت معرفی کردیم و یک مروری بر حال و هوای دلفی داشتیم.
حالا می خواهیم تمرین را شروع کنیم.
در این آدرس برنامه ای داریم که معدل 10 عدد را محاسبه می کند:
http://www.engin.umd.umich.edu/CIS/course.des/cis400/delphi/average.html
می خواهیم این برنامه را بسازیم.

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

بعد به پنجره کد که نگاه کنید می بینید که کد ما چنین شده:
یعنی در قسمت type ما ابزارهای اضافه شده را مشاهده می کنیم.
البته من یک لیبل و یک باتون هم بعد اضافه کردن 11 edit اضافه کرده بودم.که آنها هم در کد بالا وجود دارد.

کد:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label1: TLabel;
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

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

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

شروع کارهای مرحله دو:
روی دکمه که قبلا روی فرم انداخته بودید دابل کلیک کنید. با این کار می روید به پنجره کد و این کد هم به این پنجره اضافه می شود:
کد:
procedure TForm1.Button1Click(Sender: TObject);
begin

end;
و در قسمت type هم یک خط اضافه می شود.(خط آخر از کد زیر):
کد:
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
که این خط اضافه شده همان طور که می بینید روال کلیک باتون 1 را اعلام می کند.

بعد دابل کلیک باتون می بینید که چشمک زن دقیقا جایی است که باید کد ها را پیست کنید. حالا من از سایت مذکور کدها را پیست می کنم.یعنی این کدها را :
کد:
edit11.text := floattostrf(((strtofloat(edit1.text) +
              strtofloat(edit2.text) + strtofloat(edit3.text) +
              strtofloat(edit4.text) + strtofloat(edit5.text) +
              strtofloat(edit6.text) + strtofloat(edit7.text) +
              strtofloat(edit8.text) + strtofloat(edit9.text) +
              strtofloat(edit10.text)) / 10), ffgeneral, 10, 4);
درست بعد begin باید پیست کنید.

شرح کد:
اولا محاسبه میانگین را همه می دانید که مجموع 10 تا باید باشه تقسیم بر 10 .
دوما این را باید بدانیم که محتوای edit ها از نوع رشته است که باید با تابع مناسب به عدد تبدل بشه که در اینجا به float تبدیل شده. یک تبدیل از عدد به رشته هم داریم در انتها تا در edit11 باز رشته قرار دهیم.
من کد را کمی باز کردم تا متوجه ارتباط پرانتزها بشویم:
کد:
  edit11.text := floattostrf(



                                (
                                        (
              strtofloat(edit1.text) +
              strtofloat(edit2.text) + strtofloat(edit3.text) +
              strtofloat(edit4.text) + strtofloat(edit5.text) +
              strtofloat(edit6.text) + strtofloat(edit7.text) +
              strtofloat(edit8.text) + strtofloat(edit9.text) +
              strtofloat(edit10.text)
                                        )
                            / 10)



          , ffgeneral, 10, 4);

و کل کد من الان چنین است:
کد:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  edit11.text := floattostrf(



                                (
                                        (
              strtofloat(edit1.text) +
              strtofloat(edit2.text) + strtofloat(edit3.text) +
              strtofloat(edit4.text) + strtofloat(edit5.text) +
              strtofloat(edit6.text) + strtofloat(edit7.text) +
              strtofloat(edit8.text) + strtofloat(edit9.text) +
              strtofloat(edit10.text)
                                        )
                            / 10)



          , ffgeneral, 10, 4);
end;

end.

یک نکته اینکه اگر در تا edit اول اگر یادتان برود عدد وارد کنید برنامه خطا می دهد زیرا تابع تبدیل نمی تواند آنرا به عدد تبدیل کند. مثلا در سومی نوشته edit3 و این قابل تبدیل به عدد نیست.
در سایت این شکلی فرمش را تزئین کرده:
average.gif

می بینید که یازدهمین ادیت را زیر دکمه گذاشته و آن جا که نوشته Average of 10 numbers این همان لیبل است. لیبل یا برچسب در اینجا برای نوشتن توضیحی به عنوان شرح برنامه استفاده شده.

خوب برای اینکه کاملا برنامه ما شبیه آن بشه شروع به تغییرات می کنیم.
بروید به پنجره object inspector (اگر روشن نیست از منوی view روشنش کنید) بعد از کومبوباکس(لیست بازشونده) بالای آن لیبل را انتخاب کنید و Caption را به Average of 10 numbers تغییر دهید.
در روی فرم کمی لیبل را با گرفتن اضلاعش و کشیدن بزرگ کنید.
البته الان فونتش کوچکه. بعد تنظیم Caption در همان جا بگردید و فونت را پیدا کنید و دابل کلیک کنید تا پنجره تنظیم فونت باز بشه و فونت را بزرگ کنید.
بعد در object inspector (که بعد این برای راحتی من پنجره صفات می نامم) دکمه(باتون) را انتخاب کنید و Caption آن را به Calculate Average تغییر دهید. فونت آن را هم بزرگ کنید.
بعد در پنجره صفات به سراغ فرم بروید و صفت Color را تغییر دهید.
فرم من این طوری شده:

b1.gif

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

saalek110

Well-Known Member
b2.gif

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

b3.gif

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

b4.gif


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

saalek110

Well-Known Member
در این سایت:
http://www.marcocantu.com/edelphi/
در این قسمت:

Downloading the book and the code

After a tentative publication as HTML, the book is now available in a single file in PDF format. Due to the high download volume I actually had to put the PDF file inside a ZIP (this isn't really smaller but you'll have to save it instead of downloading the material each time). The download of a single PDF for the entire book is bigger, but you'll benefit from having the entire book easily available on your local computer in one file, rather than having to handle multiple chapters with many files for the figures.

So you can download the file Essential Delphi_103.zip (which is almost 1.2 Mbytes). You can also download the source code in edelphicode103.zip (about 200 Kbyes)
.

یک کتاب و یک بسته سورس هست که سورس را دانلود کنید. 200 کیلو است این سورسها.
می خواهیم کمی روی اینها بحث کنیم.
من هم آپلود می کنم سورس ها را که اگر آدرس سایت جابجا شد در تاپیک همیشه باشه.
http://saalek110.250free.com/sources/edelphicode103.zip
 
آخرین ویرایش:

saalek110

Well-Known Member
در این سورسها 5 تا پوشه داریم که شماره 2 ندارد و آخری شماره اش 6 است.
در پوشه اولی 3 تا سورس داریم. که یکی HELLO است که در این پست آنرا بررسی می کنیم.

در پوشه آن 6 تا فایل است قبل این که آن را در محیط دلفی باز کنیم. دو تا از آنها را می شود با یک ادیتور مثل وردپد باز کرد. یکی فایل پروژه را و یکی را هم که فایل سورس است.
وقتی هم که روی فایل پروژه کلیک کنیم تا خود دلفی باز شود کدهای این دو تا را می توانیم ببینیم. اگر کدهای پروژه باز نبود از منوی پروجکت گزینه ویو سورس را بزنید. که کد زیر را خواهیم داشت:
کد:
program Hello;

uses
  Forms,
  Hellof in 'Hellof.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
فعلا در سطحی که ما کار می کنیم دستکاری نمی کنیم آنها را ولی بعدا ممکنه به سراغ اینها هم بیاییم. در 3 خط آخر می بینیم که اپلیکیشن را اینیتیالایز کرده و فرم را بوجود آورده و اپلیکیشن را run کرده.

اما در فایل سورس اینها را داریم:
کد:
unit Hellof;

interface

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

type
  TForm1 = class(TForm)
    BtnHello: TButton;
    procedure BtnHelloClick(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BtnHelloClick(Sender: TObject);
begin
  MessageDlg ('Hello, guys', mtInformation, [mbOK], 0);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  MessageDlg ('You have clicked outside of the button',
    mtWarning, [mbOK], 0);
end;

end.
در قسمت type می بینید که یک فرم و یک دکمه داریم و دو روال هم داریم برای کلیک روی دکمه و کلیک روی فرم.
کدهای این دو روال را هم نگاه کنید و بعد برنامه را اجرا کنید و نتیجه کلیک روی دکمه و فرم را هم ببنید که باعث آمدن یک پنجره کوچک روی فرم اصلی شده و پیام مورد نظر روی آن نوشته شده. نوع آیکون روی این پنجره ها هم یکی اینفورمیشن یعنی اطلاعاتی و دیگری وارنینگ است.

b6.gif



b7.gif


بعد run کردن هم می بینید که دو فایل به پوشه پروژه افزوده می شود که یکی از آنها فایل اگزه پروژه است که بدون نیاز به محیط دلفی قابل اجرا است و می توانید به دوستتان بدهید به عنوان نتیجه کار.
که قبلا هم گفتیم چطور آیکون فایل اگزه را عوض کنید. (منوی پروجکت گزینه آپشن بعد تب اپلیکیشن و تغییر آیکون. یکسری آیکون هم از اینجا می توانید دانلود کنید: اینجا و اینجا.

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


b5.gif


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

saalek110

Well-Known Member
در پست قبلی اولین پروژه پوشه 1 را شرح گفتیم. و در این پست پروژه دومش را شرح می دهیم که HELLO2 است.
خوب. پروژه را باز کنید.
در قسمت type داریم:
کد:
type
  TForm1 = class(TForm)
    BtnHello: TButton;
    procedure BtnHelloClick(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
با نگاه به کد بالا داریم:
ابزارها : یک فرم و یک دکمه
روال ها :
روال کلیک دکمه
روال کلیک فرم
روال تغییر سایز فرم

حال روال ها را کدش را نگاه می کنیم.کد زیر:
کد:
procedure TForm1.BtnHelloClick(Sender: TObject);
begin
  MessageDlg ('Hello, guys', mtInformation, [mbOK], 0);
  BtnHello.Caption := 'Say Hello Again';
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  MessageDlg ('You have clicked outside of the button',
    mtWarning, [mbOK], 0);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  BtnHello.Top :=
    Form1.ClientHeight div 2 -
    BtnHello.Height div 2;
  BtnHello.Left :=
    Form1.ClientWidth div 2 -
    BtnHello.Width div 2;
end;
روال کلیک فرم همان است که در پروژه قبلی بود. یعنی چاپ اینکه (( شما خارج از دکمه کلیک کرده اید.)) . پس بحثی ندارد.

می رسیم به روال کلیک دکمه:
در کد بالا می بینید که نسبت به پروژه قبلی یک خط اضافه شده. این خط:
کد:
  BtnHello.Caption := 'Say Hello Again';
و اینجاست که بحث شیرینی شروع می شود. البته بحث خیلی ساده ای است. همه اش یک جمله است. و آن این که (( شما هم می توانید از پنجره صفات اقدام به تغییر صفتی بکنید و هم با کد نویسی. )) و در یک خط کد بالا داریم بوسیله کدنویسی اقدام به تغییر صفتی از یک ابزار می کنیم. صفت Caption یعنی نوشته روی دکمه را با کد تغییر می دهیم.
نتیجه این کد این است که وقتی برنامه اجرا شود روی دکمه همان چیزی است که قبلا از پنجره صفات تعیین شده ولی با اولین کلیک دکمه روی آن این نوشته را داریم : Say Hello Again .
خیلی ساده است. ولی به سینتکس کمی دقت کنید. کپشن یک صفت از نوع رشته است و با تک کوتیشن این رشته را به آن نسبت داده ایم. بعضی صفات از انواع دیگرند مثل عددی یا بولین(درست - نادرست) . بعدا که با صفات باز کار کردیم با انواع صفت آشنا می شوید.
برای انواع صفات عکس زیر را از این سایت می گذارم تا هم در توضیح صرفه جویی بشه هم ارتباط بهتر بشه. البته بعدا این صفات را شرح می دهیم. فقط نگاهی گذرا بیاندازید.

b8.gif

می رسیم به روال بعدی یعنی روال تغییر سایز فرم:
ببینید داریم راجع به رویدادها صحبت می کنیم. این که کاربر فرم ما را تغییر اندازه دهد برای فرم یک رویداد محسوب می شود. مثلا گسترش یک شهر جزو رویدادهای یک شهر محسوب می شود. باید شهردار شهر(برنامه نویس) از این رویداد مطلع باشد و واکنش مناسبی را قبلا آماده کرده باشد. البته فرم یا دکمه این برنامه چندین رویداد دیگر هم دارد که ما در این پروژه اصلا کدی برایش ننوشته ایم . یعنی با اتفاق افتادن آن رویدادها می گوییم ((بگذار اتفاق بیافتد - برای ما مهم نیست.)) مثلا عبور ماوس از روی دکمه را ما در این پروژه پوشش نداده ایم. چون برایمان مهم نبوده. ولی نوشتن کدی برای آن کار ندارد. مثلا بگوییم اگر ماوس آمد روی دکمه رنگ دکمه عوض شود.

بگذریم. برگردیم به برنامه خودمان.
در روال تغییر ساز چی برای ما مهم بوده در این برنامه؟ اینکه دکمه همواره در وسط فرم باقی بماند و نرود در گوشه فرم.
کدش را هم اگر نگاه بکنید واضح است چی کار کرده. دکمه دو صفت دارد به نام Top و Left که با این دو صفت محل دکمه در روی فرم تعیین می شود. ما می خواهیم دکمه وسط فرم باشد . پس طول و عرض فرم را بخش بر دو می کنیم. اما خود دکمه هم طول و عرض دارد. اگر کمی فکر کنید می فهمید که باید نصف طول و عرض دکمه را کم کنید. برای فهم مطلب فرض کنید که می خواهید میز ناهارخوری را در آشپزخانه دقیقا وسط آشپزخانه بگذارید. Top و Left مختصات گوشه میز است نه وسط آن. پس برای اینکه میز دقیقا وسط آشپزخانه قرار گیرد باید گوشه میز وسط آشپزخانه نباشد بلکه به اندازه نصف اندازه میز به مبدا مختصات(گوشه فوقانی چپ فرم) نزدیک شود.

---------------------------
این پروژه شرحش تمام شد ولی می خواهم رویداد مهمی را بگویم چون می ترسم در سورس های بعدی نباشد و از طرفی رویداد به دردبخوری است و شاید تابحال به آن احتیاج پیدا کرده باشید و آن همان رویدادی است که با دابل کلیک روی فرم باز می شود. پس دابل کلیک کنید روی فرم و ببینید چه رویدادی باز می شود. جواب : FormCreate
حالا این کد را درونش اضافه کنید:
کد:
 BtnHello.Caption := 'i am ready click me.';
و بعد برنامه را اجرا کنید. می بینید که متن روی دکمه همین است. و بعد اولین کلیک میشه همان Say Hello Again .
پس به فایده این رویداد پی بردید . نوعی تنظیمات قبل باز شدن فرم به روی کاربر. پس می دانید که هر تنظیمی که قبل باز شدن فرم می خواهید در فرم بوجود بیاید جایش آنجاست و خیلی چیزهای دیگه که با کمی فکر می خواهید در این قسمت بنویسید. ولی سعی کنید زیاد شلوغ نکنید این قسمت را و برای هر کاری از قسمت مناسبش استفاده کنید. بعدا باز بحث می کنیم بر روی این جور بحث ها.
 
آخرین ویرایش:

saalek110

Well-Known Member
پوشه اول سورسهای ما 3 تا پروژه داشت که دو تا را گفتیم. دیشب هم سومی را پست زدم که فروم خراب بود و ثبت نشد. ولی راستش از سومی زیاد خوشم نیامد. و الان می خواهم یک پروژه دیگر را نقل کنم از یک سایت سورس.
دلیل دیگری که می خواهم این پروژه را نقل کنم اینه که با تمرین دو پروژه بالا دیگه می دانیم قراره در چه محیطی کار کنیم. همان ابزارها و رویدادهای آنها و کدهایی که برای هر رویداد می نویسیم. پس حالا می خواهیم کمی دور و بر خود را نگاه کنیم. منظورم محیط کار دلفی است.

در این پست یک پروژه کنسولی می سازیم. این سئوالی بود که از آرش جان هم در تاپیک هر سوالی راجع به دلفی داری بپرس (استاد دلفی) پرسیده بودم. به ایشان گفتم چرا دلفی کنسول نداره که فرمودند دارد.
اینجا هم بگویم که اصلا این تاپیک بعد ایجاد اون تاپیک ایجاد شد. که اینجا تمرین کنیم آنجا سئوالاتمان را بپرسیم. هر یک از دوستان هم می تواند اینجا هم آموزش دهد هم سئوال بپرسد ولی اگر دیدید آنجا بهتر به جواب می رسید آنجا بپرسید.

می رسیم به پروژه کنسولی:
برای ایجاد یک پروژه کنسولی از منوی فایل new را بزنید و بعد other و بعد در پنجره ای که باز می شود کنسول اپلیکیشن را بزنید.
این سورس را از اینجا من دانلود کردم. و در بین 4 فایل آن اثری از فایل فرم نبود چون اصلا ویندوزی نیست.

اما قبل این که کد سورس را بگذارم اول کدی که با ایجاد یک پروژه کنسولی در بدو امر داریم را می گذارم تا با کد سورس مقایسه شود:
کد:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  { TODO -oUser -cConsole Main : Insert code here }
end.
و این کد سورس دانلود شده:
کد:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
s : String;
begin
Writeln('Enter in a word');
Readln(s);
Writeln('You Typed: ', s);
Writeln('Press Enter to exit');
Readln;
end.

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

saalek110

Well-Known Member
خوب . بحث کنسول را می بندیم و به برنامه نویسی ویندوزی برمیگردیم.
یک آموزش در فروم دیگر هست به نام (( سوالات و آموزش براي مبتدي ها )) که چون به این قسمت آموزش ما می خورد نقل می کنم. در این پست هر چی از این سایت نقل می کنم را داخل کادر نقل قول می گذارم و توضیحات خودم را بیرون کادر ها می نویسم.

دستور اول caption هست
که به صورت زیر نوشته میشه
کد:
caption:=' nevisande soldier';
خوب این اسم بالای فرم رو تغییر میده.
برای تست این نوع دستورات روش من این است که یک پروژه اول می سازم(که دلفی خودش با باز شدنش خودش یک پروژه ویندوزی آماده می کند برای ما ) بعد یک دکمه روی فرم می اندازم. بعد روی دکمه دابل کلیک می کنم و کد را داخل روال کلیک دکمه پیست می کنم و اجرا را می زنم.

با اجرای برنامه بالا می بینیم که نام فرم در تایتل بار فرم عبارت است از Form1 ولی بعد کلیک دکمه میشه nevisande soldier .
شرح: پس اگر صفتی را بنویسیم و نام صاحب صفت موجود نباشد به طور پیش فرض صاحب صفت فرم در نظر گرفته می شود.
ولی قبلا در پروژه های قبلی داشتیم:
کد:
BtnHello.Caption := 'Say Hello Again';
که در کد بالا صاحب صفت دکمه ای به نام BtnHello است.
قبلا یادم رفت بگم. راجع به طرز نام گذاری ابزارها. ببینید 3 حرف اول BtnHello یعنی Btn مخفف همان Button است. این نوع نام گذاری باعث میشه سریع بفهمیم که این ابزار یک Button است و خیلی کمک به خوانایی کد می کند. برای ابزارهای دیگر هم این روش بکار می رود که جدولی دارد که اگر در سایتی دیدم نقل می کنم.
 
آخرین ویرایش:

saalek110

Well-Known Member
به نقل از هر سوالی راجع به دلفی داری بپرس (استاد دلفی)

با تشکر از توضیحات کامل مدیریت تالار

-------------------------------------------

با سلام.
راجع به متغیرها در دلفی توضیحاتی می خواستم.
ما در هر یونیت یک قسمت var داریم که متغیرها را آنجا تعریف می کنیم . آیا نمیشه متغیر را داخل یک روال تعریف کرد؟ یعنی متغیر محلی داشت؟

نقل قول:
نویسنده MnavidM
کد:
unit[COLOR="Orange"] Unit1;[/COLOR]

interface

uses
[COLOR="Orange"]  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;[/COLOR]

type
  [COLOR="Orange"]TForm1[/COLOR] = class([COLOR="Orange"]TForm[/COLOR])
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  [COLOR="Orange"]Form1: TForm1;[/COLOR]

implementation

{$R *.dfm}

end.

در محدوه زیر اگر متغیری یا شی ای را تعریف کنید ، جز آن فورم می شود و طبق دسترسی

که به آن می دهد ، به آن دسترسی خواهید داشت. همان قضیه private و Public .
کد:
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
اگر در قسمت var تعریف کنید ، یک متغیر عمومی می باشد که در هرجا به این یونیت

دسترسی داشته باشید به آن متغیر نیز دسترسی خواهید داشت.
کد:
var
  Form1: TForm1;

حال در هر جا که یک procedure یا function تعریف کنید ، می توانید جداگانه برای آن ها نیز

var داشته باشید و متغیری خصوصی برای آن تابع یا پروسیجر را ایجاد نمایید. مثلا" در رویداد Click یک دکمه می توانیم متغیر های خصوصی خود را نیز داشته باشیم :

کد:
procedure TForm1.Button1Click(Sender: TObject);
var
  num1,num2:integer;
  name, family,address:string;
begin
  num1:=5;
  family:='Borland'
end;
 
آخرین ویرایش:

saalek110

Well-Known Member
از :
http://www.eeuok.com/articles/Delphi/177060.aspx
---------------------------------------------------------------
مقاله :

Dll را دریابید!

Dll مخفف Dynamic Link Library است که استادان سخن از آن با نام کتابخانه پیوندی پویا یاد کرده اند..Dll حقیقتا مشابه یک کتابخانه است بدین صورت که شما کتابهایتان را در کتابخانه قرار می دهید تا بعدا به سهولت آنها را به کار بگیرید یا آنها را در اختیار دیگران قرار دهید Dll هم بر همین اساس در سیستم عامل ویندوز پیاده سازی شده است .با این تفاوت که به جای کتاب توابع خود را در آن ذخیره می کنید .Dll حاوی توابعی است که به منظور خاصی نوشته اید و می خواهید بار ها از آن استفاده کنید و حتی برنامه نویسان دیگر هم می توانند از توابع نوشته شده ی شما استفاده کنند بدون اینکه مالکیت شما بر روی آن توابع نقض شود دقیقا مشابه کتابخانه که هر کسی بنا بر نیاز خود کتابی را از کتابخانه به امانت می گیرد و پس از استفاده، آن را بر می گرداند . تفاوت دیگری که Dll با کتابخانه دارد این است که در آن واحد از یک تابع چند برنامه کاربردی می توانند استفاده کنند این هم به خاطر معماری اشتراک حافظه در سیستم عامل است و محدودیتی در استفاده از تعداد برنامه های تقاضا کننده وجود ندارد مگر اینکه حافظه سیستم جوابگو نباشد. در این مورد فرض کنید که در کتابخانه ای حقیقی به ازای هر درخواست کننده کتاب ک نسخه از کتاب بلافاصله از روی نسخه اصلی چاپ شود و به متقاضی داده شود و سپس نسخه اصلی هم در کتابخانه باقی بماند.

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

Dll ها به خودی خود نمی توانند اجرا شوند و بایستی توسط برنامه های اجرائی (کاربردی ) فراخوانی شوند.
بنابراین Dll روشی کارا برای :
1. استفاده مجدد از کد
2. همکاری بین افراد
3. و توزیع توابع نوشته شده توسط برنامه نویسان می باشد.
4. علاوه بر اینها بسیاری از توابع API دستورات مربوط به خود را فقط از طریق Dll انجام می دهند ( برای مبحث Wide Hook)
بنابراین هر برنامه نویس تحت سیستم عامل ویندوز لازم است تا نحوه نوشتن Dll را بداند . در این مقاله نحوه نوشتن Dll را توسط محیط برنامه نویسی Delphi 7 شرکت بورلند که یکی از بهترین و قوی ترین کامپایلر های موجود است را شرح می دهیم و در مقاله ای دیگر نحوه فرا خوانی Dll را که نوشته ایم توسط یک برنامه ساده نشان می دهیم . بدیهی است این مقاله فقط یک استارت و جرقه می باشد و تسلط کامل بر مبحث به عهده خواننده است.

اما نوشتن Dll:

محیط برنامه نویسی Delphi 7 را اجرا کنید و از منوی File گزینه NEW و سپس گزینه Other را انتخاب کنید .
سپس در پنجره ظاهر شده گزینه Dll Wizard را انتخاب کنید و دکمه Open را کلیک کنید.

eeuok_dllWizard.png

پنجره Code Editor ظاهر می شود .
به اولین خط در این پنجره نگاه کنید . قبلا هنگام نوشتن برنامه های EXE اولین عبارت Program بود اما حالا اولین کلمه library است . Library به کامپایلر می گوید که کد، مربوط به یک پروژه Dll خواهد بود.


بعد از Library یک سری توضیحات با رنگ آبی نوشته شده است که یک یاد آوری برای برنامه نویس می باشد و هیچ ارزش اجرایی ندارد . اگر زحمتی بایتان ندارد خواندن آن برای یک بار هیچ ضرر مالی و جانی به همراه ندارد و بعدا می توانید آن را حذف کنید تا برنامه تان شلوغ نشود.
بعد از آن عبارت USES قرار گرفته است . همچنانکه برنامه نویسان محترم مستحضرید!!! این عبارت یونیت های به کار گرفته شده در برنامه را تعیین می کند . به صورت پیش فرض چند یونیت فرا خوانی شده اند اما بسته به کاری که Dll قرار است انجام دهد می توانید یونیت ها را اضافه و کم کنید .برای مثال در صورتی که یکی از توابع Dll قرار است که با رجیستری کار کند در این صورت به یونیت Registry احتیاج پیدا خواهید کرد و باید آن را در لیست Uses اضافه کنید.
بعد از آن یک راهنمای کامپایلر با رنگ سبز و سپس Begin ,End پروژه قرار دارد .
در Dll هر کاری که می خواهید انجام شود به صورت تابع بنویسید توابع را قبل از begin,End تعریف کنید.همانطور که قبلا گفتم Dll قدرت این را ندارد که به تنهایی اجرا شود و باید توسط یک برنامه کاربردی یا Dll دیگر فرا خوانی شود.
خوب حالا کد نویسی را شروع می کنیم . می خواهیم تابعی بنویسیم که با استفاده از یک message Box کلمه hello را نشان دهد. یادآوری می کنم که هدف ما آشنا کردن شما با ساختار یک Dll است .


eeuok_codeEditor.png

ون می خواهیم از Message Box استفاده کنیم و تابع ShopwMessge در یونیت dialogs است بنابراین این یونیت را به لیست Uses اضافه می کنیم.

قبل از Begin تابع را بدین صورت تعریف می کنیم:

کد:
Function showhello:integer;
Begin
ShowMessage('Hello!');
Result:= 0 ;
End;

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


کد نویسی تمام شد حال یک Dll ساخته ایم . تنها کاری که باقی مانده است ذخیره Dll در مکان دلخواه و سپس کامپایل کردن آن است . از منو ی File گزینه Save As را انتخاب کنید و پس از انتخاب مکان دلخواه برای ذخیره ی پروژه ، در قسمت نام فایل برای پروژه نام مناسبی انتخاب کنید ما دراینجا eeuok را انتخاب کرده ایم .سپس دکمه ی Save را بزنید در پنجره کد عبارت Library eeuok به جای عبارت قبلی نشان داده می شود. برای کامپایل Dll از منوی Project گزینه Compile All project را انتخاب کنید.


eeuok_saveas.png

سالک : کل کد را من می آورم:
کد:
library Project2;

{ 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,
  [COLOR="Red"]dialogs[/COLOR],
  Classes;

{$R *.res}

 Function showhello:integer;
Begin
ShowMessage('Hello!');
Result:= 0 ;
End;
[COLOR="#ff0000"]exports showhello[/COLOR];
begin
end.
حال یک Dll آماده دارید.

==================================
قسمت دوم : استفاده از dll
از :
http://www.eeuok.com/articles/Delphi/179784.aspx
---------------------------------------------------------------

Dll را دریابید! قسمت دوم

در مقاله قبلی یاد گرفتیم که چگونه یک dll بنویسیم .dll ای با یک تابع بانام Showhello نوشتیم که یک messageBox با کلمه hello را نشان داد. در این مقاله نحوه استفاده از این dll را در برنامه یاد می گیریم .
استفاده از توابع نوشته شده در dll ، به وسیله برنامه خود را فرا خوانی dll می گویند . همانند تابع که دارای دو step تعریف و فرا خوانی است dll هم دو جنبه تعریف و فراخوانی دارد تعریف dll مقاله قبلی بود و مبحث این مقاله استفاده از تابع قبلی است که همان جنبه فرا خوانی است .

به دوصورت می توان یک dll را از برنامه فرا خوانی کرد :
1 – فرا خوانی به صورت استاتیک
2 - فرا خوانی به صورت پویا یادینامیک

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

ابتدا فرا خوانی استاتیک را بررسی می کنیم .
Delphi 7 را اجرا کنید و پروژه جدیدتان را با نام دلخواه در مکان دلخواه ذخیره کنید.سپس یک کپی از dll ای را که قبلا ساختید را در پوشه ای که پروژه تان را ذخیره کردید قرار دهید. البته می توانید dll را در پوشه ی ویندوز یا در پوشه ی system32 نیز قرار دهید این یک مسیر پیش فرض برای سیستم عامل است تا فایل ها ی اجرایی را در آنجا جستجو کند.
در پنجره کد ادیتور بعد از uses و قبل از type هدر تابعی را که در dll تعریف کرده اید .

برای مثال ما خط زیر را قرار دهید:
کد:
function showhello:integer ; stdcall; external 'eeuok.dll';


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

است .
External به کامپایلر می گوید که تابع باید از یک dll در حافظه قرار گیرد.در صورتی که dll را در مکانهایی که قبلا گفتم قرار نداده اید ذکر مسیر کامل dll بعد از external ضروری است .


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

ما این کار را در رویداد formcreate انجام دادیم:
کد:
procedure TForm1.FormCreate(Sender: TObject);
begin
showhello;
end;

سالک : روش دوم را در خود سایت بخوانید. روش اول چون خیلی ساده بود و باعث ایجاد تنوع میشد را نقل کردم. ما تابحال 3 نوع برنامه ایجاد کردیم. کنسولی - ویندوزی - و dll ئی . با مقایسه این 3 نوع برنامه و مشاهده تفاوها و شباهتها حالا بیشتر می دانید که هر کلمه معنای چیست. مثل کلمهlibrary (در پروژه dll ئی ) با program در برنامه ویندوزی در خط اول کد پروژه .
همچنین مثل usesکه در کنسولی چنین است:
کد:
uses
  SysUtils;
و در نوع dll ئی داریم:
کد:
uses
  SysUtils,
  dialogs,
  Classes;
البته dialogs را خودمان اضافه کردیم چون قرار بود dll ما مسیج باکس را نمایش دهد که جلوه ای دیالوگی بود.
و در پروژه ای که میانگین 10 عدد را محاسبه می کرد uses چنین بود:
کد:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
آخرین ویرایش:

saalek110

Well-Known Member
منبع:
http://libertyir.blogfa.com/
=================

نكات مفيد براي سريع شدن برنامه هاي نوشته شده با دلفي(10 نكته)



1-سعي كنيد كدها را ساده بنويسيد.اين كار باعث سادگي در خواندن كدها و فهميدن آنها مي شود. از نام هاي با معنا براي متغيير ها و ثابت ها استفاده كنيد.براي مثال: sName,sMessage براي متغيير هاي String iCounter براي متغيير هاي Integer. براي ثابت ها از حروف بزرگ استفاده كنيد.sWARNING براي ثابتهاي String . براي كامپوننت ها (Visual Component Librarry) از اسمهاي پيش فرض استفاده نكنيد. مثل : Edit1,Combo1,Button1. براي كامژوننت ها به اينگونه عمل كنيد مثلا براي دكمه اي button براي جستجو داريم اين نام را انتخاب مي كنيم: BtnSearch

. 2- گذاشتن رهنمود ‍‌‍‍{+O$} يا {Optimization On$} در ابتداي برنامه. با گذاشتن اين رهنمود كامپايلر دلفي موثرتر عمل مي كند. البته بعضي اوقات Debugging (اشكال زدايي) سخت تر انجام مي شود(با فعال بودن اين قسمت): ... شما نميتوانيد يك نقطه BreakPoint روي دستورات بگذاريد

3-ممكن است شما بخواهيد كامپايل كنيد برنامه خود را با پكيچ Run-Time Package. اين كار ميتواند بگيرد فضاي زيادي وقتي كه شما استفاده مي كنيد در برنامه از libraries يكسان. متاسفانه وقتي برنامه خود را ارائه مي دهيد شما نياز به ارائه DLL هاي استفاده در برنامه نيز مي باشيد.

4-هيچ وقت همه فرم ها را در شروع برنامه نسازيد(create) .(اين امر به صورت پيش فرض انجام مي گيرد). براي اينكه اين كار باعث كند شدن لود برنامه مي شود و احتياج به حافظه زياد مي شود. به جاي اين كار به صورت ديناميك فرم ها را خلق كنيد. نكته: براي اينكه فرم ها به صورت خود كار درست نشوند به منو Project رفته گزينه Option را انتخاب كرده وسپس در همان تب اول فرم هايي را كه نمي خواهيد به صورت خود كار درست شوند را به راست منتقل كنيد.

5- به جاي اينكه خودتون به نوشتن توابع سيستمي كنيداستفاده كنيد از توابع API .(در مواقعي كه تابع هاي يكسان وجود دارد). معمولا اين توابع سريعتر عمل مي كنند.

6- وقتي كه برنامه شما داراي عكس مي باشد ابتدا سعي كنيد عكس خود را بهينه كنيد .
وقتي استفاده مي كنيد از فايلهاي bmp مطمئن شويد كه آن عكس در انداره مورد نظر مي باشد و نيازي به قيچي خوردن نيست.
وقتي كه استفاده مي كنيد از فايلهاي GIF آنها را با بهبود بخشيدن به Color Palete با ابزار هاي خاص(در محيط هاي گرافيكي) بهينه سازيد.
وقتي استفاده مي كنيد از فايلهاي JPEG بهتر است از Image Compresion استفاده كنيد.
بهتر است عكس هاي JPEG خود را كه داراي 256 رنگ يا كمتر از 256 رنگ هستند به GIF تبديل كنيد.

7- وقتي مي خواهيد تنها از يك يا دو تابع يا پروسيجر از يك يونيت استفاده كنيد .
تنها همان توابعي كه مي خواهيد را در برنامه خود كپي كنيد و آن يونيت را به يوزز Usesخود اضافه نكنيد.

8-به جاي اينكه از كدها در برنامه خود استفده بهتر است از كامپوننت هاي غير بصري استفاده كنيد.
براي اينكه به كد مورد نظر براحتي مي توانيد دسترسي پيدا كنيد(در كامپوننت هاي).

-اگر در برنامه خود از توابع time-critical(حلقه هاي كه در برنامه شما مهم به نظر مي رسد) استفاده مي كنيد بايد خيلي دقت كنيد.
چيزي كه سريع به نظر مي رسد در كامپيوتر شما ممكن است در كامپيوترهاي ديگر به همان سرعت نباشد. اينجا شما بايد از كد هاي كوچك و قابل اجرا و همچنين سريع است استفاده كنيد
پيشنهاد مي شود از كد هاي اسمبلر(اسمبلي ) استفاده كنيد.

10-تقريبا همه برنامه ها در محاسبات ابتدايي به يك گونه ميباشند .
ساده كردن فرمولها يتان براي سريع تر كردن توابع مي باشد كه يكي از معمولي ترين راه ها براي بهينه كردن برنامه هاست.

منابع: freefard,http://delphi.about.com/,A.Rivaz ,M.Azadi
بالا |+| نوشته شده توسط محمود آزادی در دوشنبه بیست و یکم فروردین 1385 | موضوع:


منبع:
http://www.far30.org/forum/showthread.php?t=117
 

saalek110

Well-Known Member

نکات مفید برای کار با محیط دلفی


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

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

 
آخرین ویرایش:

جدیدترین ارسال ها

بالا