تبليغاتX
برنامه نویسی با دلفی

برنامه نویسی با دلفی

Graphics Device Interface

GDI در دلفی
 

GDI مخفف کلمه Graphics Device Interface و تکنیک رسم گرافیک دو بعدی ویندوز است. این روش متاسفانه روش بسیار کندی برای ترسم گرافیکی میباشد ولی بدلیل اینکه اساس برنامه نویسی گرافیک است یاد گیری آن بعنوان پایه برنامه نویسی گرافیک برای برنامه نویسان لازم به نظر میرسد. اولین نکته قابل توجه در این رابطه این است که نباید سعی کنید از GDI برای ایجاد هر جلوه خیالی گرافیکی استفاده کنید بدلیل اینکه GDI یک تکنیک ابتدایی در گرافیک است . برای استفاده حرفه ای از گرافیک سعی کنید از DirectX , OpenGL و ... بهره بگیرید. اگرچه شما با کمی خلاقیت قادر ید جلوه های ساده را با GDI ایجاد کنید . 

 یکی از کلمات عمومی که در GDI زیاد با آن برخورد خواهید کرد DC (Device Context ) است که نشان دهنده همان ناحیه ای است که ترسیم روی آن صورت میگیرد و در دلفی با TCanvas نشان داده میشود . در واقع DC  محل نشان دادن خروجی توابع گرافیکی است . بنابرین شما میتوانید از برخی توابع ترسیم برای ترسیم در صفحه نمایش یا پرینتر استفاده کنید . نکته دیگری که باید مورد توجه قرار بگیرد این است که توابعی که شما از آن استفاده میکنید توابع گرافیکی استاندارد دلفی بوده و پوششی برای توابع گرافیکی ویندوز است و دلفی آنها را برای ایجاد یک رابط کاربر خوب و مناسب آماده کرده است.

 

برای مشاهده کل مطلب بر روی ادامه مطلب کلیک کنید.


ادامه مطلب

نوشته شده توسط ابراهیم خدائی در چهارشنبه بیست و دوم فروردین 1386 ساعت 2:50 | لینک ثابت |

فایل های INI در دلفی

فایل های INI در دلفی
 

فایل های .INI دارای ساختاری بر اساس فایلهای متنی هستند و برای نگهداری اطلاعات پیکر بندی برنامه های کاربردی استفاده میشوند که هم براحتی بوسیله ما قابل ویرایش هستند و هم بوسیله یک ساختار ساده در هر برنامه ساده قابل دسترسی هستند .

بدلیل اینکه ویندوز داری Registry هست کسانی که از ویندوز استفاده میکنند آشنایی کمی با فایلهای .ini دارند ولی در ویندوز هنوز هم از فایلهای .ini استفاده میشود. مثل Win.ini و System.ini . ویندوز از این فایلها برای ذخیره اطلاعات مهمی از جمله اطلاعات پیکربندی استفاده میکند که براحتی قابل پاک شدن ، ویرایش و دیدن هستند.  بسیاری از برنامه های تحت ویندوز برای ذخیره اطلاعات پیکربندی خود از Registry  استفاده میکنند در حالیکه استفاده از فایلهای .ini هم سریعتر و هم ایمن تر است . یک مثال ساده برای استفاده از فایلهای  .ini ذخیره اندازه ، حالت و موقعیت فرم برنامه شماست . بطور کلی هر چیزی که شما در رجیستری ذخیره میکنید میشود در فایلهای .ini ذخیره کرد .

 

ساختار فایلهای .ini

فایلهای .ini نوعی فایل متنی هستند که به بخشهای محدود به 64 کیلو بایت (Section) تقسیم شدند که هر بخش میتواند دارای چند کلید (Key) باشد و هر کلید میتواند دارای صفر یا چند مقدار (Value) باشد . مثال:

[SectionName]
keyname=value
;comment
keyname=value

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

یک کلید میتواند دارای مقادیری از نوعهای String , Integer , Boolean باشد. دلفی از فایلهایINI در خیلی وضعیتها استفاده میکند. برای مثال فایلهای .SDK نوعی فایل هستند مانند ini ها .

 

 کلاس TiniFile

        دلفی برای ذخیره و بازیابی فایلهای ini. کلاس TiniFile را در اختیار ما قرار داده است. این کلاس در یونیت inifiles.pas  قرار گرفته است. قبل از کار کردن با فایلهای .ini لازم است یک مثال راجع به استفاده از این کلاس ببینیم.

 

uses inifiles;

...

var

  IniFile : TIniFile;

