Treeview İçin Yardım ve Basit Örnekler

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
R.K.
Üye
Mesajlar: 82
Kayıt: 02 Nis 2007 12:05
Konum: Adana

Treeview İçin Yardım ve Basit Örnekler

Mesaj gönderen R.K. »

Arkadaşlar kolay gelsin. Şu treeview olayını bir türlü anlayamadım kusura bakmayın. Sorun bende biliyorum çünkü bilgim yeterli değil ama basit örneklerle yardımcı olabilecel arkadaşlar olursa sevinirim. Benimde treeview bileşeniyle yapmak istediğim master-detail tablolarımı treeview ile gösterebilmek. Yani ilk olarak tüm ürünler eklenecek treeview bileşenine sonrada master olarak markalar tablosundaki bilgiler. Detail olarakta ürünler tablosunda markalara göre ürünleri eklemek istiyorum. Sitede ve internette aradım ama treeview bileşenini tam olarak bilmediğimden galiba istediğim sonuca ulaşamadım. Bu bileşenin data-aware versiyonu devexpress bileşen setinde var galiba ama o da paralı sonuçta kendi çözümümü bulmam lazım. Bir sitede gördüm bu bileşeni data-aware bileşen olacak şekilde yeni bileşen oluşturmuşlar.
Borland C++ Builder'ın kullanıdığı sınıf kütüphanelerinden VCL veri tabanındaki kayıtları ağaç yapısında gösteren bir bileşene sahip değildir. Bu dökümanımızda bu eksikliği nasıl gidereceğimizi göreceğiz.Veri tabanındaki kayıtları ağaç şeklinde göstere bilmek için yeni bir sınıf tanımladıkdbTreeView. Sınıfın tanımlaması aşağıda görülmektedir.

Kod: Tümünü seç

class dbTreeView
{

public:
dbTreeView(TTreeView *inTree, TQuery *inQuery);
TQuery *query; // Ağacı oluşturulurken kullanacağı sorgulama nesnesi(VCL)
TTreeView *tree; // VCL'in ağaç gösterim nesnesi
TTreeNode **currentNodeList; //
String *FieldNames; // Alan isimlerini tutuyor
void Init(int number); // Ağacın kaç düzyden oluşacağını belirtir.
// Herhangi bir düzeye gelecek alan ismini atamak için kullanılır.
void SetFieldName(String name, int index);
// Veri tabanidaki değişiliklere göre ağacı yeniden olu?turur.
void Refresh();
// Paramtere olarak verilen sorgulama nesnesinin aktif kayıdını değerlerine
// bakarak ağaçta bu değerleri içeren düğümü bulup o düğüme konumlanıyor.
TTreeNode* Search(TQuery *qrySearch);
~dbTreeView();
// A?açta kaç alan kullnıldığını yani ağacın kaç düzeyden oluştuğunu döndürüyor.
int GetNumberOfFields(){return numberOfFields;}

protected:
int numberOfFields;
};  

<t>dbTreeViewsınıfı tanımlamasından da görüleceği gibi constructor'ında birTTreeViewpointer'ı, bir de TQueryTQuery pointer'ı alır. Veri tabanı ile bağlantı işi TQuery nesnesi aracılığıyla, ağaçın gösterimi ise TTreeViewnesnesi aracılığıyla gerçekleştirilir. dbTreeView iki sınıfın arasında kaynaştırıcı görevi yapar.
Şimdi dbTreeView sınıfının fonksiyonlarının üzerinde teker teker gidelim.
void Init(int number); // Ağacın kaç düzyden oluşacağını belirtir.
dbTreeView nesnesinin kaç basamaklı bir ağaç oluşturacağını belirmek için kullanılır. Bu fonksiyon en az bir kez çağırılmalıdır.
void SetFieldName(String name, int index);
Ağacın hangi basamağınınTQuery nesnesinin hangi alanındaki bilgiyi içereceği bu fonksiyon ile belirtilir.

En küçük index değeri bir dir. İndex paramteresinin değeri Init fonksiyonu çağırılırken geçilen değerden büyük olamaz.
void Refresh();
Veritabanına yeni kayıt eklemesi var olan kayıların değiştirilmesi veya silinmesi ağaçta da güncellemelerin yapılmasını gereketirmektedir. Bu fonksiyon TTreeView nesnesinin tüm düğümlerini silip veri tabanının yeni durumuna göre güncellenmiş ağacın oluşturulmasını sağlıyor.
TTreeNode* Search(TQuery *qrySearch);
Her hangi bir TQuery nesnesinin aktif kayıdını ele alıp ağaç üzerinde arar. Ağaçta bulabilirse hedef düğüme ulaşmak için geçtiği yolu açar.


Parametre olarak geçilen TQuery nesnesi dbTreeView nesnesinin ağaç olarak gösterdiği alanlar ile aynı isimde alanlar içermelidir.
int GetNumberOfFields(){return numberOfFields;}
Ağacın kaç basamaklı olduğunu döndürür.


Yukarıda dbTreeView sınıfının kullanıldığı bir örnek programın ekran görüntüsü görülmektedir. Program C++ Builder ile birlikte gelen BCDEMOS veritabanının customer.db isimli tablosundaki kayıtları ağaç yapısında listeler.
Program veri tabanındaki 3 alanı kullanarak 3 basamaklı bir ağaç oluşturur.

Kod: Tümünü seç

void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
pDBTreeView = new dbTreeView(dbTree, dbTreeQuery);
pDBTreeView->Init(3);
pDBTreeView->SetFieldName("Country", 1);
pDBTreeView->SetFieldName("City", 2);
pDBTreeView->SetFieldName("Company", 3);
} 
Ana formun create eventinde dinamik olarak bir dbTreeView nesnesi yaratılıyor. Daha sonra yaratılan nesnenin Init fonksiyonu çağırılmak suretiyle 3 basamaklı bir ağaç oluşturulacağı belirtiliyor. Son olarak da sırasıyla üç alanın ismi de tanımlanıyor.


İndex'i küçük olan alan ağaçta daha üs düzeyde gözükecektir.

Kod: Tümünü seç

void __fastcall TfrmMain::btnRefreshTreeClick(TObject *Sender)
{
pDBTreeView->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSearchClick(TObject *Sender)
{
pDBTreeView->Search(qryDetail);
}
 
Görüldüğü gibi dbTreeView sınıfı sayesinde herhangi bir veritabanındaki kayıtları ağaç yapısında göstermek için yazmamız gereken kod bir kaç satırla sınırlı. Çalışma zamanında ağacın yapsını kullandığı anları bağlı olduğu veritabanını da değiştirmek mümkün.


Ağacın oluşturulması için kullanılacak TQuery objesi ağacın alanlarına göre sıralanmış olmalıdır. Yukarıdaki örnek için Önce Country'e sonra City ve son olarak Company'e göre.
Örnek Programın çalışa bilemesi için makinanızda BCDEMOS alias'ının tanımlı olması gerekmektedir.
Delphi içinde yapmak bu kadar kolay olur mu? Kendi programlarınızda bu bileşenle yazdığınız kodlar varsa eklerseniz sevinirim arkadaşlar. Kolay gelsin...[/code]
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

viewtopic.php?t=14251&highlight=data
belki bu linkten biraz faydalanabilirsin...
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla