تبليغاتX
.:: ترفنــــــدهای خفن،آموزش و غیره ::.

.:: ترفنــــــدهای خفن،آموزش و غیره ::.

آموزش ویژوال بیسیک و مطالب خواندنی

نوشتن کامپوننت

در نوشتن یک کامپوننت به چند روش میشه عمل کرد که ما فعلا به این مبحث نمی پردازیم و فقط از این مطلب به صورت گذری عبور می کنیم . اگر خدا بخواد بعدا یه مطلب مفصل تر در مورد کامپوننت نویسی ارائه می کنم . 1-1 - برای این کار می توانید وارد منوی Component در دلفی شده و گزینه New Component رو که با شکل( Icon) چرخ دنده مشخص شده انتخاب کنید . 1-2- از پنجره باز شده یک کلاس از کلاسهای مورد نظر را انتخاب کنید و یک نام جدید برای کلاس خودتان انتخاب و وارد کنید نکته : معمولا در مرحله اول نوشتن یک کامپوننت بدین شکل عمل می کنند که در اینجا نیز یک کلاس پدر قائل میشویم و معمولا نام را با کلمه Custom شروع می کنیم به طور مثال برای ساخت کامپوننتی با انشعاب از کلاس TLabel با نام TSuperLabel بدین شکل عمل می کنیم (TCustomSuperLabel ) بدین شکل اگر خواستیم انشعاب دیگری از کلاس TSuperLabe بگیریم با استفاده از کلاس (TCustomSuperLabel ) عمل می کنیم یا اگر تغییری خواستیم اعمال کنیم در کلاس (TCustomSuperLabel ) اعمال می کنیم . 1-3 - پس از ست کردن تمام گزینه های پنجره برای ساخت کامپوننت گزینه Install را زده و اجازه ساخت را صادر می نمایید . در پنجره بار شده نام پکت جدید یا دلخواه خود را وارد نمایید گزینه OK را کلیک کنید . 1-4 - در پنجره ایجاد شده شما قسمتهای مختلف پروژه رو می بینید که با نام پروژه آغار گردیده و تا( END همراه با نقطه ) ادامه دارد. unit QCustomSuperLabel; interface uses (0) SysUtils, Classes, Controls, StdCtrls; type TCustomSuperLabel = class(TLabel) { | TCustomLabel} (1) {Other Objects Or Important Calss} {ابجکتها ویا کلاسهای مورد استفاده در کلاس } protected (2) {Protected declarations } {در این بخش صفت ها ، توابع و روالهای محافظت شده را ایجاد می کنید } private (3) { Private declarations } {در این بخش توابع و روالهای مخصوص همین کلاس را ایجاد می کنید } public (4) { Public declarations } {در این بخش صفت ها ، توابع و روالهای سراسری را ایجاد می کنید } published (5) { Published declarations } {در این بخش صفت ها ، توابع و روالهای سراسری را ایجاد می کنید } end; procedure Register; (6) implementation procedure Register; begin RegisterComponents({نام تب دلخواه ->} 'Shid', [TCustomSuperLabel]); (7) end; end. 0 ) دقت کنید در این بخش مبایست نام یونیت (Unit) که شئ ما از آن مشتق شده را ذکر کنیم . البته معمولا اتوماتیک اضافه می شود . 1 ) در این قسمت نام شئ جدید را درج میکنید و بعد کلمه کلاس (Class) نام کلاسی که قرار است شئ ما از آن مشتق شود را درج می کنیم به عبارتی کلاس شئ پدر 2 ) در این بخش صفت ها ، توابع و روالهای محافظت شده را ایجاد می کنید . بدین معنی که با درج نام توابع و روالها در این قسمت به شما این اجازه را می دهد که از این توابع و روالها تنها در کلاس های فرزند برای ایجاد شئ ( Object ) جدید استفاده شود و در مابقی عملیات ها اجازه تغییر برای افراد دیگه وجود نداره ونمی توانند آنها را تغییر یا جای گزین کنند . 3 ) در این بخش توابع و روالهای مخصوص همین کلاس را ایجاد می کنیم . بدین معنی که در توابع و اشیاء جدید دیگر امکان دست رسی وجود ندارد . 4 ) در این بخش صفت ها ، توابع و روالهای سراسری را ایجاد می کنید . با درج توابع در این قسمت اجازه دست رسی به توابع و روالها و صفت ها را در تمام پروژه طادر می کنیم . 5 ) در این بخش مصفتها را درج میکنیم (اشتباه نکنید در این بخش توابع و پروسه ها را نمی توان نوشت بلکه ازآنها در ساخت وایجاد صفات استفاده می کنیم .) 6 ) این یک تابع برای ساخت و ایجاد پروژه است . که با فراخوانی آن پروژه نصب و برقرار می گردد . 7 ) این پروسه پروژه را در تب (Tab) دلخواه شما ایجاد می کند . -------------------------------------------------------------------------------- در ساخت یک کامپوننت چگونه می بایست عمل شود ؟ برای فهم بیشتر برنامه کار را با مثال TSuperLabel ادامه می دهیم . خوب تصور کنید که می خواهیم لیبلی بسازیم که توانایی سایه زدن به متنی که در لیبل را داشته باشیم و در هنگام ورود و خروج موس (Mouse) بر روی خود حساسیت نشان داده و تغییر رنگ دهد . برای انجام این کار همانطور که در بالا پیش رفتیم میبایست از کلاس TLabel یک کامپوننت جدید ایجاد کنیم . پس از ساخت یونیت اولیه کافیست تا مطابق زیر و توضیحات پیش بروید . یونیتهای مورد احتیاج را درج کنیم : uses SysUtils, Classes, Controls, messages,StdCtrls,Windows, Graphics, Dialogs, GraphUtil; اضافه کردن پروسه ها ، توابع ، صفتها در هدر برنامه ( Header ) : .... private FInColor : TColor ; {1} FSwichColor:TColor ; FShadowActive : Boolean; { Private declarations } protected procedure SetInColor (Value:TColor); {2} Function GetInColor :TColor ; {2} procedure SetShadowActive (Value:Boolean); Function GetShadowActive :Boolean ; procedure Paint; override;{4} procedure DoDrawText(var Rect: TRect; Flags: Integer); override; {5} {--- > در صورتی که با کار کردن پیامهای ویندوز آشنا نیستید پیام ارسال کنید تا توضیح داده شود } procedure CMMouseenter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE; {<---} { Protected declarations } public { Public declarations } published property InColor : TColor read GetInColor write SetInColor default ClBlack; {3} property ShadowActive : Boolean read GetShadowActive write SetShadowActive default True; { Published declarations } end; ... توضیحات برنامه ( قسمت هدر Header ) : ابتدا یک متغییر در بخش پرایویت اضافه می کنیم تا رنگ سایه را از کاربر دریافت کند سپس یک تابع و یک پروسیجر جدید نوشته تا با آن خاصیت رنگ را ذخیره کنیم . سپس یک خاصیت جدید به نام این کالر تعریف می کنیم (هر نام دلخواهی که می خواهید ) بعد از انجام مراحل بالا میبایست پروسه Paint را از کلاس پدر فراخوانی و باز نویسی کنیم برای این کار نام و آرگومانهای پروسه را وارد کرده و پس از آن کلمه کلیدی Override را درج می کنیم تا پروسه ما باز نویسی شود و از پروسه کلاس پدر صرف نظر شود . (برای این کار میتوانید با زدن کلیدهای Ctrl + Space و درج تنها نام پروسه و انتخاب آن و زدن کلید Enter از ادامه راه خود داری کنید و درج ادامه مطالب را به سیستم وا گذار کنید ) پس از انجام 4 مرحله بالا حال پروسه DoDrawText همانند مرحله 4 از کلاس پدر فراخوانی می کنیم . (این پروسه مخصوص تبدیل خواص چاپی و چاپ متن در کلاس TLabel می باشد ) درج توابه و پروسه ها : بعد از درج خطوط دستور بالا باید توابع رو درج و ست (Set) می کنیم .این کار رو نیز بعد از کلمه کلیدی implementation مانند مراحل زیر انجام می دهیم . 1- درج پروسه سازنده کامپوننت و اعمال تغییرات ( Create ) : constructor TCustomSuperLabel.Create(AOwner: TComponent); begin inherited Create(AOwner);{1} FInColor := clSkyBlue ; FSwichColor := Color ; FShadowActive := True ; end; همینطور که مشاهده می کنید اولین مورد استفاه از Inherited در ابتدای کار در پروسه ساخت Object می باشد . در این نوع استفاده به برنامه می فهمانیم که می بایست قبل از انجام هر کاری دستورات ساخت کامپوننت را از کلاس پدر اجرا کند یعنی پروسیجر Create در کلاس پدر . سپس به اجرای خطوط بعدی پروسیجر بپردازد . فراخوانی همراه با مولفه و متغییر در این قسمت قابل مشاهده است . توجه : هیچگاه در چنین پروسه هایی که از کلاس پدر مشتق شده بدون کلمه Inherited کار فراخوانی را پروسه پدر را انجام ندهید . این کار شما موجب می شود تا پروسه ی بازگشتی ایجاد شود که اینکار باعث از دست دادن فظای مورد استفاده می شود و با پیغام خطا و یا خروج از دلفی برخورد می کنید که در این صورت پروژه را در صورت Save نبودن از دست می دهید . 2- درج توابع گرفتن و ذخیره رنگ (برای تغییر رنگ با ورود و خروج موس Mouse ) : procedure TCustomSuperLabel.SetInColor (Value:TColor); begin if Value <> FInColor then begin FInColor := Value ; Invalidate ; end; end; Function TCustomSuperLabel.GetInColor :TColor ; begin Result := FInColor ; end; 3- پروسیجرهای نمایش یا عدم نمایش سایه ( Shadow ) : procedure TCustomSuperLabel.SetShadowActive (Value:Boolean); begin if Value <> FShadowActive then begin FShadowActive := Value ; Invalidate ; end; end; Function TCustomSuperLabel.GetShadowActive :Boolean ; begin Result := FShadowActive; end; 4- پروسه Paint را درج می کنیم : procedure TCustomSuperLabel.Paint; {1} {2 -->> }const Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER); WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK); var Rect, CalcRect: TRect; DrawStyle: Longint; OldFontColor:TColor ; begin if (FSwichColor <> InColor ) and (FSwichColor <> Color) or (csDesigning in TComponent(Self).ComponentState) then FSwichColor := Color; with Canvas do begin if not Transparent then begin Brush.Color := FSwichColor; Brush.Style := bsSolid; FillRect(ClientRect); end; Brush.Style := bsClear; Rect := ClientRect; { DoDrawText takes care of BiDi alignments } DrawStyle := DT_EXPANDTABS or WordWraps[WordWrap] or Alignments[Alignment]; { Calculate vertical layout } if Layout <> tlTop then begin CalcRect := Rect; DoDrawText(CalcRect, DrawStyle or DT_CALCRECT); if Layout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom) else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2); end; {<<-- 2 } DoDrawText(Rect, DrawStyle); end; end; توضیحات برنامه ( قسمت تابع Paint ) : درج نام پروسیجر ( Procedure ) همراه مشخصات کلاس آن بدون درج Override در انتهای Procedure . اعلان متغییر ها ، ثابتها و نوشتن متن برنامه برای ست کردن نوع نمایش فراخوانی تابع DoDrawText . با فرواخوانی تابع ذکر شده و باز نویسی آن توسط شما که در جلو تر به آن میپردازیم به شما این امکان را می دهد تا با استفاده از نوع نمایش و محدوده آن به عملیات چاپ متن بپردازید . توجه : در این قسمت چون ما نمی خواهیم برنامه پروسیجر کلاس پدر پیت ( Paint ) را فراخوانی کند از نوشتن خط دستور Inherited Paint جدا خوداری کنید. فراخوانی آن باعث به هم ریختن شکل کلی نمایش متن می شود و اگر به برنامه تسلط نداشید در ابتدا دقیقا به صورت بالا عمل کنید تا بعد تغییرات دلخواه خود را انجام دهید . 5 - حالا با ید به درج و بازنویسی تابع DoDrawText بپردازیم : procedure TCustomSuperLabel.DoDrawText(var Rect: TRect; Flags: Integer); {1} {2-->>} var Text : string; AFont :TFont; begin try Inc(Rect.Top,2); Inc(Rect.Left); AFont := TFont.Create ; AFont.Assign(Font); Text := GetLabelText; if (Flags and DT_CALCRECT <> 0) and ((Text = '') or ShowAccelChar and (Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' '; if not ShowAccelChar then Flags := Flags or DT_NOPREFIX; Flags := DrawTextBiDiModeFlags(Flags); AFont.Color := GetShadowColor (Font.Color); Canvas.Font := AFont; if not Enabled then begin OffsetRect(Rect, 1, 1); Canvas.Font.Color := clBtnHighlight; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); OffsetRect(Rect, -1, -1); Canvas.Font.Color := clBtnShadow; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); end else DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags); finally AFont.Free ; end; dec(Rect.Top,2); dec(Rect.Left); Canvas.Brush.Style := bsClear ;{<<--2} inherited DoDrawText(Rect,Flags);{3} end; توضیحات برنامه ( قسمت تابع DoDarwText ) : درج نام ومشخصات و مولفه های پروسیجر بدون Override . نوشتن قسمت بدنه پروسیجر نوشتن کلمه کلیدی inherited به همراه نام پروسیجر DoDrawText همراه با دو مولفه Rect, Flags برای رسم متن به وسیله کلاس پدر . توجه : یک شکل دیگر استفاده از وراثت مطابق خط دستور بخش 3 توضیح برنامه DoDrawText می باشد . این شکل فراخوانی باعث می شود نه تنها قسمت بدنه این پروسیجر فراخوانی و اجرا شود بلکه پروسیجر DoDrawText در کلاس پدر نیز اجرا گردد . بدین شکل که بعد از ذکر کلمه inherited به برنامه این را می فهماند که باید پروسیجری را از کلاس پدر( Parent ) اجرا کند و با ذکر نام پروسیجر وانجام تغیررات دل خواه در ولفه ها و متغییرهای آن این امکان را داریم که قبل از فراخوانی یک پروسیجر تغییرات ما را اعمال کند و با شرایط جدید کار فراخوانی را صو.رت دهید . همان طور که ما در این تکه برنامه از آن استفاده کردیم . 6 - درج پروسیجرهای حساس به حرکت ماوس : procedure TCustomSuperLabel.CMMouseenter(var Message: TMessage); begin inherited ;{1} if not (csDesigning in TComponent(Self).ComponentState ) then begin FSwichColor := FInColor ; Invalidate ; end; end; procedure TCustomSuperLabel.CMMouseleave(var Message: TMessage); begin inherited;{1} if not (csDesigning in TComponent(Self).ComponentState ) then begin FSwichColor := Color ; Invalidate ; end; end; توضیحات پروسه های دریافت رویدادهای ماوس : 1 ) همانطور که در این دو پروسیجر مشاهده می کنید شکل دیگری از کاربرد Inherited وجود دارد که به پروسه می فهماند بدون هیچ تغییری در متغییرها آن باید پروسیجر را درکلاس یا کلاسهای پدر اجرا کند . در این شکل شما دیگر به ذکر نام پروسه و ارسال متغییر به آن نمی پردازید . -------------------------------------------------------------------------------- در نهایت چه کنیم ؟ خوب کامپوننت ما آماده اجراست تا ایجاد و برای استفاده آماده گردد . برای این کار شما می بایست پروژه را مجددا ساخته که این کار را می توانید با استفاده از پنجره Package و فشردن دکمه Compile درون پروژه انجام دهید . سپس وارد Tab انتخابی که در ابتدای ساخت از شما خواسته بود شوید و از کامپوننت ساخته شده توسط خودتان استفاده کنید .
+ نوشته شده در  ساعت   توسط حسن سامی نسب  | 

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

نصب 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;

+ نوشته شده در  ساعت   توسط حسن سامی نسب  | 

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

نمایش میزان كپی شدن فایل با 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

+ نوشته شده در  ساعت   توسط حسن سامی نسب  | 

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

تغییر 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;


همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید
+ نوشته شده در  ساعت   توسط حسن سامی نسب  | 

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

آرایه‌ها در دلفی
دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
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);
+ نوشته شده در  ساعت   توسط حسن سامی نسب  | 

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

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

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

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

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

منبع: dev.ir

تاریخچه زبان دلفی
دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borland از زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsberg در 15 سال پیش به بازار عرضه کرد.

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

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

سال 1995 - Delphi1
در زمان استفاده از سیستم عامل DOS برنامه نویسان مجبور بودند از بین زبان پر قدرت ولی کم سرعت Basic و زبان کارآمد ولی پیچیده و نامفهوم Assembly یکی را انتخاب کنند. پاسکال با ارائه یک زبان ساخت یافته و یک کامپایلر سریع و کم نقص این شکاف را پرکرد. برنامه نویسان Windows 3.1 هم با تصمیم گیری مشابهی رو برو شدند. یکی زبان قدرتمند و سنگین ++C و یکی زبان ساده و محدود کننده Visual Basic .

ارائه Delphi1 در این مورد هم راه حل خوبی برای برنامه نویسان بود. دلفی مجموعه متفاوتی برای برنامه نویسی بود . طراحی و توسعه برنامه های کاربردی، ایجاد DLL ها، پایگاههای داده و ... که یک محیط ویژوال وسیع را تشکیل می داد. Delphi1 اولین ابزار برنامه نویسی ویندوز بود که محیط طراحی ویژوال، کامپایلر بهینه کد برنامه و دسترسی قوی به پایگاههای داده را در یک جا جمع کرد که آن را به یکی از بهترین ابزارهای روش نوین توسعه سریع نرم افزار (Rapid Application Development) تبدیل کرد. این مجموعه قدرتمند باعث شد که در همان زمان بسیاری از برنامه نویسان زبانهای دیگر به Delphi روی بیاورند و این موفقیت بزرگی برای Borland به حساب می آمد. همچنین بسیاری از برنامه نویسان پاسکال دلفی را ابزاری یافتند که توسط آن هم از توانایی و تجربه خود در برنامه نویسی پاسکال استفاده می کردند و هم توانایی کار در ویندوز را به دست آوردند. همچنین زبانی که در آن زمان با نام پاسکال شیئی (ObjectPascal) در دانشگاهها ایجاد شده بود یک زبان بسیار خشک و محدود کننده بود که اصلاٌ حالت کاربردی پیدا نکرد.

