View Full Version : مشکل در انتخاب شی برای ذخیره اطلاعات در RunTime
  
AliReza Vafakhah
جمعه 25 فروردین 1391, 22:32 عصر
سلام
در برنامه ام به یه مشکل برخوردم و اونهم انتخاب یک Object است.
از چه Object ای میتونم استفاده کنم که امکان این رو داشته باشه:
دارای چندین ستون باشه . مثل Grid .
مثلا تو ستون اول یه سری اطلاعات بریزیم در ستون دوم یه سری اطلاعات دیگه و ... و 
منظورم آرایه نیست. یه چیزی شبیه Grid اما NonVisual.
AliReza Vafakhah
شنبه 26 فروردین 1391, 03:46 صبح
از یک رشته استفاده کردم و با کاراکترهای خاصی عناصر را از هم جدا می کنم . هنگام خواندن هم با استفاده از کاراکترهای نشانه عناصر را یکی به یکی بازیابی می کنم.
مثل زیر:
Name @ Family # ID & Phone Number
Felony
شنبه 26 فروردین 1391, 22:48 عصر
روش بالا برای چند فیلد محدود مناسبه ولی برای تعداد بالا هم پیچیده میشه و هم مدیریت و تست و رفع اشکالش زمان بر هست ؛ بهتره از Generic ها استفاده کنید و کلاس TList رو به صورت زیر تعریف و به ازای هر ستون که نیاز دارید یک TStringList درش درج کنید :
var
  MyList: TList<TStringList>;
AliReza Vafakhah
شنبه 26 فروردین 1391, 23:56 عصر
مجتبی جان میشه یه مثال هم بزنید.
Felony
یک شنبه 27 فروردین 1391, 06: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, 14:54 عصر
نتونستم فقط از دکمه تشکر استفاده کنم.
دمت گرم ، کارت درسته . خیلی با این TList مشکل داشتم ، تموم شد
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.