DBEDİT ve Tamamlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

DBEDİT ve Tamamlama

Mesaj gönderen loxka »

S.A
Kayıt yaptığım table'da birbirini tekrarlayan kayıtlar var ve yeni kayıtlar yaptıkcada format gereği tekrarlayacak ama her seferinde dbedite yeniden yazılması gerekiyor. DBedite yazarken bir algılama kolaylığı olabilirmi yani llk kemeyi görünce editin içine (önceden girilmiş ise) getirsin istiyorum. Teşekkür ederim.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

A.S.

yapman gereken OnNewRecord olayında kodla atama yapmak. Mesela şehir için daha çok istanbul seçiliyorsa :

Dataset.FieldByName('SEHIR_KODU').AsInteger := 34;

gibi atamayı yaparsın. Kullanıcı isterse değiştirir.

Bu şekilde istersen değişik hesaplamlar vs. yaparakta ilk değer atayabilirsin.

Kolay gelsin.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
edit yerine combobox kullanmayı denedinmi.
Kolay Gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

hocam combo box uğraştırır diye bıraktım.Mustafa hocamın da önerdiği olabiliyor ama kullanıcı böyle istemiyor işte, yazmaya başlayınca gelsin takıntısı ... yardımlarınızı esirgemediğiniz için teşekkürler
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

DBcombobox otomatik olarak önceden girilen kayıtları göstermesi lazım.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bu kod işine yarar sanıyorum.
vatandaş edit1 e bişeler yazıp arattığı zaman otomatik olarak daha önceden aratmış olduğu şeyleri edit otomatik olarak tamamlıyor.
program her başladığında en son kelimleri hatırlaması için bi dosyaya kaydedebilir program açılırken bu dosyadan yükleme yapabilirsin.

Kod: Tümünü seç

procedure TfrmMain.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
 theText: string;
 i, p: integer;
begin
// if not ckbxList.checked then exit; //istersen tamamlamayı isteğe bağlı yapabilirsin
 with Edit1 do
   case key of
     8, 13, 46, 37..40,112..123: ; // bakspace, enter ,f1 ler falan filan
     else
     begin
       p := selStart; 
       theText := copy(text, 0, p);   
       for i := 0 to listValues.count-1 do
       begin
         if pos(upperCase(theText), upperCase(listValues[i]))=1 then
           if compareText(theText, listValues[i]) < 0 then
           begin
             text := listValues[i];
             selStart := p;
             SelLength := length(text) - selStart;
             break;  // Match found, so quit search
           end;
       end;   // for
   end;  // case
 end;  // with
end;

Kod: Tümünü seç

procedure TfrmMain.FormCreate(Sender: TObject);
begin
listValues := TStringList.create;
listValues.sorted := true;
listValues.Duplicates := dupIgnore;

listValues.LoadFromFile(dosya adı);
//daha önceden bi dosyaya kaydettiğin listeyi buraya yükleyebilirsin

end;

Kod: Tümünü seç

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
//elemanları daha sonradan kullanmak için bi dosyaya burada kaydedebilirsin.
listValues.SaveToFile(DosyaAdi);
FreeAndNil(listValues);
end;

Kod: Tümünü seç

  
public
.........
  listValues : TStringList;
............

Kod: Tümünü seç

procedure TfrmMain.ButonAraClick(Sender: TObject);
begin
listValues.add(Edit1.text);
//kullanıcının yeni yazdığı kelimeyi listeye ekle
end;
alipolatolu
Üye
Mesajlar: 10
Kayıt: 25 Ağu 2004 01:49
Konum: Bursa
İletişim:

Mesaj gönderen alipolatolu »

Merhaba;

Eğer DevExpress component'lerini kullanıyorsanız MRUEdit işinizi görecektir. Önceden girilmiş kayıtları yüklüyorsunuz gerisini o hallediyor.

Umarım faydası olur.

Kolay Gelsin,

Polat,
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

aslangeri yazdı:DBcombobox otomatik olarak önceden girilen kayıtları göstermesi lazım.
dbcombobox sadece itemsinde olan verileri dataya yazar olnalari getirmez bunun için dblookupcombox kullanmak gerekir..
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

Kod: Tümünü seç

PROCEDURE TMusteriKartiF.dbEdit1Change(Sender: TObject);
VAR
  btus: boolean;
  metin, bulunan: STRING;
  secim: integer;
BEGIN
  IF btus = True THEN
    BEGIN
      btus := false;
      exit;
    END;
//bu kısmı kaldır ki bulunan değer geri donmesin
//  IB_CH.Locate('AD', dbedit1.Text, [loPartialkey,  loCaseinsensitive]);
  metin := dbedit1.Text;
   bulunan := Q_MusteriKartiFirmaAd.Value;
  IF secim > 0 THEN
    BEGIN
      dbedit1.Text := bulunan;
      dbedit1.SelStart := length(metin);
      dbedit1.SelLength := secim;
    END;
END;
ben boyle birşey yapmıştım inşallah işine yarar...
sana sadece kendine gore uyarlamak kalıyor...
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
AliRiza
Üye
Mesajlar: 172
Kayıt: 24 Kas 2004 10:57
Konum: İstanbul/Avcılar
İletişim:

Mesaj gönderen AliRiza »

Bana böyle birşey lazım.ALUCARD kardeş sadece kodda şu kısmı anlamadım.