ویژگیهای دلفی مثل طراحی ظاهری حساب شده و کاربر پسند آن باعث شد که زبان پاسکال شیئی عملاٌ از رده خارج شود. تیم طراحی VB در Microsoft قبل از حضور دلفی هیچ رقیب مهمی برای خود نمی دید. VisualBasic در آن زمان زبانی نا کارآ ، کم سرعت و کند ذهن بود. Visual Basic 3 در عمل اصلا توانایی رقابت با Delphi 1 را نداشت. در این سال شرکت Borland گرفتار یک سری مشکلات قضائی با شرکت Lotus بود که در نهایت هم متخلف شناخته شد. همچنین درگیری مشابهی هم با Microsoft بر سر تلاش در تغییر دادن فضای نرم افزار های Microsoft پیدا کرد. همچنین Borland مشغول طراحی و فروش طرح Quatro به شرکت Novell و طراحی پایگاه های داده dBase و Paradox بود که با استقبال قابل توجهی مواجه نشد.

در این زمان که Borland مشغول فعالیتهای قضایی و تجاری بود Microsft توانست گوی سبقت را از Borland برباید و قسمت اعظم بازار ابزار های برنامه نویسی تحت Windows را در اختیار بگیرد و سعی می کرد تا این طرز فکر را اشاعه دهد که چون Windows را طراحی کرده صلاحیت و توانایی تهیه بهترین ابزار های برنامه نویسی تحت آن را نیز در دست دارد. در این شرایط Borland با عرضه Delphi و نسخه جدید ++Borland C سعی کرد خدشه ای در فرمانروایی Microsoft وارد کند و سهمی در بازار بزرگ این محصولات داشته باشد.

