a_mosavian
یک شنبه 07 فروردین 1390, 16:36 عصر
کلاس TStringList یکی از پرکاربردترین کلاس های دلفی است. با متد Add برای افزودن یک رشته به این لیست آشنایید اما این لیست قابلیت های دیگری مانند افزودن مقادیر دوگانه (Key Value) و اختصاص یک شی به هر کدام از رشته ها دارد که در جاهایی کار را ساده تر می کند.
مثلا فرض کنید یک ListBox دارید که می خواهید هر گاه یک آیتم از آن برگزیده شد، یک دکمه خاصی Enable شود. کافیست هنگام افزودن رشته به لیست از دستوری شبیه دستور زیر بهره بگیرید:
ListBox1.Items.AddObject('Show Button1', Button1);
و در قسمت رویداد OnClick رویدادی بنویسید که هر گاه آن ایتم در لیست باکس انتخاب شده بود:
TButton(ListBox1.Items.Objects
[ListBox1.ItemIndex]).Enabled:=True;
در واقع حتی می توان پا را فراتر گداشت و بجای مرتبط کردن یک شی به آیتم های StringList، یک عدد کاردینال یا Integer را بدان مربوط ساخت
ListBox1.Items.AddObject('ItemIndex1', TObject(1));
در واقع آنچه که بعنوان متغیر شی در آن ذخیره می شود، آدرس پوینتر آن است که خود عددی 32 بیتی در برنامه های 32 بیتی است! حال ما عدد 1 را به عنوان پوینتر به این تابع قالب می کنیم. اما از آنجایی که خود می دانیم چه کرده ایم و باید آن را چگونه بهره بگیریم، خطای Access Violation رخ نخواهد داد. برای بازگردانی عدد مرتبط شده با این آیتم، از دستوری به مانند دستور زیر:
X:=Integer(ListBox1.Items.Objects[ItemIndex]);
حال اگر بخواهیم هر موردی که کاربر برگزید، ترجمه آن در یک برچسب متنی به کاربر نمایش داده شود! کار سخت تر می شود چون رشته ها عدد نیستند و نمی توان آن را بعنوان پوینتر به دلفی انداخت! یک راه این است که آدرس پوینتری یک رشته را به آن بدهیم و دوباره بازگردانی کنیم. اما راه ساده تری بدون درگیر شده با وادی سخت و پیچیده و پرخطای پوینتر وجود دارد. کد زیر را ببینید خودتان در می یابید
const
LatinNumbers: array[1..5] of String =('unus' ,'duo', 'tres', 'quattuor', 'quinque');
var
X: string;
begin
ComboBox1.Items.AddObject('One', TObject(1));
ComboBox1.Items.AddObject('Two', TObject(2));
ComboBox1.Items.AddObject('Three', TObject(3));
ComboBox1.Items.AddObject('Four', TObject(4));
ComboBox1.Items.AddObject('Five', TObject(5));
// some codes to let user to choice an item
X:=LatinNumbers[Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex])];
end;
مثلا فرض کنید یک ListBox دارید که می خواهید هر گاه یک آیتم از آن برگزیده شد، یک دکمه خاصی Enable شود. کافیست هنگام افزودن رشته به لیست از دستوری شبیه دستور زیر بهره بگیرید:
ListBox1.Items.AddObject('Show Button1', Button1);
و در قسمت رویداد OnClick رویدادی بنویسید که هر گاه آن ایتم در لیست باکس انتخاب شده بود:
TButton(ListBox1.Items.Objects
[ListBox1.ItemIndex]).Enabled:=True;
در واقع حتی می توان پا را فراتر گداشت و بجای مرتبط کردن یک شی به آیتم های StringList، یک عدد کاردینال یا Integer را بدان مربوط ساخت
ListBox1.Items.AddObject('ItemIndex1', TObject(1));
در واقع آنچه که بعنوان متغیر شی در آن ذخیره می شود، آدرس پوینتر آن است که خود عددی 32 بیتی در برنامه های 32 بیتی است! حال ما عدد 1 را به عنوان پوینتر به این تابع قالب می کنیم. اما از آنجایی که خود می دانیم چه کرده ایم و باید آن را چگونه بهره بگیریم، خطای Access Violation رخ نخواهد داد. برای بازگردانی عدد مرتبط شده با این آیتم، از دستوری به مانند دستور زیر:
X:=Integer(ListBox1.Items.Objects[ItemIndex]);
حال اگر بخواهیم هر موردی که کاربر برگزید، ترجمه آن در یک برچسب متنی به کاربر نمایش داده شود! کار سخت تر می شود چون رشته ها عدد نیستند و نمی توان آن را بعنوان پوینتر به دلفی انداخت! یک راه این است که آدرس پوینتری یک رشته را به آن بدهیم و دوباره بازگردانی کنیم. اما راه ساده تری بدون درگیر شده با وادی سخت و پیچیده و پرخطای پوینتر وجود دارد. کد زیر را ببینید خودتان در می یابید
const
LatinNumbers: array[1..5] of String =('unus' ,'duo', 'tres', 'quattuor', 'quinque');
var
X: string;
begin
ComboBox1.Items.AddObject('One', TObject(1));
ComboBox1.Items.AddObject('Two', TObject(2));
ComboBox1.Items.AddObject('Three', TObject(3));
ComboBox1.Items.AddObject('Four', TObject(4));
ComboBox1.Items.AddObject('Five', TObject(5));
// some codes to let user to choice an item
X:=LatinNumbers[Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex])];
end;