Combo box sorunu
stnonstop26.07.2005 - 11:18:55
Arkadaşlar üstadlar benim şu şekilde bir problemim var. Combo boxlarda 1 satır başına 1 değil 2 değer saklamak istiyorum birinci değer BWM MERCEDES vs gibi kullanıcıya gösterilecek olan bir değer olacak. Bu kısmı ADD() fonksiyonu yardımıyla Items a atarak yapabiliyorum. Ama benim için önemli olan BWM nin ID si örneğin 1 diyelim MERCEDES sinki 13 bu ID numaralarınıda Combobox da saklamak istiyorum Mercedes seçildiğinde benim 13 ID sine BMW seçildiğinde de 1 ID numarasına ulaşmam lazım.

Bunu HTML de ki comboboxda basit şekilde elde edebiliyoruz.

Name = Mercedes; Value = 13
Name = BMW ; Value = 1

gibi bir şekilde hem valuyu hem ismi saklaya biliyorsunuz. Yeri geldiğinde isimle yeri geldiğinde de değerle işlem yapabiliyorsunuz.
 
naile26.07.2005 - 11:23:15
Aynı itemsa yazacaksan ikisini de tek birini nasıl seçeceksin?
 
selimr26.07.2005 - 12:02:10
yanlış hatırlamıyorsam jedi comp. setinde 2 sutunlu bir combobox vardı
onu kullanabilirsin..
 
blacksea26.07.2005 - 12:03:15
Merhaba,
önce veritabanında bir tablo hazırla. bu tabloda 2 alan olsun.ilk alana arabano, diğer alanada arabamarkalarını gir.sonra normal combobox yerine lookupcombobox kullan. lookupcombobox kullanarak comboboxta itemsa değerleri kendin girmezsin veritabanındaki bir alanın değerlerini alabilirsin. mesela lookupcomboboxtan mercedesi sectiğinde veritabanındaki tablodaki aktif kayıt mercedes olacağından,bu kayıtta ait numarayı kullanabilirsin
kolay gelsin
 
selimr26.07.2005 - 12:06:00
şu anda aklıma gelen söyle birşey yapabilirsin belki..

iki adet combobox kullan

birincisinde name ler olsun,,

ikincisinde ID ler olsun.. isincisini form üzerinde gizli yap..

ve birincisinde seçim yaptığında, ikincisinde aynı itemde olanı alsın..

bilmem anlatabildimmi..
 
nitrokonat26.07.2005 - 12:14:58
Merhaba,
önce veritabanında bir tablo hazırla. bu tabloda 2 alan olsun.ilk alana arabano, diğer alanada arabamarkalarını gir.sonra normal combobox yerine lookupcombobox kullan. lookupcombobox kullanarak comboboxta itemsa değerleri kendin girmezsin veritabanındaki bir alanın değerlerini alabilirsin. mesela lookupcomboboxtan mercedesi sectiğinde veritabanındaki tablodaki aktif kayıt mercedes olacağından,bu kayıtta ait numarayı kullanabilirsin
kolay gelsin


+100. bence en profosyonel yöntem. nitekim ben de aynı işlemleri onlarca kez kullandım.

dblookupcombobox1.keyvalue

ile , istediğin id'e ulaşabilirsin.
 
aslangeri26.07.2005 - 12:24:51
s.a.
sana iki yol önereceğim.
1. sanırım @sadettinpolat arkadaşımızın bu konu ile ilgili bir makalesi vardı. onu oku.
2. @nitrokonat arkadaşımızın dediği gibi dblookupcombobox kullan.

kolay gelsin.
 
stnonstop26.07.2005 - 13:20:37
teşekkürler DBLookupCombo ile sorunumu çözdüm ilginiz için teşekkür ederim.
 
ZER026.07.2005 - 13:44:28
mrb foruma bir combobox birde label ekle sonr bu kodları yaz:

............
var
Form1: TForm1;
Liste:TStringlist;

implementation

{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);
begin
Liste:=TStringList.create;
Liste.add('1-BMW');
Liste.add('13-Mercedes');
combobox1.items.add(copy(Liste[0],pos('-',Liste[0])+1,length(Liste[0])));
combobox1.items.add(copy(Liste[1],pos('-',Liste[1])+1,length(Liste[1])));

end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
label1.caption:=copy(Liste[combobox1.itemindex],0,pos('-',liste[combobox1.itemindex])-1)
end;


başarılar kolay gelsin
 
stnonstop26.07.2005 - 14:52:48
Sanırsam biraz erken söyledik sorunu halettik diye. :) DBLookupComboBox kullanıdığımızda Text bölümü read only olduğundan herhangi bir veri girisine sahib değillim TComboBox da olduğu gibi. Ön tanımlı olarak DBLookupComboBox da nasıl bir itemı seçe biliriz. Mesela yukarıda verdiğim örnekte olduğu gibi BMW 1. sırada 13. sırada Mercedes geliyor. Ben Mercedesin Text bölümünde ön tanımlı olarak gelmesini istiyorum.
 