سال 1996 - Delphi2
یک سال بعد Delphi2 تمام مزایای نسخه قبلی را تحت سیستم های جدید 32 بیتی (Windows 95,Windows NT) ارائه داد. همچنین Delphi2 با ارائه خصوصیات اضافه و کارکرد های قویتری نسبت به Delphi1 توانایی های خود را افزایش داد. (ازجمله ارائه کامپایلر 32 بیتی که سرعت بالایی به نرم افزار ها می بخشید، کتابخانه بزرگ و کاملی از اشیای مختلف، شیوه جدید و تکامل یافته ای برای اتصال به پایگاه های داده مختلف، ادیتور پیشرفته، پشتیبانی از OLE ، توانایی وراثت در فرمهای ویژوال و سازگاری با پروژه های 16 بیتی Delphi1 ). Delphi2 به معیاری برای سنجش و مقایسه همه ابزارهای توسعه نرم افزار در آن زمان تبدیل شد.

در آن زمان با ارائه سیستم 32 بیتی Windows95جهش بزرگی در سیستم عامل Windows رخ داد و Borland بسیار مشتاق بود که Delphi را به بهترین ابزار برنامه نویسی سیستم جدید تبدیل کند. نکته این که در آن زمان به منظور تاثیر در افکار عمومی و تاکید بر قدرت Delphi در سیستم عامل 32 بیتی قرار بود که نرم افزار با نام جدید Delphi32 به بازار عرضه شود ولی در آخرین مراحل به خاطر اینکه نشان دهند این زبان زبانی رشد یافته و تکامل یافته نسخه قبلی یعنی Delphi1 است نام Delphi2 را برای آن انتخاب کردند.

