Avaxnet

نسخه کامل: آموزش دلفی (قسمت 4و5و6)
شما در حال مشاهده نسخه تکمیل نشده می باشید. مشاهده نسخه کامل با قالب بندی مناسب.
در این قسمت ادامه آموزش دلفی رو میتونید بخونید
آرایه‌ها در دلفی
دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
کد:
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
لینک مرجع