Önceki makalede FastGrid'in temel yeteneklerine genel bir bakış atmıştık — FastGrid — FastReport VCL'nin bileşenidir, FastReport VCL. Şimdi bir seviye aşağı inip bileşenin iç yapısını inceleyelim: gridin ve onu oluşturan görsel öğelerin özelliklerini ele alalım, View nesnesine, sütunlara, bunların özelliklerine ve olaylarına bakalım, sonunda da verilerle çalışmanın ayarlanmasına kısaca değinelim.
Bu materyal, FastGrid'i FastReport VCL bünyesinde kullanan ya da onu öğrenmeyi planlayan Delphi ve C++ Builder geliştiricileri için faydalı olacaktır.
Grid (TfrGrid) — işlevselliğini sağlayan tüm diğer nesnelerin üzerinde yer aldığı ana kontrol öğesidir. Bileşenin özellikleri ve olaylarının neredeyse tamamı standarttır ve VCL kontrol öğelerinin çoğunda bulunur. İstisna, gride özgü iki olaydır:
Gride çeşitli View'ların eklenmesi ve kaldırılması bileşen menüsüyle yapılır. Grid oluşturulduğunda içine otomatik olarak bir View nesnesi eklenir.
Tasarım zamanında grid üzerinde ayrıca lejant bulunur — gridde yer alan nesnelerin küçük bir listesi. Lejantta yalnızca grid için değil, onun üzerinde yer alan bileşenler (sütunlar) için de menü mevcuttur. Ayrıca lejant, bu bileşenlerden herhangi birini hızla etkinleştirmeye olanak tanır. Lejanta gerek yoksa, gride ShowLegend := False özelliğini ayarlayarak kaldırabilirsiniz.
View nesnesi — gridin içeriğinin görüntülenmesinden sorumlu temel öğesidir. View nesnelerini lejant aracılığıyla yönetebilirsiniz. Her View'ın menüsünde şu seçenekler mevcuttur (Unbound View'da bunlardan bazıları bulunmaz):
Karmaşık kontrol öğeleriyle çalışırken sürekli olarak Color ve Font türünde çok sayıda özellikle, ayrıca ParentFont gibi özelliklerle karşılaşırsınız. FastGrid'de bu özelliklerin tümü Appearance özelliğinin içine gizlenmiştir. Bu özellik, iç içe geçmiş özelliklerden oluşur ve her biri gridin belli bir bölümünün görünümünden sorumludur.
Bu özelliklerin çalışmasını Appearance.Data örneği üzerinde inceleyelim — gridin veri alanının görünümünden sorumludur.
Ekran görüntüsünde görüldüğü gibi bu özellik, BackgroundColor, FontColor, FontName gibi iç içe özelliklerden ve aynı adlara sahip bayraklar kümesinden oluşan AssignedValues alt özelliğinden oluşur. Çalışma ilkesi şöyledir: AssignedValues aracılığıyla basit özellikler kümesinden hangisinin doğrudan uygulandığını, hangisinin üst nesneden devraldığını belirtiriz. Örneğin AssignedValues.FontColor özelliğini True yaptığınızda, gridin yazı tipi rengi değiştirildiğinde veri alanındaki yazı tipi rengi değişmez.
Appearance özellikleri öncelikle içinde bulundukları nesnelerin yazı tipini ve rengini ayarlamak için kullanılır. Başka bir deyişle, ParentColor, ParentFont ve benzer davranışa sahip diğer özelliklerin yerini alırlar, ancak daha fazla esneklik sunarlar: parametrelerin bir kısmı yerel olarak geçersiz kılınabilir, kalanı gridden devralınır.
Bunun nasıl çalıştığını FastGrid demo projesinde kontrol edelim. Delphi'de GridDemo.dpr projesini açalım — «Başlat» menüsünde «FastReport VCL Products» klasöründe, «2026.2.0-Sources-Demos» alt klasöründe yer alır (klasör adındaki sürüm numarası farklı olabilir; ayrıca IDE'de FastGrid'i içeren bir FastReport sürümünün kurulu olması gerekir). DataAwareDemo.pas modülünü açıp forma geçelim. Appearance özelliğinin bazı iç özelliklerini değiştirelim. Sonuç şöyle oldu:
Şimdi doğrudan gride Font.Name := 'Courier New' özelliğini ayarlayalım. Bu yazı tipi görsellik açısından seçilmiştir. Gridin görünümü şöyle olacaktır:
Yazı tipinin gridin tüm metin öğelerinde değiştiğini, ancak renk ve özniteliklerin eski hâlini koruduğunu görüyoruz. City sütununda ise yazı tipi değişmedi — onu doğrudan sütunda ayarladık. Bu yaklaşım, grid içeriğinin görüntülenmesini daha esnek şekilde yönetmeye olanak tanır. Belirtelim: varsayılan olarak tüm AssignedValues değerleri False'tur, yani parametrelerin neredeyse tümünün değerleri gridden alınır.
View nesnesinin tüm özellikleri birkaç grupta toplanmıştır.
Active — geçerli View'ın etkinliğini belirlemeye olanak tanır.
Appearance — View nesnesinin görünümünü belirler. AssignedValues'da ilgili parametre False olarak ayarlandığında değer doğrudan gridden alınır:
DataController — verilere erişimi tanımlayan özellik. Ayrıntılı olarak sonraki makalede ele alacağız.
OptionsBehavior — gridin davranışını belirler. İç özellikleri:
OptionsCustomization — kullanıcıya çeşitli işlemlere izin verir: verilerin filtrelenmesi, gruplandırılması ve sıralanması; sütunların gizlenmesi, taşınması ve boyutlarının değiştirilmesi ve diğerleri. Bu işlemler, her sütunda aynı adlı özellikle geçersiz kılınabilir.
OptionsData — kullanıcıya gridin verileri üzerinde işlemler yapma izni verir: ekleme, yeni kayıt ekleme, silme ve düzenleme.
OptionsDataNavigator — veri gezginini ayarlamaya olanak tanır: konumunu, gridin kenarlarına hizalanmasını, ayrıca düğmelerin boyutunu, görünümünü ve gösterilecek düğme kümesini.
OptionsView — gridin görünümünü ayarlamaya olanak tanır. Bazı alt özellikleri ayrıntılı inceleyelim:
View nesneleriyle koddan da çalışılabilir. Yeni bir nesne şu yapıyla oluşturulabilir: frGrid.Views.CreateView(TfrGridTableView).
Silme işlemi için View'ı gridin Views listesinden kaldırmak (frGrid.Views.Remove(View)) ya da doğrudan View.Free çağırmak yeterlidir. Program aracılığıyla başka bir View'a geçmek gerekirse, ona View.Active := True ayarlamak yeterlidir.
View'ın geçerli etkin sütununu View.Controller.FocusedColumnIndex özelliğiyle belirleyebilirsiniz.
View nesnesinde programcının kullanabileceği çok sayıda olay bulunur: OnKeyDown gibi standart olayların yanı sıra gride özgü olaylar da vardır — amaçları genel olarak adlarından anlaşılır. View olay kümesinin (ve yalnızca onun değil) ilginç bir özelliği, bazı olaylarda var AAllow: Boolean parametresinin bulunmasıdır. Programcı, olay işleyicisinde bu parametreyi False yaptığında herhangi bir işlemi kolayca engelleyebilir. Örneğin bunu OnEditing işleyicisinde ayarlarsak, geçerli hücre için düzenleme moduna geçişi engellemiş oluruz.
View olaylarından bazılarını ayrıntılı inceleyelim.
Bu olayların ortak öğeleri vardır. Tüm işleyicilerde AItem parametresi tablo sütununa bir referans, ARowIndex ise gridle ilişkili DataController'daki veri satırının numarasıdır.
View, bir sütun kümesi içerir. Sütunlar hem IDE'nin form düzenleyicisinde hem de programın çalışma zamanında eklenebilir. Sütunun temel özelliklerini inceleyelim.
Appearance — sütunun görünümünü belirler:
Caption — sütun başlığı.
DataBinding — verinin sütuna bağlanmasını tanımlayan özellik. Ayrıntıları aşağıda ele alınacaktır.
GroupIndex, MergedGroupIndex — sütunun bulunduğu grubun indeksi ve sütunun bu gruptaki indeksi. Varsayılan değerleri -1'dir (sütun bir gruba dahil değildir). Bu özellikleri değiştirerek griddeki gruplandırmayı doğrudan yönetebilirsiniz — gruplar oluşturabilir ve silebilirsiniz. Gruplandırma alanının gösterimine izin verildiyse, kullanıcı çalışma zamanında grupları kendisi oluşturabilir ve silebilir: bunun için sütun başlığını gruplandırma alanına sürüklemek yeterlidir. Böylece sütun görünen listeden kaybolur, ancak griddeki veriler bu sütunun alanının değerine göre gruplandırılır. Belirtelim: grid bu sütuna göre her zaman sıralama yapacaktır.
Gruplandırma çok düzeyli olabilir — gerekli sütun başlıklarını sürüklemeniz yeterlidir. Ctrl tuşuna basılı tutarak sütun başlığını sürüklerseniz, birden çok sütuna dayalı bir grup oluşturabilirsiniz. Gruplandırmaya artık gerek yoksa, sütun başlığını gruplandırma alanından tekrar gride sürükleyin.
Index — sütunun ekrandaki görünür indeksi. Bu özelliği değiştirerek sütunun griddeki konumunu doğrudan değiştirebilirsiniz.
MinWidth — sütunun en küçük genişliği. Dikkat edin: varsayılan olarak bu değer 0 değil, 20'dir.
Options — bu özellik, kullanıcının sütunla tam olarak hangi işlemleri yapabileceğini ayarlamaya olanak tanır: düzenleme moduna geçirmek, sütun verilerine göre filtrelemek, gruplandırmak, sütunu gizlemek, boyutunu değiştirmek, taşımak, sütun verilerini değiştirmek, sıralamak ve ayrıca sütun listesinde göstermek. Görüldüğü gibi bu işlem listesi, View.OptionsCustomization'da bulunanla neredeyse aynıdır.
Properties — bu özellik aracılığıyla sütunda kullanılacak düzenleyiciyi belirleyebilirsiniz. Özellik ayarlanmazsa, grid sütunun veri türüne dayanarak bir düzenleyici seçmeye çalışır. Bu özelliğe açılır listeden bir değer atanırsa, daha sonra bu değer genişletilebilir ve seçilen düzenleyicinin özellikleri ayarlanabilir. Düzenleyiciler ayrı bir makalede ayrıntılı olarak ele alınacaktır. Şimdilik şunu belirtelim: düzenleyici yalnızca tek bir hücrenin değerinin düzenlenmesinden değil, tüm sütunun değerlerinin görüntülenmesinden de sorumludur. Düzenleyiciler ayrıca bağımsız bileşenler olarak da kullanılabilir. Düzenleyicinin özelliklerine erişim ancak düzenleyici açıkça belirtilmişse mümkündür: varsayılan düzenleyicilerde özelliklerin ayarlanma imkânı yoktur.
SortOrderIndex, SortOrder — bu özelliklerle gridin alanlarının sıralamasını belirleyebilirsiniz. SortOrderIndex alanı, sıralamada alanın önceliğinden sorumludur: önce SortOrderIndex = 0 olan alana göre sıralama yapılır; bu sütundaki değerler eşleşirse, SortOrderIndex = 1 olan sütuna göre sıralarız. SortOrderIndex = -1 ayarlanırsa, bu sütuna göre sıralama yapılmaz.
SortOrder özelliği sıralama düzenini belirler: soNone — sıralama yok, soAscending — artan sıralama, soDescending — azalan sıralama. Belirtelim: kullanıcı sütunların sıralamasını çalışma zamanında da ayarlayabilir; bunun için sütun başlığına sol fare tuşuyla tıklamak yeterlidir. Tekrar tıklandığında sıralama düzeni tersine döner. Sıralama, başlığına tıklanan sütuna göre yapılır. Sıralamayı iptal etmek için Ctrl tuşuna basılı tutarak sütun başlığına tıklamak yeterlidir. Tıklama sırasında Shift tuşuna basılı tutulursa, aynı anda birden çok sütuna göre sıralama yapılabilir.
Koddan sütun oluşturmak için View.Columns.CreateColumn metodunu kullanabilirsiniz. Sütuna düzenleyici atamak için Column.PropertiesAlias özelliğine düzenleyicinin adını içeren bir dize atayabilir ya da Column.PropertiesClass özelliğine düzenleyicinin sınıf türünü belirleyebilirsiniz.
View'ın sütun listesini View.Columns.Clear metoduyla temizleyebilirsiniz. Ayrıca Columns.VisibleCount ve Columns.VisibleItems özellikleri de faydalı olabilir — bunlarla yalnızca görünür sütunlara erişilebilir; ayrıca bu listedeki sütunlar ekrandaki konumlarına göre sıralanır.
Veri sütununun olaylarını inceleyelim. Daha önce belirtildiği gibi, sütunun bazı olayları View'ın olaylarına benzerdir.
Makalenin sonunda gridin verilerle çalışmasının özellik düzeyinde nasıl ayarlandığına kısaca bakalım. Bildiğimiz gibi grid, verilerle iki modda çalışabilir: DB ve Unbound.
DB modunda grid, standart TDataSource bileşenini kullanarak verilerle bağlantı kurar; örneğin standart TDBGrid bileşeninin yaptığı gibi. Object Inspector'da View.DataController := 'DB' ayarlandıktan sonra bu özellik genişletilerek istenen TDataSource belirtilebilir. DataSource belirlendikten sonra sütunlarda gezinilip her sütunun DataBinding.FieldName özelliğine istenen veri alanının adı yazılabilir. DataBinding.FieldType özelliği değiştirilemez — değeri DataSource'un ilişkili veri alanından alınır.
Unbound modunda grid biraz farklı çalışır. View.DataController := 'Unbound' ayarlandıktan sonra grid, doğrudan kendi içinde depolanan verilerle çalışma moduna geçer. Veri kümesinin sütunlarını tanımlamak için önce bunları oluşturmak gerekir — örneğin lejanttaki View'ın açılır menüsünden — ardından sütun nesnelerine geçip her sütunun DataBinding.FieldName alanına veri alanının adını, DataBinding.FieldType alanına ise veri alanının türünü yazmak gerekir. Bundan sonra gridin iç deposunda üzerinde çalışılabilecek ilgili alan kümesi oluşturulur.
FastGrid'in iç yapısını inceledik: temel kontrol öğesi olarak gridin rolünü, View nesnesini ve özelliklerini, AssignedValues alt özelliğiyle Appearance mekanizmasını, ayarları ve olaylarıyla sütunları ve ayrıca verilerle çalışmanın iki modunu — DB ve Unbound. Bunlar, gridin görünümünü ve davranışını hem tasarım zamanında hem de koddan ayarlamak için yeterlidir.
Sırada son büyük konu var — verilerle çalışma: DataController, DataSource bağlama, kayıtların düzenlenmesi ve gezinme. Dizinin bir sonraki makalesinde tam olarak bu konuyu ayrıntılı inceleyeceğiz.