Microsoft تلاش کرد که با Visual Basic 4 با Delphi مقابله کند ولی از ابتدا کیفیت پایین آن و ضعف آن در انتقال برنامه های 16 بیتی به سیستم 32 بیتی و بروز اشکالات ساختاری در طراحی آن موجب شکست زودهنگام Visual Basic 4 شد. در این زمان هنوز تعداد زیادی از برنامه نویسان به Visual Basic وفادار بودند. Borland هنچنین روشها و ابزارهای قدرتمندی همچون PowerBuilder برای طراحی نرم افزار های Client/Server ارائه داد ولی Delphi هنوز آن قدر قدرتمند نشده بود که بتواند نرم افزارهایی که جایی در بین توسعه گران پیدا کرده اند را براندازد.

سال 1997 - Delphi3
از زمان تهیه و توسعه Delphi1 تیم توسعه Delphi در فکر گسترش و ایجاد یک زبان قدرتمند جهانی بود. برای Delphi2 این تیم تمام نیروی خود را صرف اعمال مربوط به انتقال تواناییها و کارکرد ها به سیستم 32 بیتی و همچنین اضافه کردن خصوصیات Client/Server و پایگاه داده کرد. در زمان تهیه Delphi3 تیم توسعه فرصت لازم برای گسترش مجموعه ابزار موجود را یافت و در این راستا کیفیت و کمیت ابزارهای Delphi بهبود یافت. به علاوه راه حل هایی برای مشکلات عمده و قدیمی برنامه نویسان تحت ویندوز ارائه شد. به ویژه استفاده از برخی فناوری های پیچیده و نا مفهوم (مثل COM و ActiveX وتوسعه نرم افزار های تحت Web وکنترل پایگاههای داده چند کاربره). روش نمایش کد برنامه همچنین توانایی کامل کردن خودکار کد (Code Completion) عملیات کد نویسی را راحت تر کرد. ضمن این که همچنان در بیشتر موارد اساس و متدولوژی برنامه نویسی مانند Delphi1 بود و بر پایبندی به قوانین اصولی Pascal تاکید می شد.