begin

  IniFile := TIniFile.Create('myapp.ini');

          این کد یه فایل .ini ایجاد میکند و این فایل را به myapp.ini  ارجاع میدهد . البته این کد فایل را درون پوشه ویندوز ایجاد میکند ولی بهتر این است که برای ذخیره کردن اطلاعاتی از برنامه فایل .ini را درون پوشه برنامه ایجاد کنید . برای این کار باید آدرس کامل فایل را بنویسید . مثال :                 

IniFile := TIniFile.Create('C:\Hattel\myapp.ini'); 

 

          البته میتوانیم از تابع ChangeFileExt هم استفاده کنیم که در این صورت یک فایل با نام فایل برنامه و درون پوشه برنامه ایجاد میکنیم .

IniFile := TIniFile.Create(
ChangeFileExt(
Application.ExeName,'.ini'));

 

 

 خواندن از فایلهای .ini

 

         کلاس TiniFileچندین متد برای خواندن از فایلهای .ini دارند . متد  ReadString برای خواندن مقدارهای رشته ای از یک کلید استفاده میشود. متد ReadInteger, ReadFloat ومتدهای مشابه برای خواندن مقدارهای عددی استفاده میشوند . همه این متدها یک مقدار پیش فرض دارند که وقتی فایل مورد نظر یا کلید و مقدار مورد نظر موجود نباشد استفاده میشود. مثلا ReadString به این صورت بیان میشود.

 function ReadString(const Section, Ident,
Default: String): String; override;
 Section نام بخش ، Ident نام کلید و Default نشان دهنده مقدار پیش فرض است .

 

 

نوشتن در فایلهای .ini

 

برای هر متد خواندن یک متد متناظر برای نوشتن وجود دارد . مثلا  WriteString, WriteBool, WriteInteger و غیره

فرض کنید میخواهیم برنامه ای بنویسیم که تاریخ آخرین استفاده و آخرین موقعیت فرم برنامه را ذخیره کند . پس لازم است یک فایل.ini  با دو بخش داشته باشیم . یک بخش با نام Date برای ذخیره تاریخ و یک بخش با نام Position برای ذخیره آخرین موقیت برنامه. بخش Date شامل کلید Last و بخش Position شامل کلیدهای Top, Left, width, Height .

کلید Last باید از نوع TDateTime و کلیدهای بخش Position باید از نوع عددی باشند.

 

برای نوشتن برنامه رویداد OnCreate فرم اصلی برنامه را بصورت زیر مینویسیم . (فراموش نکنید در بخش Uses یونیت TIniFiles را اضافه کنبد. )

 

procedure TForm1.FormCreate(Sender: TObject);

var

  MyIniFile  : TIniFile;

  LastDate : TDateTime;

begin

  MyIniFile := TIniFile.Create(

             ChangeFileExt(Application.ExeName,'.ini'));

 

  LastDate := MyIniFile.ReadDate('Date', 'Last', Date);

 

  ShowMessage('This program was previously used on '

                               + DateToStr(LastDate));

 

  Form1.Top := MyIniFile.ReadInteger

               ('Position','Top', Form1.Top);

  Form1.Left := MyIniFile.ReadInteger

                ('Position','Left', Form1.Left);

  Form1.Width := MyIniFile.ReadInteger

                 ('Position','Width', Form1.Width);

  Form1.Height := MyIniFile.ReadInteger

                  ('Position','Height', Form1.Height);

 

  MyIniFile.Free;

end;

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

 

          برای ذخیره شدن آخرین تاریخ و موقیت فرم ، رویداد OnClose فرم اصلی برنامه را به این صورت مینویسیم :

 

procedure TForm1.FormClose

           (Sender: TObject; var Action: TCloseAction);

var

  MyIniFile  : TIniFile;

begin

  MyIniFile := TIniFile.Create(

             ChangeFileExt(Application.ExeName,'.ini'));

 

  MyIniFile.WriteDate('Date', 'Last', Date);

 

  With MyIniFile, Form1 do

  begin

    WriteInteger('Position','Top', Top);

    WriteInteger('Position','Left', Left);

    WriteInteger('Position','Width', Width);

    WriteInteger('Position','Height', Height);

  end;

 

  MyIniFile.Free;

end;

           این کد باعث میشود در هنگام بسته شدن برنامه تاریخ و موقعیت فرم در فایل .ini ذخیره شود.

         

 

کار کردن با بخشها

          چندین متد برای کار کردن با بخشها طراحی شدند. برای مثال متد EraseSection یک بخش را بطور کامل از فایل ini حذف میکند. متد های ReadSection نام کلیدهای یک بخش و متد ReadSections نام بخشهای یک فایل را در یک TStringList قرار میدهد. کلاسهای دیگری هم در یونیت Registry وجود دارند از جمله TRegIniFile برای دسترسی ساده به سیستم رجیستری ویندوز بصورت فایلهای ini که استفاده از آنها ساده است.

 

