DBComboBox ile Ilgili Bir Soru

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ChangeoveR
Üye
Mesajlar: 29
Kayıt: 12 Mar 2008 03:29

DBComboBox ile Ilgili Bir Soru

Mesaj gönderen ChangeoveR »

Sevgili arkadaslar;

Su an yeni bir proje hazirlamaktayim ve dogal olarak bir onceki projemde edindigim deneyimlerimi bu projemde hizli bir sekilde uygulama sansim oluyor. Haziladigim yeni projemde ozelkod adli bir alan mevcuttur.

Yapmak istedigim sey tam olarak su: Bu alani temsilen bir DBComboBox kullanmak istiyorum ve bu bilesene yazmaya basladigim andan itibaren hangi harfe basmissam o'nunla ilgili tum kodlarin bu bilesene eklenmesini ve bu bilesenin de otomatik olarak acilmasini istiyorum.

Bu konuda birkac denemem oldu, kismen de basardim; ama istedigim gibi olmadi. Bundan aylar once baska bir konu icin arastirma yaptigimda boylesi bir konuya ve bu konuda yazilmis bir koda denk gelmistim, simdi uzun uzun arastirma yapmama ragmen bulamadim.

Sizden dilegim, bu konuda bana yardimci olmaniz ya da ilgili ornekleri benimle paylasmaniz seklindedir. Yardimci olacak arkadaslara simdiden tesekkurler...
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen mkysoft »

bahsettiğiniz özellik MRU olarak geçmektedir, bu şekilde arayınca örnek bulabilirsiniz.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen Lord_Ares »

dbcombo ile deilde normal combobox ile şöyle bişey kullanmıştım. formuma birtane combobox bileşeni koyup içerisine veritabınındaki bilgileri çekiyor ve combobox içinde herhangi bir harfe bastığımda kayıtları filitreleyerek comboboxta gösteriyordu.
kodlar şöyleydi.

Kod: Tümünü seç

procedure TDATA.COMBO_DOLDUR(DATA, ALAN, SECILEN_KAYIT:STRING; ISLEM_GOREN_COMBO:TObject);
VAR
X:INTEGER;
Sorgu:TQuery;
begin
  Sorgu:=TQuery.Create(Self);
Sorgu.DatabaseName:=ANA.EXEKLASOR+'DATA';
          WITH SORGU DO BEGIN
        SQL.Clear;
        SQL.Add('Select '+ALAN+' FROM '+DATA);
        SQL.Add('ORDER BY '+ALAN);
        OPEN;
        FieldDefs.Update;
                            END;
(ISLEM_GOREN_COMBO AS TComboBox).Items.Clear;
FOR X:=0 TO Sorgu.RecordCount-1 DO BEGIN
(ISLEM_GOREN_COMBO AS TComboBox).Items.Add(Sorgu.FieldByName(ALAN).AsString);
IF SECILEN_KAYIT=Sorgu.FieldByName(ALAN).AsString THEN (ISLEM_GOREN_COMBO AS TComboBox).ItemIndex:=X;
Sorgu.Next;
                                   END;
Sorgu.Close;
Sorgu.Free;
end;

procedure TDATA.COMBO_ARA(DATA, ALAN, ARANAN:STRING; BULUNACAK_ALANLAR :ARRAY OF STRING ; DOLDURULACAK_NESNELER :ARRAY OF TObject);
VAR
X:INTEGER;
Sorgu:TQuery;
SEL:STRING;
begin
IF LENGTH(BULUNACAK_ALANLAR)>0 THEN BEGIN

  Sorgu:=TQuery.Create(Self);
Sorgu.DatabaseName:=ANA.EXEKLASOR+'DATA';
        WITH SORGU DO BEGIN
        SQL.Clear;
