DBCombobox a kullanıcının eleman girebilmesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

DBCombobox a kullanıcının eleman girebilmesi

Mesaj gönderen oguzozturk74 »

S.A.

Arkadaşlar sorunum , DBCombobox a kullanıcı tarafından eleman girilebilmesini sağlamak. Fakat yazdığım kodlar ile ilgili formda iken o an eklemeleri yapabiliyorum. Ama o formu kapatıp tekrar geriye geldiğimde DBCombox ta sadece en son eklediğim tek bir eleman kalıyor , diğerleri kayboluyor. :x Ben eklenen elemanların baki kalmasını istiyorum. İşin içinden çıkamadım.
Bunun için 3 ayrı kod denedim:

procedure TFrmyem.Button1Click(Sender: TObject);
var
x:boolean;
s:string;
begin
s:='Küspe';
x:=inputquery('Yem Cinsi Girişi','Yemin Cinsi',s);
if x=true then
begin
if DBComYem.Items.IndexOf(s)>-1 then
showmessage(s+'adlı Yem Cinsi zaten var')
else
begin
DM1.T1.Edit;
DBComYem.Items.add(s);
DM1.T1.Post;
end;
end
else abort;
end;

procedure TFrmyem.Button2Click(Sender: TObject);
begin
if DBComYem.text<>emptystr then
DM1.T1.Edit;
DBComYem.Items.add(DBComYem.text);
DM1.T1.Post;
end;

procedure TFrmyem.Button3Click(Sender: TObject);
begin
if DBComYem.text<>emptystr then
if DBComYem.Items.IndexOf(DBComYem.text)=-1 then
begin
DM1.T1.Edit;
DBComYem.OnChange:=nil;
DBComYem.Items.add(DBComYem.text);
DBComYem.Itemindex:=DBComYem.Items.IndexOf(DBComYem.text);
DBComYem.OnChange:=DBComYem.onChange;
DM1.T1.Post;
end;
end;

Not: Tek bir tane veritabanı tablom var ve onuda Datamodule de tutuyorum.
Delphi7 ve Paradox kullanıyorum.

Saygılar :wink:

Oğuz ÖZTÜRK
E-mail: oguzozturk74@yahoo.com
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Combobox'in içeriğini açmadan önce veritabanınızdan aldiginiz bilgiler ile sizin doldurmanız gerekiyor. Asagidaki ilke linkte Combobox'in dropdown eventine yazilacak bu işi yapan bir kod örneği de var. Diger linkte de daha önce combobox ile ilgili benzer konunun detaylari var.


viewtopic.php?t=1629
viewtopic.php?t=80


NOT: forum artık çok geniş bir hazineye döndü. Sorulan sorularin bir kısmı daha önceden forumda muhtemelen geçmiş olabiliyor. Arama kısmından bir iki denemede sanırım bu cevaplara hiç beklemeden de ulaşabilirsiniz.

Kolay gelsin.....
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Mustafa Abi DBLookUpComboBox kullanılabileceğini yazmış.
DBLookUpComboBox alandaki bütün kayıtları bire indirip göstermekte çok iyi ancak ben burada gösterilen bilgileri seçip farklı bir veri tabanına kaydetmeyi başaramadım. Yani sadece item leri görebiliyorum ama seçemiyorum. Bunun yerine aşağıdaki gibi bir yöntem kullandım. Farklı yerlerde farklı yöntemlerde kullandığım oldu ama bir tanesini yazıyorum. İnşallah işinize yarar. Kolay gelsin

procedure TKAYIT.FormShow(Sender: TObject);
VAR
A,B:INTEGER;
begin
table1.Active:=TRUE;
table1.First;
FOR A:=1 TO table1.RecordCount DO
BEGIN
dbCOMBObox1Items.Add(table1.FieldValues['KOYLER']);
dbcombobox1.Next;
END;
end;

asedizer@hotmail.com
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

DBCombobox a kullanıcının eleman girebilmesi

Mesaj gönderen oguzozturk74 »

S.A.

Fahrettin Abi ye ve ASE arkadaşa ilgilerinden dolayı teşekkür ederim.
Verdiğiniz linklere baktım ve ASE nin de verdiği koda benzer bir kod var, her ikisini de kendime göre bir kaç değişik şekilde denedim fakat optimum bir çözüme ulaşamadım.
Bunla ilgili 2 tane formum var ve her iki formdaki alanlar aynı Table da tutuluyor.