hdayi26.07.2005 - 15:18:16
dblookupcombobox'ta veri girişini veritabanına yapman gerekiyor.
 
miskin26.07.2005 - 15:24:41
Sanırsam biraz erken söyledik sorunu halettik diye. :) DBLookupComboBox kullanıdığımızda Text bölümü read only olduğundan herhangi bir veri girisine sahib değillim TComboBox da olduğu gibi. Ön tanımlı olarak DBLookupComboBox da nasıl bir itemı seçe biliriz. Mesela yukarıda verdiğim örnekte olduğu gibi BMW 1. sırada 13. sırada Mercedes geliyor. Ben Mercedesin Text bölümünde ön tanımlı olarak gelmesini istiyorum.


degerlerini nerden aliyorsun? herhangi bir databaseden mi?, kullanicidan mi?

Olmazsa TComboboxdan yeni bir bilesen türet, Item kismini degistir.
 
sadettinpolat26.07.2005 - 15:26:35
Comboboxta string değerler gözükürken kullanıcının seçimine göre seçilen stringe ait ID değerine ulaşmak isteriz. Bunun için genelde dblookupcombobox kullanılır. Standart combobox ile bu işlemi halletmek isteyen kullanıcılar bu yöntemi kullanabilirler....

Degerleri combobox a eklemek icin :

Combobox1.items.AddObject('Rize', TObject(53));
Combobox1.items.AddObject('Ankara', TObject(6));
Combobox1.items.AddObject('İstanbul', TObject(34));


Seçilen değerin ID alanına ulaşmak için de :

Deger := Integer(Combobox1.items.Objects[Combobox1.ItemIndex]);
 
stnonstop26.07.2005 - 15:27:18
veri girişi yapmak değil demek istediğim. comboboxsa çektiğim verilerden birinin ön tanımlı olarak gösterilmesini istiyorum.
 
ZER026.07.2005 - 15:33:57
mrb eğer yukarda benim yazdığım kodlara bakarsan combodan seçtiğin değere karşılık ikinci bir değer labelde gözükecektir.
 
stnonstop26.07.2005 - 15:59:53
pardon hdayinin mesajına cevap yazmıştım ama ben gönderinceye kadar bir çok cevap eklenmiş. İlk olarak verileri veritabanından alıyorum. Biz kayıtta düzeltme yapmak için bu tarzda bir combobox a ihtiyaç duydum. DblookupComboBox işimi çok iyi görüyor kod karmaşamı önemli ölçüde azaltıyor fakat düzeltmeden önceki değerlerin seçili gelmesini istiyorum. Bunu beceremedim.

TComboBox da ise 40 satır kod 3 tane fonksiyon yazdıktan sonra DblookupCombo Boxa yaklaşıp geçiyor fakat bu seferde AddObject ile uğraşmak istemdeiğimden işlemler olmuyordu AddObject siz olmayacak anlaşıldı.
 
stnonstop27.07.2005 - 09:55:05

SubeNameComboBox->Items->AddObject(DM->IBQuery1->FieldValues["SUBENAME"], TObject(DM->IBQuery1->FieldValues["SUBE_ID"]));
DM->IBQuery1->Next();


Gibi bir kod yazmaya çalışıyorum fakat

[C++ Error] KasaNoDuzeltFormUnt.cpp(52): E2285 Could not find a match for 'TObject::TObject(Variant)'
[C++ Error] KasaNoDuzeltFormUnt.cpp(52): E2459 VCL style classes must be constructed using operator new

şeklinde hata alıyorum. bunu nasıl aşabilirim ???? TObject ti bu şekilde kullanamıyacam
 
sadettinpolat27.07.2005 - 15:29:24
FieldValues["SUBE_ID"] yerine fieldbyname(SUBE_ID).AsString tarzı bir yol dene. 1. örnekte geriye variant döndüğünden dolayı bir sıkıntı çıkıyor olabilir...
 
stnonstop27.07.2005 - 16:24:44

int SubeID;

SubeID = DM->IBQuery1->FieldValues["SUBE_ID"];
SubeNameComboBox->Items->AddObject(DM->IBQuery1->FieldValues["SUBENAME"], (TObject *) SubeID));
DM->IBQuery1->Next();


sorun çözüldü. sadettinpolat tın da dediği gibi geriye variant diye döndüğünden hata çıkıyormuş. Sağolun.

Not: BCB 6 da bir türlü
...->fieldbyname(SUBE_ID).AsString şeklinde tanımlama yapamadım Structure required on left side of . or .* şeklinde bir hata alıyordum.

-------------------------------------------
Kod a ufak bir eksiklik vardı onu düzelttim
 
sadettinpolat27.07.2005 - 16:32:46
bildiğim kadarıyla vcl her iki platformda da aynı özellik ve metodlara sahip. yazım konusunda bir sıkıntı olabilir. yardım bölümünde detaylı bilgi bulabilirsiniz.
 
stnonstop28.07.2005 - 11:51:32