SEL:='Select ';
FOR X:=0 TO LENGTH(BULUNACAK_ALANLAR)-1 DO BEGIN
                                           SEL:=SEL + BULUNACAK_ALANLAR[X];
                                           IF X< LENGTH(BULUNACAK_ALANLAR)-1 THEN SEL :=SEL + ',';
                                           END;

        SQL.Add(SEL+' FROM '+DATA);
        SQL.Add('Where '+ALAN+' = '+QuotedStr(ARANAN));
        OPEN;
        FieldDefs.Update;
                            END;

FOR X:=0 TO LENGTH(BULUNACAK_ALANLAR)-1 DO BEGIN
         IF DOLDURULACAK_NESNELER[X].ClassName='TEdit' then (DOLDURULACAK_NESNELER[X] as TEdit).Text:=Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).AsString;
         IF DOLDURULACAK_NESNELER[X].ClassName='TComboBox' then begin
                                   if Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).DataType=ftString then (DOLDURULACAK_NESNELER[X] as TComboBox).Text:=Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).AsString;
                                   if Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).DataType=ftInteger then (DOLDURULACAK_NESNELER[X] as TComboBox).ItemIndex:=Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).AsInteger;
                                                                end;


                                           END;
Sorgu.Close;
Sorgu.Free;
                                   END;
end;

Kullanımı şöyleydi
combobox hangi formda ise mesela Form1 de, o formun creatine şunu yazıyorduk.
COMBO_DOLDUR('musteridata','musterikodu','',Form1.ComboBox1);

comboboxın onchange kısmına şunu yazıyorduk.

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
COMBO_ARA('musteridata','musterikodu',ComboBox1.Text,['musteriadı'],[ComboBox1]);
end;

kolay gelsin
ChangeoveR
Üye
Mesajlar: 29
Kayıt: 12 Mar 2008 03:29

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen ChangeoveR »

Lord_Ares ,

Verdiginiz kodlari deneme sansim oldu; fakat soyle bir problemle karsilastim. Tanimlanmis olan alanlarin disinda tanimlanmamis bir veri girmeye calistigimda ComboBox bileseni buna karsilik vermedigi gibi, deger girmeme de izin vermiyor.

Oysa niyetim bilesenin var olan kodlari listelemesi, olmayan kodu da yazmaya izin vermesi ve benim de bunu tablolarima yazmama firsat vermesiydi.

Verdiginiz kodu su sekilde kullandim :
procedure TForm1.FormCreate(Sender: TObject);
begin
COMBO_DOLDUR('musteri','ozelkod1','',Form1.ComboBox1);
end;


procedure TForm1.ComboBox1Change(Sender: TObject);
begin
COMBO_ARA('musteri','ozelkod1',ComboBox1.Text,['ozelkod1'],[ComboBox1]);
end;

mkysoft ,

MRU terimini ilk defa duydum ve bu konuda biraz arastirma yapmam yerinde olacak sanirim.


Her ikinize de ilgilendiginiz icin tesekkur ederim...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen Lord_Ares »

yanlış anladıysam kusura bakma, sanırım tanımlanmamış alan derken, veri tabanında olmayan bir alan mı yoksa comboara da alanı yazmadığın için mi . eğer comboboxta bir çok alan yazmak istersen aralarına virgul koyarak çoğaltabilirsin.

COMBO_ARA('musteri','musteriler2','ozelkod1','ozelkod2','ozelkod3',ComboBox1.Text,['ozelkod1'],[ComboBox1]);

yukarıdaki şekilde aralarına virgul atarak bir çok data ve alan seçebilirsin, hatta doldurulcak nesnede seçebilirsin
ekleme işi ise şöyle olabilir
formunda bir adet edit koyup combobox ile doldurulan bilgi aynı zamanda editede yazdırılabilir.Kayıt işleminde kolaylık olur. Dersen ki ben combobox kullanacağım, ozaman combo_Ara kısa bir if değer var sagöster yoksa table bir append diyerek kısa bir döngü ile osunu çözebileceğini düşunuyorum .
kolay gelsin
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen Lord_Ares »