در این زمان رقابت شرکت های تولید کننده ابزار های برنامه نویسی بسیار تنگاتنگ شده بود. Microsoft با ارائه Visual Basic 5 به پیشرفت های خوبی دست یافت ازجمله پشتیبانی قوی از COM و ActiveX و ایجاد برخی خصوصیات و تغییرات کلیدی و اساسی در کامپایلر VB. ضمن این در همین سال Borland با پشتوانه قوی Delphi و با استفاده از ساختار موفق آن ابزارهای دیگری همچون Forte و BC++ Builder به بازار عرضه کرد.

تیم Delphi در زمان طراحی Delphi3 چند تن از اعضای کلیدی خود را از دست داد. Andres Hejlsberg معمار اصلی Delphi در اقدام غیر منتظره ای Borland را ترک کرد و تصمیم گرفت به رقیب دیرینه یعنی Microsoft بپیوندد. اما حرکت تیم Delphi متوقف نشد و معاون Hejlsberg که سالها تجربه همکاری با او را داشت توانست رهبری این تیم را به خوبی در دست بگیرد. همچنین مسئول فنی تیم (Paul Gross) هم در اقدام مشابهی به گروه Microsoft ملحق شد. این تغییرات بیشتر به خاطر اختلافات شخصی بین افراد تیم بود و نه به خاطر مسائل حرفه ای.

