PDA

View Full Version : سوال: نميش اطلاعات يك فيلد در يك combobox



hentjanson
چهارشنبه 26 تیر 1387, 09:25 صبح
سلام دوستان
چطور ميشه محتويات يك فيلد رو در يك combobox به نمايش در آورد .
به اين طريق كه تمام محتويات فيلد name رو در combobox نشون بديم ؟

etedali
چهارشنبه 26 تیر 1387, 09:33 صبح
کد زیر را استفاده کن تمام اطلاعات را از دیتابیس میخونه و در کامبوباکس قرار میده.

AdoTable1.First;
for i := 1 to AdoTable1.RecordCount do
begin
ComboBox1.Items.Add(AdoTable1.FieldValues['name']);
AdoTable1.Next;
end;

hentjanson
چهارشنبه 26 تیر 1387, 09:44 صبح
سلام دوست من
يك سوال من كد شما رو در form create آوردم اين متغير i اين بايد كجا و به چه صورت تعريف كنم ؟

etedali
چهارشنبه 26 تیر 1387, 09:53 صبح
سلام دوست من
يك سوال من كد شما رو در form create آوردم اين متغير i اين بايد كجا و به چه صورت تعريف كنم ؟
متغیر i را قبل از implementation نگاه کن var را می بینی اینجا تعریف کن

َVar
i : Integer;

hentjanson
چهارشنبه 26 تیر 1387, 10:10 صبح
مرسي مشكلم حل شد .
يك موضوع ديگه هم برام پيش اومده اين در شرايطي هست كه ado table روي فرم باشه اگه اون در datamodule باشه چي ؟
بايد چطور اين خط رو نوشت ؟


AdoTable1.First;

اتصال به بانك در data module صورت گرفته ميشه در اين رابطه هم توضيح بديد

etedali
چهارشنبه 26 تیر 1387, 10:16 صبح
DataModule1.AdoTable1.First;

hentjanson
چهارشنبه 26 تیر 1387, 10:25 صبح
سلام دوست من من كد شما رو به اين ترتيب نوشتم كه ظاهرا درست به نظر مياد


procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule2.AdoTable1.First;
for i := 1 to DataModule2.AdoTable1.RecordCount do
begin
ComboBox1.Items.Add(DataModule2.AdoTable1.FieldVal ues['namketab']);
DataModule2.AdoTable1.Next;
end;
end;

ولي در هنگام اجراي برنامه با مشكل زير مواجه ميشم
0000005c access violation at address 004B11 IN MODULE 'project1.exe' read of address

etedali
چهارشنبه 26 تیر 1387, 10:30 صبح
سلام دوست من من كد شما رو به اين ترتيب نوشتم كه ظاهرا درست به نظر مياد


procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule2.AdoTable1.First;
for i := 1 to DataModule2.AdoTable1.RecordCount do
begin
ComboBox1.Items.Add(DataModule2.AdoTable1.FieldVal ues['namketab']);
DataModule2.AdoTable1.Next;
end;
end;

ولي در هنگام اجراي برنامه با مشكل زير مواجه ميشم
0000005c access violation at address 004B11 IN MODULE 'project1.exe' read of address
شما این کد را در Form Create نوشتی برای همین به مشکل برخوردی همین کد را در Form Show استفاده کن مشکلت حل میشه اینجور کد ها را در Form Create استفاده نکن

dkhatibi
چهارشنبه 26 تیر 1387, 10:47 صبح
چرا از dblookup ComboBox استفاده نمی کنید؟

hentjanson
چهارشنبه 26 تیر 1387, 10:56 صبح
مشكلم حل شد راستي مي خوام وقتي يك عنوان انتخاب شده دو edit ديگه خود به خود مقاديرشون بياد .
منظورم اينه وقتي كاربر از combobox يك كتاب انتخاب كرد در edit1 تعداد صفحه (tedad) و در edit2 قيمت )gheymat) سريعا ظاهر شه

m-khorsandi
چهارشنبه 26 تیر 1387, 11:04 صبح
متغیر i را قبل از implementation نگاه کن var را می بینی اینجا تعریف کن

َVar
i : Integer;

واقعا لازمه که این متغیر تو قسمت var تعریف بشه!!!؟

etedali
چهارشنبه 26 تیر 1387, 11:26 صبح
در onchange كومبوباكس اين كد را بنويس