1* DBCombobox a elemanı ekliyorum ( RunTime da )ve DBCombobox dan çıkıyorum, DBCombobox a geri dönüyorum ve en son eklediğim elemandan ayrı kendi kendine mevcut elemanların hepsinden birdaha eklemiş oluyor.Ör: DBCombobox da A,B elemanları var iken ben C yi ekliyorum, o daha sonra C nin yanında diğer A ve B yi de eklemiş oluyor.Sonuçta Box un içinde A,B,C,A,B oluyor.

2* Bu kodu kullandığımda diğer sorun ise ; 2. forma , hangi kayıttan gelirsem geleyim , tekrar 1. forma döndüğümde hep Table da ki En Son kayıtı gösteriyor. Halbuki benim aynı kayıt üzerinde çalışmam gerekiyor.

Ayrı ayrı hem 2. formun OnShow olayına ve hem de DBCombobox un OnDropDown olayına aşağıdaki kodu yazıyorum ama olmuyor.

Kod:
VAR
A:INTEGER;
begin
if DM1.T1.active=true then begin
DBComYem.Items.Clear;
while not DM1.T1.Eof do
begin
DM1.T1.First;
FOR A:=1 TO DM1.T1.RecordCount DO
BEGIN
DBComYem.Items.Add(DM1.T1.Fieldbyname('Yem').asstring);
DM1.T1.Next;
END;
end;
end;
end;

Hata nerede bulamıyorum...

Saygılar, Oğuz Öztürk
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Benim yazdığım kod aslında bir alana yazılmış elemanları combonun içine almaya yarıyor. Basit ve sade bir yöntem. Combonun içine alacağın elemanları önceden okutacağın yere kaydetmiş olman gerekiyor yani. Orada sanırım mustafa abinin yazdığı cevapta başka bir kayıttan okutman önerilmişti ben buna dayanarak gönderdim bu kodu. Yani önce combonun içine alacağın elemanları bir veri tabanına kaydetmen gerekiyor. Sonrasında gönderdiğim kod sorunsuz çalışacaktır. Ancak yapmak istediğin daha farklı birşeyse örnek vererek açıklarsan yardımcı olmaya çalışırız kolay gelsin...
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Mesaj gönderen TRSoft »

Merhabalar

Arkadaşlar ben böyle durumlarda DbComboBox'ın ıtemlerini bir ini dosyaya kaydediyorum ne kadar doğru bilmiyorum ama belki işini görür.

Öncelikle
ini dosya ile çalışmak için Uses kısmına "inifiles" eklememiz gerekiyor.

Itemleri kayıt etmek için

Kod: Tümünü seç

Var
   Ini : TIniFile;
   i,ItemSayisi : Integer;
begin
     ini:=TiniFile.Create(ExtractFilePath(Application.Exename)+'\Dosya.ini');
     ItemSayisi:=DbCombobox1.Items.Count;
     ini.WriteInteger('KaySay','Kayıt Sayısı',ItemSayisi);
     For i:=0 To ItemSayisi-1 Do
     Begin
          ini.WriteString('Itemler','Item '+IntToStr(i+1),DbCombobox1.Items.Strings[i]);
     End;
     ini.Free;
end;
Çağırmak içinse

Kod: Tümünü seç

Var
   Ini : TIniFile;
   i,ItemSayisi : Integer;
begin
     ini:=TiniFile.Create(ExtractFilePath(Application.Exename)+'\Dosya.ini');
     ItemSayisi:=ini.ReadInteger('KaySay','Kayıt Sayısı',0);
     If ItemSayisi>0 Then
     Begin
          For i:=1 To ItemSayisi do
          Begin
               DbCombobox1.Items.Add(ini.ReadString('Itemler','Item '+IntToStr(i),''));
          End;
     End;
     ini.Free;
end;
kodlarını kullanıyorum. Umarım işinizi görür. Herkese iyi akşamlar.
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Ben de daha önceleri TRSoft un kullandığı yöntem, kullanıyordum ama daha sonra veri tabanı dosyası kullanmanın daha doğru olduğuna karar verdim. Çünkü veri tabanı dosya sı kullandığım zaman hem kaydın sadece bir tane olmasını daha kolay kontrol edebiliyorum hemde kayıt yapması ve kayıttan çağırması daha basit oluyor diye düşünüyorum. Her ikisi de olabilecek yöntemler. Hatta kullanıcıların bu kayıtları görmesini istemiyorsanız farklı dosya uzantıları ilede kayıt yapmak mümkün. Artık gerisi biraz da programcı mantığına kalıyor ama burada gördüğüm kodların sorunu yeterince cevaplayacağını umuyorum. Yok illaki ben itemleri çalışma zamanı kaydedeceğim program bunu tutacak ve diğer açtığım zaman bu kayıtlar kalacak diyorsan ben bu yöntemlerden başkasını henüz başaramadım. Bulursanız benimde haberim olsun. Herkese kolay gelsin
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