سال 1998 - Delphi4
Delphi4 بیشتر بر روی راحتتر کردن کار با دلفی متمرکز شد. مرورگر روال ها (Module Explorer) بهبود یافت و مرور و ویرایش Unit ها را راحت تر کرد. کنترل کد و کامل کردن خودکار کلاسها این فرصت را به کاربر داد که فکر و زمان خود را روی ساختار اصلی برنامه بگذارد و در وقت صرفه جویی کند. طراحی رابط کاربر هم کاملاٌ عوض شد و بهبود یافت و اشکال زدا (Debugger) نیز پیشرفت قابل توجهی داشت. Delphi4 قابلیتهای برنامه نویسان را در استفاده از تکنولوژیهای چند منظوره خارجی مثل MIDAS ، DCOM ، MIS و Corba افزایش داد.

در این سال Delphi جایگاه خود را در رقابت با دیگران مستحکم کرده بود و کم کم به سمت دست یابی به سودآوری مالی مورد نظر خود پیش می رفت. در واقع در این زمان بود که حاصل کار سنگین چند ساله تیم نمایان می شد. بعد از سالها آزمایش Delphi شهرت و محبوبیت خاصی پیدا کرد و دیگر برنامه نویسان Delphi توانایی جدا شدن از آن را نداشتند. در این زمان Borland به کار سوٌال برانگیزی دست زد و به منظور تبلیغ بیشتر و برتری در جنگ روانی با دیگر شرکتها نام Inprise را برای فعالیتهای تجاری خود برگزید.

ابزار های مربوط به فن آوری Corba را گسترش داد تا راه جدیدی برای سودآوری ایجاد کند. برای موفقیت در این زمینه Corba نیاز به رابط کاربر قدرتمندی داشت که در کنار توانایی های آن کار کردن با آن نیز راحت باشد. دقیقاٌ همان کاری که در سالهای قبل در مورد COM و برنامه نویسی تحت Web انجام شده بود و به موفقیت دست یافته بود. با این وجود بنا به دلایل مختلفی این گسترش و توسعه Corba هیچ وقت تکامل و موفقیتی که مورد نظر بود را به دست نیاورد و بر خلاف تبلیغات و سرمایه گذاری های انجام شده فن آوری Corba تنها توانست نقش کوچکی در روند رو به جلوی Delphi ایفا کند.