Merhaba sana ufak bir örnek yaptım. Sanırım dediğin gibi oldu bir incelersen sevinirim. eksik varsa söylersen bildiğim kadarıyla yardımcı olurum
Örneği denerken şunu unutmuşum,comboboxa bişeyler yazdığın backspace tuşu ile tek bir harf sildiğinde tekrar arama yapmasını sağlamak.
onuda şöyle yapcaksın comboboxın onchance kısmında eğer basılan tuş backspace ise tekrar ara ve doldur demelisin
kolay gelsin
Dosya ekleri
ORNEK.rar
ornek
(11.72 KiB) 112 kere indirildi
ChangeoveR
Üye
Mesajlar: 29
Kayıt: 12 Mar 2008 03:29

Re: DBComboBox ile Ilgili Bir Soru

Mesaj gönderen ChangeoveR »

Lord_Ares yazdı:Merhaba sana ufak bir örnek yaptım. Sanırım dediğin gibi oldu bir incelersen sevinirim. eksik varsa söylersen bildiğim kadarıyla yardımcı olurum
Örneği denerken şunu unutmuşum,comboboxa bişeyler yazdığın backspace tuşu ile tek bir harf sildiğinde tekrar arama yapmasını sağlamak.
onuda şöyle yapcaksın comboboxın onchance kısmında eğer basılan tuş backspace ise tekrar ara ve doldur demelisin
kolay gelsin
Tesekkur ederim, guzel calisma olmus ve ellerinize saglik. Ben de bu konuda yaptigim arastirmalar neticesinde tam istedigim isi yapan bir koda denk geldim ve yapmak istedigim seyle butunlestirdim ve oldu.

Kodlar aynen soyle (Umarim birilerinin isine yarar) :
Var
LastKey : Word;

procedure TMusteriForm.OzelKod1ComboBoxKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
LastKey := Key;
end;

procedure TMusteriForm.OzelKod1ComboBoxChange(Sender: TObject);
var
Aranan: string;
index: Integer;
begin

Aranan := (Sender as TCombobox).Text;

if LastKey = $08 then
begin
LastKey := 0;
Exit;
end;

LastKey := 0;

Modul1.kayit_varmi.Active := False;
Modul1.kayit_varmi.SQL.Clear;
Modul1.kayit_varmi.Parameters.AddParameter.Name := 'deger';
Modul1.kayit_varmi.SQL.Add('select Distinct ozelkod1, ozelkod2 from musteri where');
if (Sender As TComboBox).Name = 'OzelKod1ComboBox' then
Modul1.kayit_varmi.SQL.Add('ozelkod1 like :deger') else
Modul1.kayit_varmi.SQL.Add('ozelkod2 like :deger');
Modul1.kayit_varmi.Parameters.ParamByName('deger').Value := (Sender as TcomboBox).Text+'%';
Modul1.kayit_varmi.Active := True;

if Modul1.kayit_varmi.RecordCount > 0 then
begin
(Sender as TComboBox).Items.Clear;
Modul1.kayit_varmi.First;
while not Modul1.kayit_varmi.Eof do
begin
if (Sender As TComboBox).Name = 'OzelKod1ComboBox' then
(Sender As TComboBox).Items.Add(Modul1.kayit_varmi.Fields[0].Value) else
(Sender As TComboBox).Items.Add(Modul1.kayit_varmi.Fields[1].Value);
Modul1.kayit_varmi.Next;
end;
end;

Index := (Sender as TCombobox).Perform(CB_FINDSTRING, -1, Longint(PChar(Aranan)));
if Index > CB_ERR then
begin
(Sender as TCombobox).ItemIndex := Index;
(Sender as TCombobox).SelStart := Length(Aranan);
(Sender as TCombobox).SelLength := (Length((Sender as TCombobox).Text) - Length(Aranan));
end;

end;
Cevapla