Kod: Tümünü seç

bulunan := Q_MusteriKartiFirmaAd.Value; 

Burada Q_MusteriKartiFirmaAd.Value değeri nerden geliyor.Bana bu konuda yardımcı olursan sevinirim.Sizin yazdığınız kodda tuşa basıldıkça locate ile arama yaptırıp değeri alım işlemini yapıyorsunuz.
Yani adotable1.fieldbyname(ad).value; gibi..
Name'ini değiştirdiniz tam anlamadım.Bana dbedit'e veri girdikçe database'den veriyi çekip tamamlama işini yapmam konusunda yardımcı olursanız çok memmun olurum..
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
AliRiza
Üye
Mesajlar: 172
Kayıt: 24 Kas 2004 10:57
Konum: İstanbul/Avcılar
İletişim:

adoquery ile hallettim..

Mesaj gönderen AliRiza »

Kod: Tümünü seç

procedure TForm3.proformanoChange(Sender: TObject);
VAR
  btus: boolean;
  metin, bulunan: STRING;
  secim: integer;
BEGIN
  IF btus = True THEN
    BEGIN
      btus := false;
      exit;
    END;

adoquery1.SQL.Clear;
adoquery1.Close;
adoquery1.SQL.Add('select proformano from data where proformano LIKE'+QuotedStr(proformano.Text+'%')+'order by no');
adoquery1.Open;
 metin := proformano.Text;
   bulunan:=dbgrid1.DataSource.DataSet.FieldByName('proformano').AsString;
  IF (secim > 0) and (adoquery1.RecordCount<>0) THEN
    BEGIN
      proformano.Text := bulunan;
      proformano.SelStart := length(metin);
      proformano.SelLength := secim;
    END;
END;
Bir tane dbgrid alıp onu dataset'inden çektim.Arkadaşlar edit içerisinde combobox göstermem mümkün mü.Yani burada adam a'ya bastı a ile başlayan kayıtların listesi comboda listelensin istiyorum.Ab yaptı ilk iki harfi ab olanlar gelsin.Bu şekilde kullanıcı isterse listeden çeksin istiyorum..
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@sadettinpolat'ın kodunda minik bir revizyon ile bir liste dosyasından değil veritabanından kontrol özelliği sağlanabilir.

Kod: Tümünü seç

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
 theText : string;
 p       : integer;
begin
 With TEdit(Sender) do
 case key of
   8, 46, 37..40, 112..123: ; // backspace, f keys
   13: SelStart := Length(Text);
   else
   begin
     P       := SelStart;
     TheText := copy(Text, 0, p);
     If AdoTable1.Locate('M_Name', theText, [loPartialKey]) then
     begin // veritabanında pozisyon aldığında...
       Text      := AdoTable1.FieldByName('M_Name').AsString;
       SelStart  := p;
       SelLength := Length(Text) - SelStart;
     end;  // If
   end;  // else
 end; // Case
end;
@AliRiza; sen de sorunu bir oluşturduğun SQL'i takibe alacak bir DBLookUpComboBox ile çözebilirsin. :idea:

- Formuna bir DBLookUpComboBox koy. adoquery1'in datasource'u neyse bilmiyorum ama örnekte DataSource1 olsun

Kod: Tümünü seç

  DBLookUpComboBox1.ListSource := DataSource1;
  DBLookUpComboBox1.KeyField   := 'proformano';
Not: İşlemler çok hızlı gelişeceğinden AdoQuery yavaş kalabilir. Nefes alması adına Open satırından sonra

Kod: Tümünü seç

   Application.ProcessMessages;
eklemeyi ihmal etme... :idea:

- İşte bu kadar... başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

AliRiza yazdı:Bana böyle birşey lazım.ALUCARD kardeş sadece kodda şu kısmı anlamadım.

Kod: Tümünü seç

bulunan := Q_MusteriKartiFirmaAd.Value; 

..
pardon ya yanlış yazmışım

Kod: Tümünü seç

bulunan := IB_CHFirmaAd.Value; 

şeklinde olacaktı kusura bakma
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Arkadaşlar @Alucard'ın yazdığı kod sadece girilmiş verileri tamamlamaya yarar. Yeni veri giremezsiniz. Yani tamamlayarak arama yapmak için kullanılabilecek bir kod. Şimdi benim size önerim ben bunu kullanıyorum Form create edilirken ilgili alandaki benzersiz kayıtları SQL ile süzerek combonun itemsine atamak. Style de single olarak ayarlandımı iş bitti. Görünümü edit gibi ama gerçekte combobox. Bende sorunsuz çalışıyor. Denemenizi öneririm. Kolay gelsin.
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
AliRiza
Üye
Mesajlar: 172
Kayıt: 24 Kas 2004 10:57
Konum: İstanbul/Avcılar
İletişim:

Cevap

Mesaj gönderen AliRiza »

Arkadaşım ase.Ben denedim alucard'ın yazdığı kodda yeni veri girebilirsin.Ben kendim locate ile sql kullanarak denedim.İstediğim oldu.İstersen bir kontrol et..
Bilginin efendisi olmak için çalışmanın uşağı olmak şarttır...
BALZAC
Bana bir harf öğretenin kulu kölesi olurum..
HZ.ALİ
Cevapla