ADOTable1.First;
while not ADOTable1.Eof do
begin
if ADOTable1.FieldValues['Name'] = ComboBox1.Text then
begin
Edit1.Text := IntToStr(ADOTable1.FieldValues['Page']);
Edit2.Text := IntToStr(ADOTable1.FieldValues['gheymat']);
end;
ADOTable1.Next;
end;
البته فكر ميكنم با Locate هم بتوني همين كار را انجام بدهي

etedali
چهارشنبه 26 تیر 1387, 11:28 صبح
واقعا لازمه که این متغیر تو قسمت var تعریف بشه!!!؟
خير من اينجا اشتباه كردم ميتونه توي Form Show هم بنويسه ممنون كه اشاره كرديد.:لبخندساده:

hentjanson
چهارشنبه 26 تیر 1387, 11:56 صبح
براي اينكه منم خوي متوجه شده باشم اين خط چكار ميكنه مخصوصا كلمه eof
اين خط رو ميگم ؟


while not ADOTable1.Eof do

etedali
چهارشنبه 26 تیر 1387, 11:59 صبح
اين خط چكار ميكنه مخصوصا كلمه eof


while not ADOTable1.Eof do

يعني تا زماني كه به آخر ركورد جدول نرسيده حلقه ادامه پيدا كنه End Of File توي فايلها هم كاربرد داره

hentjanson
چهارشنبه 26 تیر 1387, 12:20 عصر
مرسي دوست من از اينكه تا انتها با من بوديد مشكلم حل شد . مرسي

nightHunter
چهارشنبه 26 تیر 1387, 12:44 عصر
سلام دوست من من كد شما رو به اين ترتيب نوشتم كه ظاهرا درست به نظر مياد


procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule2.AdoTable1.First;
for i := 1 to DataModule2.AdoTable1.RecordCount do
begin
ComboBox1.Items.Add(DataModule2.AdoTable1.FieldVal ues['namketab']);
DataModule2.AdoTable1.Next;
end;
end;
ولي در هنگام اجراي برنامه با مشكل زير مواجه ميشم
0000005c access violation at address 004B11 IN MODULE 'project1.exe' read of address

سلام ، بهتره که این کد رو در OnDropDown اون ComboBox بنویسید نه در OnCreate یا OnShow فرم . فقط قبل از اون یک ComboBox1.Clear; رو هم بنویسید که هر بار Combobox باز میشه لیست رو جدید از بانک اطلاعاتی دریافت کنه .

برای مثال :


procedure TForm1.Combobox1DropDown(Sender: TObject);
begin
ComboBox1.Clear;
DataModule2.AdoTable1.First;
while not DataModule2.AdoTable1.eof do begin
ComboBox1.Items.Add(DataModule2.AdoTable1.Fieldbyn ame('name').asString;
DataModule2.AdoTable1.Next;
end;
end;

موفق باشید .

nightHunter
چهارشنبه 26 تیر 1387, 12:58 عصر
در onchange كومبوباكس اين كد را بنويس

ADOTable1.First;
while not ADOTable1.Eof do
begin
if ADOTable1.FieldValues['Name'] = ComboBox1.Text then
begin
Edit1.Text := IntToStr(ADOTable1.FieldValues['Page']);
Edit2.Text := IntToStr(ADOTable1.FieldValues['gheymat']);
end;
ADOTable1.Next;
end;البته فكر ميكنم با Locate هم بتوني همين كار را انجام بدهي

سلام ،

دوست عزیز برای اینکه مقادیر مربوطه رو درون ادیت باکسها نمایش بدید نیازی نیست یکبار دیگه جدول رو از ابتدا تا انتها پیمایش کنید ، این کار برای جداولی که رکوردهای زیادی دارند وقت گیر است . بهتره در این حالت از یک Query استفاده کنید ، چون فرض رو بر داشتن AdoTable گذاشتید مثالی رو با AdoQuery مینویسم .


AdoQuery1.Sql.Clear;
AdoQuery1.SQL.Text:='select * from TableName where name=' + '''' + ComboBox1.text + '''' ;
AdoQuery1.Open;
if AdoQuery1.recordCount>0 then begin
edit1.text:=AdoQuery1.fieldbyname('pages').asstrin g;
edit2.text:=AdoQuery1.fieldbyname('Price').asstrin g;
end;
این کد رو در OnChange اون ComboBox1 قرار بدید .

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