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
Bazıları haber sunarken güzel görünmeye çalışıyorlar bazıları ise güzel oldukları için haber sunuyorlar. Bunun yanında hem haber sunan hem de güzel olanlarda yok değil. Nasıl bir haber sunduğu konusunda (tonlama, vurgu, mimik) fazla bilgim olmasada çok güzel bi hanım kızımız olduğu gözlerden kaçmıyor Melissa Theuriau'in. Meslek hayatında başarılı olmasını dilemekten başka bir şey söyleyemiyorum :) Türkiye tarafında ise ön plana çıkan Banu Güven (Ntv) ve Burcu Esmersoy (CnnTurk) var. Bana göre Banu Güven işini yaparken güzel görünüyor Burcu ise güzel göründüğü için iş yapıyor. Her ikisininde konuşmakla ilgili bir takım problemleri var ama her zaman için Banu Güven'i tek geçerim bu alemde :)
Yorumlar