DBCombobox a kullanıcının eleman girebilmesi

Mesaj gönderen oguzozturk74 »

S.A.

Arkadaşlar biraz sık boğaz olduk fakat 4-5 gündür bir DBCombobox a eleman ekleyemedim. :( Verdiğiniz bilgiler ışığında ve kendi kaynaklarımdan birşeyler yapmaya çalışıyorum ama olmuyor, Her seferde başka bir yerden hata veriyor, aynı hamur sıkmaya benzedi , bir tarafını sıksam diğer taraftan çıkıyor.
Daha somut bir şekilde sorunumu kısaca açıklayayım:

:arrow: 3 tane formum var, ve bunların hepsindeki alanlar tek bir Table da tutuluyor, Table da bir Datamodule de tutuluyor.
Birinci formumda à Adı,Telefonu, Adresi ve Kayıt tarihi var. Kullanıcı müşteri bilgilerini kaydediyor ve aynı kayıtta iken ikinci form olan SütGirişi formuna ulaşıyor.Buradada gelen SütMiktarını,Tarihini, Tutarını ve AvansMiktarını kaydediyor.Eğer Avansı para olarak değilde, örneğin Küspe veya Diğer Yem çeşitleri şeklinde ödeyecek ise ; başka bir form olan üçüncü bir forma giderek . Burada ise YemCinsi, Tarihi ve Miktarı alanları var. İşte sorunda burada başlıyor. YemCinsi alanını bir DBCombobox a bağladım. İstediğim ise kullanıcının bu DBCombobox a direk olarak kendi isteğine göre YemCinsi ni girebilmesi.Daha sonra başka bir müşteri kaydından bu üçüncü forma geldiğinde daha önceden girdiği YemCinslerini DBCombobox içinde görebilmesi.Ayrıca bir defa girilen YemCinsi birdaha girilmemeli.(Bunu sanırım Secondary Index yapmam lazım?).
Umarım herşeyi açıklayabildim.

:arrow: Bundan sonraki satırlar başka bir soruyu içerdiği için Mustafa Bey kızabilir ama kanımca yukardaki ile bire bir ilişkili. O da ; Mesela adam hergün süt getiriyor. Bir defa kaydı (Birinci formumda) yapıldıktan sonra ikinci form ve üçüncü bir formalara sürekli kayıtlar girilecek. Hiçbir alanımın Primary veya Secondary Index olmamasına rağmen en son yapılan kayıt önceki kaydın üzerine yazılıyor ve tek bir kayıt halini alıyor. :? Edit ve Post kullandığım zaman böyle birşey olması gerekmez mi? Ben Append kullanıyorum.

Kod:
procedure TFrmyem.BtnKaydetClick(Sender: TObject);
var
book:TBookmark;
begin
Book:=DM1.T1.getbookmark;
if DM1.T1.active=true then
DM1.T1.Append;
DBEYmik.SetFocus;
DM1.T1.gotobookmark(Book);
DM1.T1.freebookmark(Book);
end;

Saygılar, Oğuz Öztürk
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Kardeş kusura bakma ama sen baştan kaybediyorsun gibi geldi bana...
Yani böyle bir yapıyı master detail ile halletmeni tavsiye ederim. Yani aynı insanları aynı veri tabanına kaydettiğin zaman hesapları toplamada ve müşterinin bilgilerini tutmada çok zorlanırsın. Veri tabanın ne şu bilemiyorum ama benim comboboxla ilgili yazdığım kod bir iki '' işareti değişikliği ile paradox, advantage ve access veri tabanlarında sorunsuz çalışıyor "BİTTECRÜBE SABİTTİR". Neden çalıştıramadığını inanki anlayamadım. Ama dediğim gibi sen yem cinsleri diye bi ver tabanı alanı oluştur bunu bence ayrı bir tabloda tut ve index olarak tanımla ki bir daha giriş olmasın aynı cinsten. Bu tabloyu parametreler ya da sabitler diye bir alandan giriş yaptırarak kullanıcının istediği değerleri girmesini, silmesini ve değiştirmesini sağlaya bilirsin. Bu alanda kayıtlı olan verileri comboya okutup kullanabilirsin eğer olmazsa bu alanla ilgili olan kodları aynen yaz deneyerek çözmeye çalışalım. Kolay gelsin...
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Ase kardeş gerçekten de Allah razı olsun, çok ilgilendin. Dediğin yoldan deneyeceğim. Acemilik işte. İnşallah bu sefer yaparım.

Saygılar, Oğuz Öztürk
Cevapla