void __fastcall TKasaNoDuzeltForm::FormShow(TObject *Sender)
{
AnsiString SQL;
int RecCnt, SubeID, MusteriID;
SQL = "select * from KASANO where KASANO_ID = '"+KasaIDEdit->Text+"' ";

KasaNoEdit->DataSource = DM->dsKasaEdit;
DM->QuerySelectSetup(DM->IBKasaEdit, SQL);

// SubeNameComboBox ve MusteriNameComboBox Textlerinin Ön seçimli olarak alınması
SQL = "select SUBE.SUBENAME, MUSTERI.MUSTERI_NAME ";
SQL += "from SUBE, MUSTERI ";
SQL += "where SUBE.SUBE_ID = '"+DM->IBKasaEdit->FieldValues["SUBE_ID"]+"' ";
SQL += " and MUSTERI.MUSTERI_ID = SUBE.MUSTERI_ID";

DM->QuerySelectSetup(DM->IBQuery1, SQL);
SubeNameComboBox->Text = DM->IBQuery1->FieldValues["SUBENAME"];
MusteriNameComboBox->Text = DM->IBQuery1->FieldValues["MUSTERI_NAME"];

// SubeNameComboBox Doldurulması
SQL = "select * from SUBE where MUSTERI_ID = '"+DM->IBKasaEdit->FieldValues["MUSTERI_ID"]+"' ";
DM->QuerySelectSetup(DM->IBQuery1, SQL);
DM->IBQuery1->Last();
RecCnt = DM->IBQuery1->RecordCount;
DM->IBQuery1->First();
for (int i=0; i<RecCnt; i++)
{
SubeID = DM->IBQuery1->FieldValues["SUBE_ID"];
SubeNameComboBox->Items->AddObject(DM->IBQuery1->FieldValues["SUBENAME"], (TObject*) SubeID);
DM->IBQuery1->Next();
}
// MusteriNameComboBox Doldurulması
SQL = "select * from MUSTERI ";
DM->QuerySelectSetup(DM->IBQuery1, SQL);
DM->IBQuery1->Last();
RecCnt = DM->IBQuery1->RecordCount;
DM->IBQuery1->First();
for (int i=0; i<RecCnt; i++)
{
MusteriID = DM->IBQuery1->FieldValues["MUSTERI_ID"];
MusteriNameComboBox->Items->AddObject(DM->IBQuery1->FieldValues["MUSTERI_NAME"], (TObject*) MusteriID);
DM->IBQuery1->Next();
}
}
//---------------------------------------------------------------------------

void __fastcall TKasaNoDuzeltForm::SubeNameComboBoxChange(TObject *Sender)
{
AnsiString SQL;
ShowMessage(SubeNameComboBox->ItemIndex);
}
//---------------------------------------------------------------------------

void __fastcall TKasaNoDuzeltForm::MusteriNameComboBoxChange(
TObject *Sender)
{
AnsiString SQL;
int MusteriID, RecCnt, SubeID;

/* MusteriComboBox sında backspacese basılması nedeniyle oluşan hatayı engeller ;*/
if (! MusteriNameComboBox->Enabled)
{
MusteriNameComboBox->Enabled = true;
MusteriNameComboBox->Text = "";
MusteriNameComboBox->SetFocus();
return;
}
/* MusteriNameComboBox sında olmayan bir item ın seçilmeye çalıştığı sırada
oluşan out of index hatasının oluşmasını engeller */
if (MusteriNameComboBox->ItemIndex == -1)
{
return;
}
/* ----------------------------------------------------------------------*/
MusteriID = int(MusteriNameComboBox->Items->Objects[MusteriNameComboBox->ItemIndex]);
SQL = "select * from SUBE where MUSTERI_ID = '"+IntToStr(MusteriID)+"' ";
DM->QuerySelectSetup(DM->IBQuery1, SQL);
DM->IBQuery1->Last();
RecCnt = DM->IBQuery1->RecordCount;
DM->IBQuery1->First();

if (RecCnt == 0)
{
return;
}
SubeNameComboBox->Items->Clear();
SubeNameComboBox->Text = DM->IBQuery1->FieldValues["SUBENAME"];
for (int i=0; i<RecCnt; i++)
{
SubeID = DM->IBQuery1->FieldValues["SUBE_ID"];
SubeNameComboBox->Items->AddObject(DM->IBQuery1->FieldValues["SUBENAME"], (TObject*) SubeID);
DM->IBQuery1->Next();
}
}
//---------------------------------------------------------------------------

void __fastcall TKasaNoDuzeltForm::MusteriNameComboBoxKeyPress(
TObject *Sender, char &Key)
{
int intKey;
intKey = int(Key);
if (intKey == 13 )
{
MusteriNameComboBoxChange(Sender) ;
}
else if (intKey == 8)
{
// Backspacese basıldığında MusteriComboBoxı ayarlaması
MusteriNameComboBox->Enabled = false;
return;
}
}
//---------------------------------------------------------------------------


Sonunda çözdüm. :) Umarım. İki combo boxu içindeki değerlerle birbirine bağlamayı düşünen arkadaşlara en azından bir fikir vermesi için yardımcı olur. Hoş ben BCB kullanıyorum ama benzer sonuçta...
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com