PDA

View Full Version : تعریف مقدار برای عناصر یک ListBox



صابر طهماسبی
چهارشنبه 17 شهریور 1389, 09:58 صبح
سلام
فرض کنید دو جدول داریم به شکل زیر :




جدول عناوین
page int
title varchar(25)
----------------------------
جدول صفحات
page_number int این فیلد با فیلد اول جدول عناوین در ارتباط است
content text

حالا من می خوام یک لیست باکس بذارم که عنوان ها رو از جدول اول بخونم و در لیست قرار بدم به طوری که هر عنوان دارای مقدار(value) دلخواه باشه(مثل تگ select در html) که مقدار هر عنوان شماره صفحش هست که با کلیک روی اون محتوای صفحه از جدول دوم خونده میشه و در یک memo نمایش داده میشه
مشکل من اینه که نمی دونم چطور به گزینه های یک لیست مقادیر(value) دلخواه بدم نمی خوام مقدارشون ایندکسشون باشه می خوام خودم مقدار بدم(مثل تگ option در html)
امیدوارم متوجه شده باشید چون احساس می کنم خوب بیان نکردم
ممنون اگه راهنمایی کنید

Felony
چهارشنبه 17 شهریور 1389, 11:55 صبح
3 تا راه داری :

1- از متد Value استفاده کنید ( ابتدا بهش مقدار بدید و بعد موقع نیاز ازش بخونید )
2- یه آرایه به تعداد آتیم های لیستت تعریف کنی و به خونه های آرایت بسته به index لیستت مقدار بدی و بسته به همون هم ازش بخونی .

3- این راه فنی ترین راه هست ؛ پارامتر دوم متد AddItem شئ Listbox میتونه یه کلاس از TObject رو نگه داری کنه پس :
ایتدا یه شئ جدید از کلاس TObject مشتق کن و برایش یه متغییر جدید در نظر بگیر که Value رو توش نگه داری کنی :

Type
TMyType= Class(TObject)
Public
Value: Integer;
End;

حالا ازش یه نمونه بساز و به عنوان پارامتر دوم به متد AddItem شئ Listbox پاسش بده :

var
Test: TMyType;
begin
Test:= TMyType.Create;
try
Test.Value:= 1345;
ListBox1.AddItem('<body>', Test);
finally
Test.Free;
end;

الان یه شئ از کلاس TObejct با مقدار Value مشخص به آیتمی که اضافه کردید ( در مثال بالا <body> ) اضافه شده ، برای خوندنش هم کافیه از متد Objects شئ Listbox استفاده کنی ( البته باید Typecast کنی تا بتونی به مقدار متغییر مورد نظر تو اون کلاس درسترسی داشته باشی ) ، مثلا :

ShowMessage(IntToStr(TMyType(ListBox1.Items.Object s[0]).Value));

موفق باشید .

moein+
چهارشنبه 17 شهریور 1389, 12:39 عصر
خب این راهی که گفته شد، از نظر من هم صحیح ترین را هست، ولی وابسته به اصلوب هر فرد در پیاده سازی کد ممکنه بعضی ها رو دچار پیچیدگی کنه...

حالا اگر ساده تر به قضیه نگاه کنیم، شما می خواهید همرا هر آیتم یک عدد هم ذخیره کنید در حالی که ListBox این امکان رو نداره! اما همون طور که جناب تاجیک گفتند برای اضافه کردن هر آیتم دو راه وجود داره، در راه حل اول فقط یک متن، و در راه دوم یک متن و یک شی، خوب یعنی حداقل دادهای که ListBox برای هر آیتم نگهداری می کنه، شامل یک متن و متغیری از نوع TObject ، شما می تونید به جای تولید کلاس، متغیر مثلا integer رو، TypeCast کنید و در جای اشاره گر قرار بدید
(البته تو این راه توجه به فضای داده هایی که به کار می برید اهمیت دارد )


// نوشتن
ListBox1.AddItem('SampleText',TObject(Value));
// خواندن
Value := Integer(ListBox1.Items.Objects[I]);