Otomatik Tamamlama (Auto Compalate)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
struggler
Üye
Mesajlar: 12
Kayıt: 21 Kas 2013 12:58

Otomatik Tamamlama (Auto Compalate)

Mesaj gönderen struggler »

Resim
Yukarıda resimde yer alan kısma benzer bir örneği combobox ile yapmaya çalıştığımız an olmuyor.

Yukarıdaki resim Mhrs'deki yapıdır. İlin içerisinde geçen birkaç harf yazıldığı an o illere ait sorgulamalar yapılıyor ve 1. bulunan kayıtta seçili geliyor. Bizim bunu delphide combobox ile yapmamıza imkan yok zannedersem. Çünkü combobox'ın change kısmına yazarsak programı çalıştırıp yazı yazmaya başladığımız esnada çok kayıt içerisinde arama yapacak oldu mu kasma yapacak ve her harfe başımızda bir bekleme süresi olacak ve ayrıca ilk bulunan kaydı seçtirecek olursak da yazı otomatik tamamlanıp tek kayıt kalacak. Bunun yavaşlama olmadan bu şekilde bir yolu var mı acaba ?

Kod: Tümünü seç

Hello world
[/b]
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Otomatik Tamamlama (Auto Compalate)

Mesaj gönderen barisatalay »

dblookupcombobox ile yapmayı denediniz mi büyük ihtimal işinizi görecektir.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Otomatik Tamamlama (Auto Compalate)

Mesaj gönderen SimaWB »

:ara memory table, memory dataset
There's no place like 127.0.0.1
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Otomatik Tamamlama (Auto Compalate)

Mesaj gönderen Lord_Ares »

Merhaba , Mrmarman hocamızın şu konu başlığı ( Combobox gibi kelime tamamlayıcılı arama nasıl?) altında böyle bir cevabı ve örneği vardı inceleyin belki işinize yarayabilir.

viewtopic.php?f=2&t=3291&p=174446&hilit ... ma#p174446
mrmarman yazdı:- Dilersen üçüncü parti bu işi yapan bileşenler de kullanabilirsin, veya DBLookUpComboBox ile veritabanından direkt güdümleyebilirsin.

- Klasik ComboBox kullanmak istersen de sana senin anlayacağın şekilde basitleştirilmiş halini aşağıda veriyorum. Sana yeterlidir umarım. Örnek proje de ekte.... :idea:

Kod: Tümünü seç

procedure TForm1.FormShow(Sender: TObject);
begin
  ADOQuery1.Connection := ADOConnection1;
  DataSource1.DataSet  := AdoQuery1;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'
  +'Data Source='+ExtractFilePath(Application.Exename) + 'Database.mdb';
end;

// SQL Arama Fonksiyonu
procedure AramaYap( strAra: String; AdoQuery:TAdoQuery );
begin
  With AdoQuery do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT M_Name FROM DivXTurk');
    SQL.Add('WHERE 1=1');
    SQL.Add('AND M_Name like '+QuotedStr( strAra+'%' ) + ' ORDER BY M_Name' );
    Active := True;
  end;
end;

procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key <> vk_Return then
  begin
    AramaYap( TComboBox(Sender).text, ADOQuery1 );
    TComboBox(Sender).Items.Clear;
    TComboBox(Sender).AutoComplete := False;
    TComboBox(Sender).DroppedDown  := True;
    while NOT ADOQuery1.Eof do
    begin
      TComboBox(Sender).Items.Add( ADOQuery1.FieldByName('M_Name').AsString );
      ADOQuery1.Next;
    end;
    TComboBox(Sender).SelStart := Length(TComboBox(Sender).Text);
    TComboBox(Sender).SetFocus;
  end else
  begin
    TComboBox(Sender).DroppedDown  := False;
  end;
end;
Resim
veya şuna bakarsanız buda bu güzel hazır bir örnek Mrmarman hocamızdan
viewtopic.php?f=2&t=3291&hilit=+combobox

Ayrıca ekli dosyada sana kendi hazırladığım bir örnek gönderiyorum, combox içinde arama yapabilirsin.
aşağıda ki kod ile istediğin tablolarda arama yapabilirsin. Unutmadan birden çok tabloda arama yapamak istersen tablo adarını virgül ile ayırarak bir çok tablo ekleyebilirsin.

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ı
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
Dosya ekleri
ORNEK.rar
comboboxta_Ara
(11.72 KiB) 116 kere indirildi
Kullanıcı avatarı
struggler
Üye
Mesajlar: 12
Kayıt: 21 Kas 2013 12:58

Re: Otomatik Tamamlama (Auto Compalate)

Mesaj gönderen struggler »

Lord_Ares yazdı:Merhaba , Mrmarman hocamızın şu konu başlığı ( Combobox gibi kelime tamamlayıcılı arama nasıl?) altında böyle bir cevabı ve örneği vardı inceleyin belki işinize yarayabilir.

viewtopic.php?f=2&t=3291&p=174446&hilit ... ma#p174446
mrmarman yazdı:- Dilersen üçüncü parti bu işi yapan bileşenler de kullanabilirsin, veya DBLookUpComboBox ile veritabanından direkt güdümleyebilirsin.

- Klasik ComboBox kullanmak istersen de sana senin anlayacağın şekilde basitleştirilmiş halini aşağıda veriyorum. Sana yeterlidir umarım. Örnek proje de ekte.... :idea:

Kod: Tümünü seç

procedure TForm1.FormShow(Sender: TObject);
begin
  ADOQuery1.Connection := ADOConnection1;
  DataSource1.DataSet  := AdoQuery1;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'
  +'Data Source='+ExtractFilePath(Application.Exename) + 'Database.mdb';
end;

// SQL Arama Fonksiyonu
procedure AramaYap( strAra: String; AdoQuery:TAdoQuery );
begin
  With AdoQuery do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT M_Name FROM DivXTurk');
    SQL.Add('WHERE 1=1');
    SQL.Add('AND M_Name like '+QuotedStr( strAra+'%' ) + ' ORDER BY M_Name' );
    Active := True;
  end;
end;

procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key <> vk_Return then
  begin
    AramaYap( TComboBox(Sender).text, ADOQuery1 );
    TComboBox(Sender).Items.Clear;
    TComboBox(Sender).AutoComplete := False;
    TComboBox(Sender).DroppedDown  := True;
    while NOT ADOQuery1.Eof do
    begin
      TComboBox(Sender).Items.Add( ADOQuery1.FieldByName('M_Name').AsString );
      ADOQuery1.Next;
    end;
    TComboBox(Sender).SelStart := Length(TComboBox(Sender).Text);
    TComboBox(Sender).SetFocus;
  end else
  begin
    TComboBox(Sender).DroppedDown  := False;
  end;
end;
Resim
veya şuna bakarsanız buda bu güzel hazır bir örnek Mrmarman hocamızdan
viewtopic.php?f=2&t=3291&hilit=+combobox

Ayrıca ekli dosyada sana kendi hazırladığım bir örnek gönderiyorum, combox içinde arama yapabilirsin.
aşağıda ki kod ile istediğin tablolarda arama yapabilirsin. Unutmadan birden çok tabloda arama yapamak istersen tablo adarını virgül ile ayırarak bir çok tablo ekleyebilirsin.

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ı
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

Lord_Ares ve diğer arkadaşlar, teşekkür ederim. Şimdi iş yerindeyim eve gidince örnekleri inceleyeceğim zaten Muharrem Arman (mrmarman) programlamanın piri olduğundan örnekleri filan çok sağlam

Kod: Tümünü seç

Hello world
[/b]
Cevapla