سال 1999 - Delphi5
Delphi5 در برخی زمینه ها پیشرفت های قبلی را ادامه داده است. اولاٌ مسیری را که Delphi4 با اضافه کردن ویژگیهای زیادی شروع کرده بود ادامه داد. Delphi4 باعث شد کارهایی که قبلاٌ به صرف وقت زیادی احتیاج داشت بسیار سریعتر انجام شود. Delphi به شکل امیدوار کننده ای به برنامه نویس این امکان را می دهد که بیشتر به برنامه ای که میخواهد بنویسد توجه کند و نه به قواعد برنامه نویسی و نوشتن کد های تکراری و خسته کننده. این ویژگیهای سودمند شامل رابط کاربر بهبودیافته و سیستم اشکال زدایی(Debugger) توانمند ، امکانات برنامه نویسی تیمی و ابزار های ترجمه می شود.

ثانیا Delphi5 خصوصیات جدیدی را در بر می گیرد که توسعه برنامه های تحت وب را واقعاٌ راحت کرده است. این ویژگیها شامل طراح اشیای مربوط به ASP برای ساختن صفحات (Active Server Page)، اشیایی موسوم به Internet Express برای پشتیبانی از XML و خصوصیات جدید MIDAS که آن را به یک ابزار همه کاره در پایگاه های داده تحت Web تبدیل کرد. در نهایت با صرف وقت ، هزینه و صبر زیاد توانست Delphi5 قدرتمند را عرضه کند. این فعالیت مدتها به طول انجامید و قبل از عرضه عمومی، Delphi5 بارها در بازبینی ها و آزمایشهای داخلی قسمتهای مختلف آن تغییر کرد و بهبود یافت.

Delphi5 در نیمه دوم سال 1999 به بازار عرضه شد و به نفوذ و تسلط بر بازار ادامه داد. در این زمان Visual Basic که کم کم به عضوی تحقیر آمیز برای Microsoft تبدیل می شد هم با پیشرفتهایی توانست در رقابت دوام بیاورد و از صحنه خارج نشود. در اقدام درست و به جایی نام Inprise دوباره به Borland بازگشت. این اقدام از سوی طرفداران و مشتریان قدیمی Borland با استقبال خوبی مواجه شد.

سال 2001 – Delphi6
در هنگام تهیه Delphi6 ساختار Delphi در زمینه های مختلف شکل گرفته بود و به یک تکامل نسبی رسیده بود. این مسئله باعث شد که تیم طراحی بتواند وقت خود را بر روی طرحی که مدتها تنها در حد یک نظریه بود بگذارد و آن را بسیار زودتر از آن که انتظار می رفت عملی کند: گام نهادن به محیط های فراتر از Windows . بیشتر نیروی توسعه گران Delphi در این مدت صرف رهانیدن Delphi از بند Windows شد که این خود در درجه اول مبارزه ای آشکار با سلطه Microsoft بود و ثانیاٌ راه برنامه نویسان را به سوی فضا های دیگر برنامه نویسی باز کرد. در ابتدا این عمل ریسک بزرگی بود و بیم آن می رفت که جایگاه Delphi در Windows هم به خطر بیفتد ولی در نهایت به نقطه رشد و قوتی بدل شد که Delphi را به یکی از بهترین ابزار برنامه نویسی Multi Platform تبدیل کرد.تکنولوژی CLX روالهای مختلف Delphi را با Kylix (عضو جدید خانواده Borland که در فضای Linux کار می کند) به اشتراک گذاشت و استفاده از سیستم بایت Java باعث شد که Delphi حتی از قید سخت افزار هم رها شود.

به نظر می رسد که این فعالیتها باعث ثبات Delphi در دنیای برنامه نویسان شود و نگرانی های Borland و برنامه نویسان که همیشه می ترسیدند که مبادا با ضعیف شدن Windows جایگاه خود را از دست بدهند حال به افتخار و آرامش برای آنان و نگرانی برای طرفداران Microsoft تبدیل شده است
+ نوشته شده در  ساعت   توسط حسن سامی نسب  |