Ana içeriğe atla

dbGridin lookup hücresindeki comboyu gösterme olayı

dbGride lookup bir alan eklediğiniz zaman deplih otomatik olarak bu alana bir combo yerleştirir ve içinede tablonun ilgili alanındaki tüm değerleri doldurur. Bu özelliği fare ile kullanmak gayet rahat olurken (ilgili hücreye ard arda iki tık yapmak) klavye ile işkenceye dönüşebiliyor. İlk önce entera basıp tabloyu düzenle moduna getirmelisiniz ardından Alt + Aşağı Ok tuşuna basarak listeyi açmalısınız. Sıkıcı bir iş... Aslında birazdan yazacağımız kodlar dbgritten ziyade oop'u ilgilendiriyor. Nesnelerin özellikleri, erişim alanları, protected, private gibi kavramlar hakkında bize ışık tutuyor. Konumuza geri dönersek, dbGrid zaten bir comboboxa sahip. Bizim yapacağımız işlem sadece bu listeyi kullanıcıya daha kolay bir yoldan gösterebilmek. Bunun için şöyle bir yol izleyeceğiz. İstediğimiz bir olay oluştuğunda dbGridin editörünü Alt+Vk_Down tuşlarına basılmış gibi kandıracağız. Listeyi gösterebilmek için dbGridin InPlaceEditor özelliğini kullanmamız gerekiyor ama normal şartlarda bu özelliğe DBGrid1.InplaceEditor şeklinde ulaşamıyoruz. Çünkü InplaceEditor TCustomGrid'in Protected alanında tanımlanmış. Yani bu özelliğe Grids (TCustomGrid'in tanımlı olduğu unit) uniti haricinde erişebilmemiz mümkün değil. Bu oop'un bir özelliği... ---protected olarak tanımlanmış özelliklere sadece o sınıftan türemiş diğer nesnelerin de ulaşabiliyor olması muhtemel. Tam olarak emin değilim şuanda. Nerde kalmıştık...--- .... .... protected .... .... property InplaceEditor: TInplaceEdit read FInplaceEdit; .... .... Şimdi bi Ali Cengiz oyunuyla bu işin üstesinden gelecez. Birazdan yapacağımız yönteme ne isim veriyorlar bilmiyorum ama ben kısaca HokusPokus demeyi uygun görüyorum. olaya ilk önce Wm_User mesajını yakalayacak prosedürü tanımlayarak başlayalım. type TForm1 = class(TForm) .................... procedure wmUser(var M:TMessage); message wm_User; end; ... ... ... procedure TForm1.wmUser(var M: TMessage); begin ShowTheComboBox; end; şimdi de combomuzu gösterecek olan prosedürü yazalım. type TForm1 = class(TForm) .... .... .... procedure ShowTheComboBox; end; ... ... ... procedure TForm1.ShowTheComboBox; const AltMask = $20000000; begin if DBGrid1.SelectedField = Table1LookupIlAdlari then begin DBGrid1.EditorMode:=True; //bu satıra dikkat! PostMessage(TDBGridPatch(DBGrid1).InplaceEditor.Handle, wm_keydown, vk_down, altmask); end; end; son olarakta hokuspokusu yapmamızda bize yardımcı olacak sınıfımızı tanımlıyoruz. ... ... var Form1: TForm1; implementation {$R *.dfm} type TDBGridPatch = class(TDBGrid); //sadece 1 satırdan ibaret ... ... evet işte bu kadar. TDBGridPatch 'i kullanarak TDBGridin protected olarak tanımlanmış bir alanına ulaştık ve kullandık. Ulaştığımız bu alana alt tuşuna ile birilikte aşağı ok tuşuna basılmış gibi hareket etmesini söyleyerek kullanıcıyı bu eziyetten kurtarmış olduk. Şimdi eğer kullanıcı gridde gezerken listenin otomatik olarak açılmasını istiyorsanız procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin ShowTheComboBox; end; yukarıdaki gibi bir kod kullanabilirsiniz. veya benim kullandığım gibi procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_return then if DBGrid1.SelectedField = dmana.ibdsTesellum_DetaillkpEmtiaMalzemeAdi then PostMessage(Handle, wm_user, 0, 0); end; ilgili alanın üzerine geliyor. entera basıyor. liste açılıyor.... ne kadar güzel ne kadar güzel :) http://www.elists.org/pipermail/delphi-db/1999-August/000143.html

Yorumlar

Bu blogdaki popüler yayınlar

Yazılımı Oluşturan Bileşenler Nelerdir?

Yazılımı oluşturan bileşenlerden daha önce söz etmiştik. Şimdi bu bileşenlerin neler oldukları üzerinde biraz duralım. Yazılımı oluşturan bileşenler = Mantık + Veri + Belge + İnsan + Program. Bu bileşenlerin az çok neler olduğunu, neleri kapsadığını biliyoruz ama biz yine de kıyısından köşesinden açıklayalım. Zaten bu yazıdaki asıl amaç yazılım bileşenlerinden belgelemenin yerini ve önemi (dökümantasyon) vurgulamak. Mantık = Yazılım herşeyden önce bir işin bilgisayar aracılığı ile yapılması amacına yöneliktir. Bu nedenle bilgisayarlaştırılmak istenen işin mevcut mantığı bir şekilde yazılıma da yansılıtılmak zorundadır. Veri = Her tür yazılım mutlaka bir veri üzerinde çalışmak durumundadır. Veri işlemeyen yazılımın geliştirilmesi söz konusu değildir. Söz konusu olan veri dış ortamdan alınabileceği gibi yazılımın içerisinde de üretilebilir. Zaten yazılımın temel amacı veriyi bilgiye dönüştürmektir. İnsan = Doğal olarak yazılımın insan bileşeni iki boyutludur. Yazıl

Leyse li'l-insâni illâ mâ seâ

"Leyse li'l-insâni illâ mâ seâ" derken Hudâ; Anlamam hiç meskenetten sen ne beklersin daha? Mehmet Akif Ersoy / Durmayalim Leyse li'l-insâni illâ mâ seâ : Necm Süresi 39. Ayet. [İnsan için ancak çalıştığı vardır.] Meskenet: 1 . Miskinlik, beceriksizlik. 2 . Yoksulluk, fakirlik. (Türk Dil Kurumu) Olay zaten yeterince acik. Yan gelip yatma kardesim. Calis. Bu misralar yazildigi donemde bu anlami tasiyordu fakat zaman ilerledikce baska bir gercegi de gozler onune seriyor.Gerci bu gercek cok kapsamli bir kac satirla anlatilabilecek bir sey degil kaldiki benim bilgim de buna yeterli degil zaten. Ben giris cumlelerini verebilirim gerisini arastirmak yaziyi okuyanlara kalmis. (Matrix gibi bisey oldu bu yaw. Neo'nun kahinle bulusup yanindan ayrildiktan sonra Morpheus ile konusma sahnesi.) Yani kisaca sunu demek istiyorum. Ben bu misrayi ilk okudugumda hic birsey anlamadim. Bu misralari anlayabilmek icin kuran mealine ve turkce sozluklere bakmak zorunda k

Yunus sen bu dünyaya niye geldin?

Göçtü Kervan Ah nice bir uyursun uyanmaz mısın Göçtü kervan kaldık dağlar başında Çağrışı tellallar inanmaz mısın Göçtü kervan kaldık dağlar başında Emr-i hac göçeli hayli zamandır Muhammed cümleye dindir imandır Delilsiz gidilmez yollar yamandır Göçtü kervan kaldık dağlar başında Yunus sen bu dünyaya niye geldin Gece gündüz Hakkı zikretsin dilin Enbiyaya uğramaz ise yolun Göçtü kervan kaldık dağlar başında Yunus Emre