Combobox gibi kelime tamamlayıcılı arama nasıl?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
pma
Üye
Mesajlar: 68
Kayıt: 26 Mar 2014 10:41

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen pma »

Yani Bu Kodları Hazırlayıp Atmışsınız Onda Bir Problemim Yokta Delphi Bilgim Sınırlı

Bana lazım olan tek şey projeniz yaptığınız gibi edit comboBox gibi açılma ve açılan listesine eleman ekleme ilk defa görüyorum bu editin açılma olayının sizin kodlarınız arap alfabesi gibi gözüktü gözüme

gridler ado connectionlar havada uçuşuyo
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen mrmarman »

Şimdi bu projede bir göz yanıltmacası yaptım.

- Beklenen metod nedir ? bir veri girişi yapılırken veritabanınada onunla başlayan benzer kayıtlar bulunur, sonra sıralı olarak bir combobox veya başka bir listeye döngü ile aktarılır.

- Bu işlem silsilesi akıcı olmaz. Çünkü her defasında listeyi sil baştan yeninden boşalt/doldur/boşalt ... sürer gider. İlk harfe basışta belki de 10.000 kayıt gelecektir. Neyse...

- Uyguladığım yöntem ise, veritabanı sorgusu yaptığımızda, bu veritabanı içeriğini klasik ve bildiğimiz standart bir TDBGrid'e yönlendirdim.
- Yani sorgu sırasında online olarak bizzat çıkan sonuçlar görüntüleniyor.
- Bana sadece bu sonuçların yansıdığı TDBGrid'in eni boyu yüksekliği ve yeriyle oynamak kaldı.
- Bonus olarak da bulunan kayıtların bir kısmını EDIT üzerinde yazılı olan kısım kadarıyla koyu siyah, takip eden karakterleri de kırmısı yapan bir boyama işi ekledim.

- DBGrid'in eni boyuyla oynarken her satırın yüksekliğini belirleme imkanı Delphi tasarımcıları tarafından direkt olarak verilmemiştir. Onun için bir CLASS tanımlayıp, satır yüksekliğini, DBGrid'in atalarından gelen propery'lerinden faydalandım. Bunun için TArmanGrid dedim ki sistem DBGrid gibi değil başka bir şeymiş gibi değerlendirsin.

- Bu metodu uygulamak zorunda değilsin. Yukarıda ilk bahsettiğim sıradan metodu bir ComboBox ile rahatça uygulayabilirsin. Benim amacım görselliği arttırmak idi. Bu etüd proje boyanarak dilediğim şekle büründürülebilir niteliktedir.
Resim
Resim ....Resim
pma
Üye
Mesajlar: 68
Kayıt: 26 Mar 2014 10:41

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen pma »

yani sizin kullandığınız yöntemde biz editi liste gibi görüyoruz ama altında çıkan liste değil sadece şekliyle oynanmış datagrid nesnesi bende tren misali kodlara bakıp durdum sabahtan beridir

peki data grid ile uğraşmaktansa comboBox üstünde uygulamak daha pratik bir yola çıkmaz mı

sizin dediğiniz gibi 10.000 tane kayıt çıkabilir ama daha az kodla uğraşmak her zaman kolaylık sağlar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen mrmarman »

- 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
Dosya ekleri
ComboBox_AutoComplete.rar
Combobox AutoComplete
(151.89 KiB) 146 kere indirildi
Resim
Resim ....Resim
pma
Üye
Mesajlar: 68
Kayıt: 26 Mar 2014 10:41

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen pma »

Teşekkür Ederim Zaman Ayırıp Uğraştığınız İçin Son Örneğinizdeki Kodlamayı Programıma Entegre Edebildim..
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen xozcanx »

Merhaba;
Muharrem hocamız pratik cevabı (sizin istediğiniz) vermiş. Hocamızın da dediği gibi siz yazdıkça sürekli yazdığınız harflere göre tekrardan filtreleme yapacağı için gecikme olacaktır. Veri tabanı kendi makinenizde olduğu zaman bunu farketmeyebilirsiniz ama Network üzerinden yada İnternet üzerinden böyle bir filtreleme programın gecikmesine bazende yanıtvermemesine sebep olacaktır. Kayıt sayısı 10.000 ve üzeri vs. olduğunda özellikle. Bunun yerine Örneğin "Delphi Türkiye" için "Delphi" yazdıktan sonra Enter dediğinizde filtrelemeyi yaptırsanız yukarıdaki yazdığım sorunları yaşamazsınız. Yani filtreleme için kullanıcının "Enter" tuşuna basmasını isteyebilirsiniz.
Başarılar..
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
pma
Üye
Mesajlar: 68
Kayıt: 26 Mar 2014 10:41

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen pma »

Tavsiye İçin Teşekkür Ederim Dikkate Alıcam..
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Combobox gibi kelime tamamlayıcılı arama nasıl?

Mesaj gönderen cengaver »

Kullanıcı milleti işin her zaman kolayına kaçar, o nedenle yazdıktan sonra entere basmak çoğuna zor gelir o nedenle 10.000 kayıt sorunu ile ilgili yukarıdakilere bir ekleme yapmak isterim;

SQL Cümlesini limitli sonuç verecek şekilde ayarlarsanız hem hız hem de zaman probleminiz kalmaz. Mesela SQL Server ve Access için TOP, MySQL için LIMIT ifadeleri işinizi görecektir. Hatta direkt örneği modifiye edeyim;

Kod: Tümünü seç

uses
 ...
Type
  TSQLSyntaxType = ( MsSQL, MySQL, MsAccess{, SQLite, Oracle, DB2});{ SQL Cümlemizi bu standartlara göre üreteceğiz }
...
Implementation
...
// SQL Arama Fonksiyonu
procedure AramaYap(aSQLTipi: TSQLSyntaxType; intMiktar: Integer; strAranan, strField, strTablo: String; AdoQuery: TAdoQuery);
  function TQ(aText: String): String;
  begin
    Result := QuotedStr(Trim(aText) + '%' );
  end;
begin
  With AdoQuery do begin
       Active := False;
       SQL.Clear;
       if (aSQLTipi = MsSQL) or (aSQLTipi = MsAccess) then begin
          SQL.Add(format( 'SELECT TOP %0:d %1:s FROM %2:s WHERE %1:s LIKE %3:s ORDER BY %1:s ASC '
                        , [intMiktar, strField, strTablo, TQ(strAranan)]));
       end else
       if (aSQLTipi = MySQL) then begin
          SQL.Add(format( 'SELECT %0:s FROM %1:s WHERE %0:s LIKE %2:s ORDER BY %0:s ASC LIMIT %0:d'
                        , [intMiktar, strField, strTablo, TQ(strAranan)]));
       end;
       Active := True;
  end;
end;
Cevapla