Merhaba arkadaşlar;
Bu makalede sizlere DevExpress’in cxGridini satırlarına nasıl button ekleyebiliriz.Bunu göstericem.Hafta sonu üstad Kemal abimizden biraz development dersi aldıktan sonra ,biraz da uğraşınca birşeyler öğrendik.
Başlıyoruz…
Bu uygulama için Nortwind veritabanındaki Categories(Master) ve Products(Detail) tablolarını kullanıcaz.Bilindiği üzere Products tablosunun CategoryID kolonu ile Categories tablosunun CategoryID kolonu birbirleri ile “Bire- Çok “ ilişkilidir.
Delphi XE ve SQL Server 2008 R2 üzerinde çalışıyoruz…
Öncelikle yeni açtığımız projeye bir adet DataModule nesnesi ekleyerek başlayalım.
DataModule nesnesi içersine Ado nesnelerini yerleştiriniz.
Daha sonra bu nesneleri birbirleri ile haşır neşir ediniz.

Nesneleri birbirleri ile haşır neşir edip, bağlantı sağlandıktan sonra form bir adet cxGrid ekleyin.Ve gridi datamodule içersindeki dsProducts verikaynağına bağlayınız.

Designer açıkken cxGrid1DBTableView1CategoryID kolonu seçiliyken Object Inspector ‘ dan Kolonunun lookUp ayarlarını yapalım.

Buraya kadar LookUp işlemini yaptık.Çalıştırdığımızda aşağıdaki bir sonuç alacağız.

Şimdi gelelim asıl yapmak istediğimize…
CategoryID kolonunda bir LookUpComboBox’ ımız var.Şimdi LookUpComboBox’ın yanına istediğimiz kadar buton ekleyip,hangisine basıldığını tespit edicez.
Önce hemen şunu yapıyoruz. Designer açıkken cxGrid1DBTableView1CategoryID kolonunun diğer özelliklerine eventlarına filan bakıyoruz. cxGrid1DBTableView1CategoryID kolonu lookUpComBoya dönüştüğü için lookUpComBo özellikleri,event’ları geliyor.Bizim işimiz de onlarla değil.
Tam bu esnada “Hay anasını satiyim.” Deyip bir hayal kırıklığının ardından…
Sanırım cxGridi tasarlayanlar button koleksiyonunu published kısmına yazmamış herhalde.Eğer published kısmına yazsaydı. Ozaman Object Inspector’ da da görürdük diye düşünüyoruz.Ve hemen ardından.
Biraz da kod tarafından bakıyoruz Olaya. Ve nihayetinde olayın varıyoruz farkına.

Yukarıdaki görüntüden şöyle bir anlam çıkarıyoruz ve kendi kendimize mırıldanıyoruz.Hımm. CategoryID kolonu ,özellikleri ,butonları… butonlarımı ?
Demekki bir kolonda bir den fazla buton olabilir.Tekrar hımm’lamamıza kaldığımız yerden devam ediyoruz.

Button koleksiyonuna buton ekleyen ve eklediği butonu geri dönen bir Add fonksiyonu var.Kodumuzu aşağıdaki gibi düzenleyip bir daha deh diyoruz.


Evet butonu eklemeyi başardık nihayetinde… İstersek eklediğimiz buton resim bile koyabiliriz.
Şimdi şunu düşüyoruz. İstediğimiz kadar buton ekleyebiliyoruz.Hangisine basıldığını nasıl tespit edip işlem yaptırabiliriz.İyide düşünürken bile şunu diyoruz.Hangisine basıldığını anda…

İncelerken OnButtonClick event’inin olduğunu görüyoruz.Ve sol taraftaki hint’ de de bu event tetiklendiğinde de nasıl bir prosedürü çalıştırabilir onu görüyoruz.Prosedürün ismi önemli değil.Ama parametreleri (Sender:Tobject;AbuttonIndex:Integer) şeklinde olmalı.
Evet artık olayı çözmüş bulunuyoruz.Kodun son hali aşağıdaki olmalı.
unit umain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters,
cxStyles, dxSkinsCore, dxSkinscxPCPainter, cxCustomData, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel, cxClasses, cxGridCustomView,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
cxDBLookupComboBox;
type
TfrmMain = class(TForm)
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
cxGrid1DBTableView1ProductID: TcxGridDBColumn;
cxGrid1DBTableView1ProductName: TcxGridDBColumn;
cxGrid1DBTableView1SupplierID: TcxGridDBColumn;
cxGrid1DBTableView1CategoryID: TcxGridDBColumn;
cxGrid1DBTableView1QuantityPerUnit: TcxGridDBColumn;
cxGrid1DBTableView1UnitPrice: TcxGridDBColumn;
cxGrid1DBTableView1UnitsInStock: TcxGridDBColumn;
cxGrid1DBTableView1UnitsOnOrder: TcxGridDBColumn;
cxGrid1DBTableView1ReorderLevel: TcxGridDBColumn;
cxGrid1DBTableView1Discontinued: TcxGridDBColumn;
procedure FormCreate(Sender: TObject);
private
//Event'in çağıracağı prosedür
procedure Tiklanani_Bi_Bulursam(Sender: TObject; AButtonIndex: Integer);
public
end;
var
frmMain: TfrmMain;
implementation
uses udm;
{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject);
var
btn: TcxEditButton;
begin
btn := cxGrid1DBTableView1CategoryID.Properties.Buttons.Add;
btn.Kind := bkEllipsis;
btn := cxGrid1DBTableView1CategoryID.Properties.Buttons.Add;
btn.Kind := bkEllipsis;
cxGrid1DBTableView1CategoryID.Properties.OnButtonClick :=
Tiklanani_Bi_Bulursam;
end;
procedure TfrmMain.Tiklanani_Bi_Bulursam(Sender: TObject;
AButtonIndex: Integer);
begin
// ShowMessage(IntToStr(AButtonIndex));
case AButtonIndex of
0:ShowMessage('lookup butonuna tıkladın');
1:ShowMessage('2.butona tıkladın');
2:ShowMessage('3.butona tıkladın');
end;
end;
end.

Bana delphinin inceleliklerini öğreten Kemal abime teşekkür ederim.
Umarız faydalı olmuşuzdur.
Kaynak Kodları buradan indirebilirsiniz.
İsmail Kocacan(Yazılımcı Bozuntusu)
ismailkocacan@gmail.com