ورود

View Full Version : مشکل در انتخاب شی برای ذخیره اطلاعات در RunTime



AliReza Vafakhah
جمعه 25 فروردین 1391, 21:32 عصر
سلام

در برنامه ام به یه مشکل برخوردم و اونهم انتخاب یک Object است.

از چه Object ای میتونم استفاده کنم که امکان این رو داشته باشه:

دارای چندین ستون باشه . مثل Grid .

مثلا تو ستون اول یه سری اطلاعات بریزیم در ستون دوم یه سری اطلاعات دیگه و ... و

منظورم آرایه نیست. یه چیزی شبیه Grid اما NonVisual.

AliReza Vafakhah
شنبه 26 فروردین 1391, 02:46 صبح
از یک رشته استفاده کردم و با کاراکترهای خاصی عناصر را از هم جدا می کنم . هنگام خواندن هم با استفاده از کاراکترهای نشانه عناصر را یکی به یکی بازیابی می کنم.

مثل زیر:

Name @ Family # ID & Phone Number

Felony
شنبه 26 فروردین 1391, 21:48 عصر
روش بالا برای چند فیلد محدود مناسبه ولی برای تعداد بالا هم پیچیده میشه و هم مدیریت و تست و رفع اشکالش زمان بر هست ؛ بهتره از Generic ها استفاده کنید و کلاس TList رو به صورت زیر تعریف و به ازای هر ستون که نیاز دارید یک TStringList درش درج کنید :

var
MyList: TList<TStringList>;

AliReza Vafakhah
شنبه 26 فروردین 1391, 22:56 عصر
مجتبی جان میشه یه مثال هم بزنید.

Felony
یک شنبه 27 فروردین 1391, 05:06 صبح
اینطوری :

var
aList: TList<TStringList>;
ListCount: Integer;
begin
aList := TList<TStringList>.Create;
try
aList.Add(TStringList.Create); // for Name
aList.Add(TStringList.Create); // for Family
aList.Add(TStringList.Create); // for ID
aList.Add(TStringList.Create); // for Phone

// Here, we can use theme
aList[0].Add('Mojtaba');
aList[1].Add('Tajik');
aList[2].Add('123');
aList[3].Add('0912121212');

ShowMessage(aList[0].Strings[0]);
ShowMessage(aList[1].Strings[0]);
ShowMessage(aList[2].Strings[0]);
ShowMessage(aList[3].Strings[0]);

// Change the index of ID & Phone
aList.Exchange(2, 3);

// Now here the index of ID & Phone is changed
ShowMessage(aList[0].Strings[0]);
ShowMessage(aList[1].Strings[0]);
ShowMessage(aList[2].Strings[0]);
ShowMessage(aList[3].Strings[0]);
finally
for ListCount := aList.Count - 1 downto 0 do
if Assigned(aList.Items[ListCount]) then
aList[ListCount].Free;
aList.Free;
end;
end;

تو کد بالا چون ما از کلاس TList استفاده کردیم پس تمام متدهای پیاده سازی شده توسط این کلاس رو در اختیار داریم ، تو همون کد بالا ترتیب فیلدهایی که من نوشتم ( نام ، نام خانوادگی ، شماره ، تلفن ) هست ، حالا برای اینکه ترتیب ستون ها رو تغییر بدیم همونطور که تو کد میبینید خیلی راحت متد Exchange خود کلاس TList رو صدا زدم و ترتیب ستون ها رو تغییر دادم ، به همین صورت میشه از متدهای دیگه استفاده کرد .

علاوه بر موارد بالا در کدی که نوشتم اشیاء که در حال ذخیره در TList هستند از نوع TStringList هستند پس میشه از تمام متدهای کلاس TStringList برای کار بر روی هر یک از آیتم ها استفاده کرد ، مثلا یک رشته که با کاما جدا شده رو بهش داد و به عنوان آیتم های اون فیلد ازش استفاده کرد یا ...

به نحوه آزاد سازی حافظه در بلاک finally هم دقت کن ، اگر Generic ی که استفاده میکنی حاوی Data Type هایی باشه که شئ هستند و نیاز به ساخته شدن دارن ، در آخر کار وظیقه آزاد سازیش با خودتون هست .

Generic ها از نسخه 2009 به بعد به Delphi اضافه شدن .

البته کد بالا رو با استفاده از کلاس TList و بدون استفاده از Generic ها هم میشه پیاده کرد ولی نیاز به Typecast های متوالی و در یکسری از کدها مدیریت اشاره گر ها و ... هست که احتمال خطا رو بالا میبره و در ضمن سرعت Generic ها بیشتر از این شیوه معمول هست ، کد بالا بدون استفاده از Generic ها به صورت زیر میشه :

var
aList: TList;
ListCount: Integer;
begin
aList := TList.Create;
try
aList.Add(TStringList.Create); // for Name
aList.Add(TStringList.Create); // for Family
aList.Add(TStringList.Create); // for ID
aList.Add(TStringList.Create); // for Phone

// Here, we can use theme
TStringList(aList.Items[0]).Add('Mojtaba');
TStringList(aList.Items[1]).Add('Tajik');
TStringList(aList.Items[2]).Add('123');
TStringList(aList.Items[3]).Add('0912121212');

ShowMessage(TStringList(aList.Items[0]).Strings[0]);
ShowMessage(TStringList(aList.Items[1]).Strings[0]);
ShowMessage(TStringList(aList.Items[2]).Strings[0]);
ShowMessage(TStringList(aList.Items[3]).Strings[0]);

// Change the index of ID & Phone
aList.Exchange(2, 3);

// Now here the index of ID & Phone is changed
ShowMessage(TStringList(aList.Items[0]).Strings[0]);
ShowMessage(TStringList(aList.Items[1]).Strings[0]);
ShowMessage(TStringList(aList.Items[2]).Strings[0]);
ShowMessage(TStringList(aList.Items[3]).Strings[0]);
finally
for ListCount := aList.Count - 1 downto 0 do
if Assigned(aList.Items[ListCount]) then
TStringList(aList[ListCount]).Free;
aList.Free;
end;
end;

AliReza Vafakhah
یک شنبه 27 فروردین 1391, 13:54 عصر
نتونستم فقط از دکمه تشکر استفاده کنم.

دمت گرم ، کارت درسته . خیلی با این TList مشکل داشتم ، تموم شد