محدودیتها و راه حل ها

          بدلیل اینکه کلاس TIniFile از Windows API استفاده میکند یه محدودیت 64 کیلو بایتی به فایلهای ini تحمیل میشود. در صورتی که احتیاج دارید اطلاعاتی بیشتر از 64 کیلو بایت در فایل ذخیره کنید باید بجای استفاده از TIniFile از TMemIniFile استفاده کنید که در این صورت مشکل محدودیت 64 کیلو بایتی را ندارید.


نوشته شده توسط ابراهیم خدائی در چهارشنبه پانزدهم فروردین 1386 ساعت 2:47 | لینک ثابت |

ساختار رکوردها در دلفی

ساختار رکوردها در دلفی

یک ساختار تعریف شده در پاسکال موضوعی تحت عنوان record می‌باشد. رکوردها را می‌توان یک نوع داده که خود شامل چندین نوع داده دیگر است در نظر گرفت. برای تعریف رکوردها بصورت زیر عمل می‌کنیم:

type recordTypeName = record
   fieldList1: type1;
   ...
   fieldListn: typen;
end


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

type
   TDateRec = record
   Year: Integer;
   Month: (Jan, Feb, Mar, Apr, May, Jun, 
               Jul, Aug, Sep, Oct, Nov, Dec);
   Day: 1..31;
end;

var
   Record1, Record2: TDateRec;


هنگام کار با یک رکورد برای دستیابی به میدان‌های آن، از نماد نقطه استفاده میکنیم:

Record1.Year := 1904;
Record1.Month := Jun;
Record1.Day := 16;


همچنین می‌توان یک رکورد را در یک رکورد دیگر کپی کرد بدون اینکه با خطائی مواجه شویم. شما همچنین می‌توانید متغییرهای از نوع رکوردهای خود را به صورت مستقیم تعریف کنید:

var S: record
   Name: string;
   Age: Integer;
end;



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

type
   TPartType = (ptComputer, ptMonitor, ptComponent);
   TPart = record
      PartNumber : String[15];
      Description : String[30];
      Price : Double;

      case PartType : TPartType of
         ptComputer: (CPU : String[10]; Speed : String[10]; HardDrive : String[10]);
         ptMonitor: (VideoType : String[10]; Size : String[5]; DotPitch : String[5]);
         ptComponent: (Internal : Boolean; Specs : String[29]);
end;


این تعریف به کامپایلر می گویید که تنها یکی از متغییرهای مجموعه case را برای استفاده در هر رکوردی انتخاب کند. این یک راهکار بسیار خوب برای استفاده از حافظه می باشد؛ زیرا حافظه یکسانی برای هر مجموعه‌ای از متغییرها در نظر گرفته می‌شود.

بایت نام متغییر نام متغییر نام متغییر
0 PartNumber
15 Description
45 Price
53 PartType
54 CPU VideoType Internal
55 Specs
64 Speed Size
69 DotPitch
74 HardDrive


دسترسی به یک بایت
بعضی مواقع، هنگامیکه با یک API خارجی کار می‌کنید، احتیاج دارید که اطلاعاتی از نوع Word یا Longint را به نوع‌های دلخواه بشکنید. به عنوان مثال TMSF را بصورت زیر در نظر بگیرید:

Most Significant Byte Least Significant Byte
Unused Frames Seconds Minute

ساختار TMSFRec رو بصورت زیر تعریف می‌کنیم:

type
   TMSFRec = record
      Minutes : Byte;
      Seconds : Byte;
      Frames : Byte;
      Dummy : Byte;
end;

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

begin
   MinuteLbl.Caption := IntToStr(TMSFRec(Position).Minutes);
   SecondLbl.Caption := IntToStr(TMSFRec(Position).Seconds);
   FrameLbl.Caption := IntToStr(TMSFRec(Position).Frames);
end;

در مثال قبل، Position متغییری از نوع Longint می‌باشد.
نوشته شده توسط ابراهیم خدائی در چهارشنبه پانزدهم فروردین 1386 ساعت 2:45 | لینک ثابت |

آرایه ها در دلفی

آرایه ها در دلفی
 
دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:

var
   array[indexType1, ..., indexTypen] of baseType;


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

نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:

d(.i.):= 3 + i; // Equivalent d[i]:= 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[I];


آرایه‌های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت 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);

نوشته شده توسط ابراهیم خدائی در چهارشنبه پانزدهم فروردین 1386 ساعت 2:43 | لینک ثابت |

