PDA

View Full Version : سوال: آیاایتمی شبیه DropDown در Visual Studio برای دلفی است؟



hp1361
دوشنبه 18 مرداد 1389, 12:12 عصر
باسلام

توی Visual Studio آیتم DropDown هست که تقریبا شبیه ComboBox خودمونه با این تفاوت که برای هر ایتم میتونیم یک Value و یک Text مشخص کنیم.

خواستم ببینم برای دلفی همچین چیزی هست؟

ممنون و منتظرم

vcldeveloper
دوشنبه 18 مرداد 1389, 13:40 عصر
ComboBox در دلفی از TStringList به عنوان Items استفاده میکنه، و میتونه به همراه هر متن، یک Object هم ذخیره کنه. اگر نوع داده هایتان ساده هست، و نمیخواید سربار Object رو داشته باشید، اگر داده Integer هست، می تونید به راحتی از همون فضای اختصاص داده شده برای Object، برای ذخیره آن استفاده کنید. اگر Integer نیست، می تونید داده را جایی در Heap مقداردهی کنید، و یک Pointer از آن در خصوصیت Object اون Item ذخیره کنید.

اگر دنبال یک کامپوننت آماده می گردید، ComboBox موجود در مجموعه EhLib همچین قابلیتی داره، و شما می تونید برای Item ها مقادیر متناظری تعیین کنید، که وقتی آیتمی انتخاب شد، مقدار متناظر با آن برگشت داده بشه.

hp1361
دوشنبه 18 مرداد 1389, 16:55 عصر
سلام اقای کشاورز

ممنون از پاسختون

هرچی با راهنمای دلفی ور رفتم نتونستم به جواب برسم.مفاهیم Casting توی C# رو مدام اینجا قاطی می کنم

اگه لطف کنید با یک مثال کوچولو توضیح بدید ممنون می شم.

اختصاص Value و Text که اینجا Value مقدارش Integer است
همچنین بازیابی این مقادیر

با تشکر فراوان

vcldeveloper
سه شنبه 19 مرداد 1389, 04:25 صبح
اگه لطف کنید با یک مثال کوچولو توضیح بدید ممنون می شم.

اختصاص Value و Text که اینجا Value مقدارش Integer است
همچنین بازیابی این مقادیر


Text := 'Test';
Value := 1;
ComboBox1.Items.AddObject(Text,TObject(Value));

برای بازیابی هم:

for i := 0 to ComboBox1.Items.Count - 1 do
Value := Integer(ComboBox1.Items.Objects[i]);

کد بالا در یک حلقه روی همه عناصر ComboBox حرکت میکنه، و مقدار Object آنها را میخونه.

hp1361
سه شنبه 19 مرداد 1389, 11:31 صبح
با عرض سلام مجدد و تشکر از آقای کشاورز

یه سوال دیگه داشتم اگه راهنمایی بفرمایین ممنون میشم

من می خوام با یه تابع کوموباکس رو پر کنم.برای همین فکر کردم که باید خروجی تابع یه TStrings باشه و بعد اونو به Combobox بدم . اما ارور میده


function TDataModule_Data.RetrieveServices:TStrings;
var
Tstr:TStrings;
begin
ADOQ_Temp.Close;
ADOQ_Temp.SQL.Clear;
ADOQ_Temp.SQL.Append('Select ServiceCode,ServiceName From tbl_Services');
ADOQ_Temp.ExecSQL;
if not ADOQ_Temp.IsEmpty then
begin
while ADOQ_Temp.Eof do
begin
Tstr.AddObject(ADOQ_Temp.FieldByName('ServiceName' ).AsString,TObject(ADOQ_Temp.FieldByName('ServiceC ode')));
end;
end;
Result:=Tstr;
end;



ComboBox_Services.Items.AddStrings(DataModule_Data .RetrieveServices);


مشکل کجاست نمی دونم .

Felony
سه شنبه 19 مرداد 1389, 12:19 عصر
تابعتون رو به صورت زیر تغییر بدید و نام شئ ComboBox تون رو به عنوان پارامتر ورودی بهش بدید :
procedure TDataModule_Data.RetrieveServices(Const ComboName: TComboBox);
var
Tstr: TStrings;
begin
With DataModule2.ADOQ_Temp do
begin
Close;
SQL.Clear;
SQL.Append('Select ServiceCode,ServiceName From tbl_Services');
ExecSQL;
if not IsEmpty then
begin
while Eof do
begin
Tstr.AddObject(FieldByName('ServiceName').AsString ,TObject(FieldByName('ServiceCode')));
end;
end;
Comboname.Items.Assign(Tstr);
end;
end;

hp1361
سه شنبه 19 مرداد 1389, 13:00 عصر
سلام دوست عزیز ممنون از جوابتون

باز هم ارور میده.من از این تابع در زمان OnShow فرمی که کومبوباکس روش قرار داره استفاده کردم اما ارور داد.در OnActive هم قرار دادم اما فایده ای نداشت.مشکل کجاست نمی دونم

این ارور رو زمان استفده از OnShow



First chance exception at $75539617. Exception class EAccessViolation with message 'Access violation at address 004041D4 in module 'ReceiptManagement.exe'. Read of address 1B01F853'. Process ReceiptManagement.exe (2232)


این ارور رو زمانی که از OnActive استفاده کردم داد



First chance exception at $75539617. Exception class EPrivilege with message 'Privileged instruction'. Process ReceiptManagement.exe (4724)

Felony
سه شنبه 19 مرداد 1389, 18:35 عصر
من کدتون رو بررسی نکرده بودم فقط مشکل پارامتر ورودی رو براتون حل کردم ، تو کدی که نوشتید کلی مشکل وجود داشت :

procedure TDataModule_Data.RetrieveServices(const ComboName: TComboBox);
begin
With DataModule_Data.ADOQ_Temp do
begin
SQL.Clear;
SQL.Text:= 'Select * From TBL_Book';
Active:= True;
if not IsEmpty then
while not Eof do
begin
ComboName.Items.AddObject(FieldByName('Name').AsSt ring ,TObject(FieldByName('ID').AsInteger));
ADOQ_Temp.Next;
end;
end;
end;

hp1361
سه شنبه 19 مرداد 1389, 19:13 عصر
سلام آقای تاجیک

ممنون از جوابتون.کارا بود

فقط یه سوال:نمیشه عوض اینکه کومبوباکس رو به تابع پاس بدیم ،تابع خودش یه خروجی داشته باشه که ما نتیجه رو توی کومبو باکس بریزیم؟

بازم ممنون

Felony
سه شنبه 19 مرداد 1389, 21:25 عصر
چرا میشه ، کدتون رو به صورت زیر تغییر بدید :
procedure TDataModule_Data.RetrieveServices(var StrList: TStringList);
begin
With DataModule_Data.ADOQ_Temp do
begin
SQL.Clear;
SQL.Text:= 'Select * From TBL_Book';
Active:= True;
if not IsEmpty then
while not Eof do
begin
StrList.AddObject(FieldByName('Name').AsString ,TObject(FieldByName('ID').AsInteger));
ADOQ_Temp.Next;
end;
end;
end;

و به صورت زیر ازش استفاده کنید :
var
MyList: TStringList;
begin
MyList:= TStringList.Create;
try
DataModule2.RetrieveServices(MyList);
ComboBox1.Items.Assign(MyList);
finally
MyList.Free;
end;
end;

mehdimdp
سه شنبه 19 مرداد 1389, 23:56 عصر
خب چرا به جای کد نویسی از dblookupcombobox استفاده نمی کنید؟؟؟