PDA

View Full Version : مبتدی: راهنمایی در مورد کار با آرایه های داینامیک



ehsan_faal
جمعه 29 اسفند 1393, 16:10 عصر
سلام دوستان.
آیا توی دلفی راهی هست که یه آرایه داینامیک درست کنیم ولی بدون اینکه از setlength استفاده کنیم از آرایه استفاده کنیم؟
مثلا یه متدی شبیه append توی جاوا اینجا هم هست؟
سوال دومم اینه که فرق این دو تا چیه؟


TArray<string>

array of string

با تشکر

BORHAN TEC
جمعه 29 اسفند 1393, 16:27 عصر
با سلام،


آیا توی دلفی راهی هست که یه آرایه داینامیک درست کنیم ولی بدون اینکه از setlength استفاده کنیم از آرایه استفاده کنیم؟
مثلا یه متدی شبیه append توی جاوا اینجا هم هست؟

در این خصوص در نسخه XE7 ویژگی خوبی به کامپایلر دلفی اضافه شده که کار با آرایه های دینامیک را به شکل قابل توجهی راحت تر کرده است. به مثال زیر دقت کنید:
var A: array of integer; B: TBytes = [1,2,3,4]; //Initialization can be done from declaration
begin
...
A:=[1,2,3]; // assignation using constant array
A:=A+[4,5]; // addition - A will become [1,2,3,4,5]
...
end;


var
A: array of integer;
begin
...
A:=[1,2,3,4];
Insert(5,A,2); // A will become [1,2,5,3,4]
...
end;


var
A: array of integer;
begin
...
A:=[1,2,3,4];
Delete(A,1,2); //A will become [1,4]
...
end;


A := Concat([1,2,3],[4,5,6]); //A will become [1,2,3,4,5,6]
البته اگر در نسخه های قدیمی تر دلفی می خواهید از این قابلیت استفاده کنید می توانید از Spring4D که نتیجه چند سال کار مداوم آقای Stefan Glienke هست استفاده کنید که قابلیتهای خوبی را در خصوص کار با آرایه های دینامیک شامل می شود. البته برای استفاده از Spring4D حداقل باید از دلفی 2010 استفاده کنید، چرا که این فریمورک در نسخه های قدیمی تر قابل استفاده نیست. در خصوص این موضوع به مثال زیر توجه کنید:
var arr, arr2: DynamicArray<Integer>;
i: Integer;
begin
{$IFDEF DELPHIXE7_UP}
arr := [1, 2, 3];
arr := arr + arr;
arr := arr + [4, 5];
{$ELSE}
arr.Assign([1, 2, 3]);
arr.Add(arr);
arr.Add([4, 5]);
{$ENDIF}
for i in arr do
Write(i, ' '); // 1 2 3 1 2 3 4 5
Writeln;

arr2.Assign([2, 4]);
if arr2 in arr then
begin
arr := arr - arr2;
for i in arr do
Write(i, ' '); // 1 3 1 2 3 5
Writeln;
end;

arr.Assign([1, 2, 3, 4, 5, 6]);
arr2 := arr.Splice(2, 2, [7, 8, 9]);
for i in arr2 do
Write(i, ' '); // 3 4
Writeln;
for i in arr do
Write(i, ' '); // 1 2 7 8 9 5 6
Writeln;
منبع:
http://delphisorcery.blogspot.com/2015/01/new-dynamic-array-type-in-spring4d-12.html




سوال دومم اینه که فرق این دو تا چیه؟




1
2

TArray<string>
array of string





در مورد اول شما دارید از generic ها که در دلفی 2009 معرفی شده و در مورد دوم هم از آرایه های دینامیک که در دلفی 4 معرفی شده استفاده می کنید. در مورد این سوال پیشنهاد می کنم که نگاهی به لینک زیر بیاندازید تا متوجه تفاوتشون بشید:
http://stackoverflow.com/questions/14383093/what-are-the-reasons-to-use-tarrayt-instead-of-array-of-t

موفق باشید.