استفاده از 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;

فرم شما آماده اجراست. در پایان متذکر می شوم که استفاده ار روش دینامیکی در لود کردن DLL ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت برنامه خواهد شد.

نوشته شده توسط ابراهیم خدائی در سه شنبه چهاردهم فروردین 1386 ساعت 20:31 | لینک ثابت |

انواع متغیر ها در دلفی

انواع متغیر ها در دلفی:

Windows Data Type

Object Pascal Data Type

Description

LPSTR

PAnsiChar

اشاره گر رشته

LPCSTR

PAnsiChar

اشاره گر رشته

DWORD

Longword

عدد کامل

BOOL

LongBool

مقدار بولي

PBOOL

^BOOL

اشاره گر به مقدار بولي

PByte

^Byte

اشاره گر به مقدار بايت

PINT

^Integer

اشاره گر به مقدار صحيح

PSingle

^Single

اشاره گر به مقدار مميز شناور

PWORD

^Word

اشاره گر به مقدار 16 بيتي

PDWORD

^DWORD

اشاره گر به مقدار 32 بيتي

LPDWORD

PDWORD

اشاره گر به مقدار 32 بيتي

UCHAR

Byte

مقدار 8 بيتي

PUCHAR

^Byte

اشاره گر به مقدار 8 بيتي

SHORT

SmallInt

عدد کامل 16 بيتي با علامت

UNIT

Longword

عدد کامل 32 بيتي بيعلامت

PUNIT

^UNIT

اشاره گربه مقدار عدد کامل32 بيتي بيعلامت

ULONG

Cardinal

عدد کامل 32 بيتي بيعلامت

PULONG

^ULONG

اشاره گر به مقدار عدد کامل 32 بيتي بيعلامت

PLongint

^Longint

اشاره گر به مقدار 32 بيتي

PInteger

^Integer

اشاره گر به مقدار 32 بيتي

PSmallInt

^SmallInt

اشاره گر به مقدار 16 بيتي

PDouble

^Double

اشاره گر به مقدار دابل

LCID

DWORD

شناسه محلي

LANGID

Word

شناسه زبان


نوشته شده توسط ابراهیم خدائی در سه شنبه چهاردهم فروردین 1386 ساعت 20:24 | لینک ثابت |

مدیریت حافظه در دلفی

تخصیص خودکار حافظه

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


نوشته شده توسط ابراهیم خدائی در سه شنبه چهاردهم فروردین 1386 ساعت 20:23 | لینک ثابت |

منوی اصلی

صفحه نخست
آرشيو وبلاگ
پروفایل مدیر وبلاگ
عناوین مطالب وبلاگ
درباره دلفی
نكات مفيد براي كار در محيط دلفي
دلفی NET.
مقدمات دلفی
برنامه ها‎ ‏و مثالهای‎ دلفی
کامپوننتهای دلفی

درباره ی ما


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

با تشکر: ابراهیم خدائی

پیوند های روزانه

آرشیو

پیوند های وبلاگ

دانشگاه نبی اکرم (ص)
سايت اختصاصي كامپيوتر ورودی 85
سازمان فناوری اطلاعات و ارتباطات
وزارت علوم و تحقیقات و فناوری
سازمان سنجش آموزش کشور
سایت دکتر مهدوی
قالب وبلاگ
جستجوگر قالب وبلاگ

آخرین پست ها

سری جدید کامپوننت برای دلفی 7
کدها ومثالها و ترفندهای دلفی
دانلود کامپوننت
5 کامپوننت برای دانلود
آموزش نصب انواع کامپوننتها در دلفی
کار با تلفن و مودم با استفاده از کامپوننت KDTele
راهنما
الگوريتم تبديل تاريخ ميلادي به تاريخ شمسي همراه با کد کامل آن به زبان دلفی
بخشی از ويژگيهای جديد Borland Developer Studio 2006
Graphics Device Interface
Borland Developer Studio 2006 (دلفی 2006)
بورلند استودیو در یک نگاه
فایل های INI در دلفی
ساختار رکوردها در دلفی
آرایه ها در دلفی
استفاده از DLL در دلفی
انواع متغیر ها در دلفی
مدیریت حافظه در دلفی
گزارش از دلفي 9- Delphi 2005
حركت از دلفي به دلفي NET.
تكنولوژي NET.
تاریخچه دلفی
نكات مفيد براي كار در محيط دلفي
سال خوک

RSS

POWERED BY
BLOGFA.COM

کلیه ی حقوق مادی و معنوی وبلاگ ebrahimkhodaei محفوظ می باشد.
طراحی شده توسط یاس تم