component yapimi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

component yapimi

Mesaj gönderen husonet »

Kimden: serdarsokol
Kime: husonet
Tarih: Pts Mar 22, 2004 8:28 am
Konu: component yapimi
selam,

mysql e delphi 7 den direkt baglanabilmek icin kendi componentimi yazmak istiyorum.

nerden ve nasil baslayacagimi bilmiyorum...

bana yol gosterip, isik tutar misiniz?
Merhaba
Öncelikle lütfen Delphi ile ilgili konuları Mail çekmeyiniz 1 kişinin okuyup saat'ler sonra Msj yazması var 1000 küsür kişinin okuyup cevap yazması var lütfen!!!

Sorunuza gelelim OOP konusunda bilgi dereceniz nedir. Bence konuya OOP dan girmeniz gerekmektedir ki bu konu o kadar basit değildir. Bende bir zamanlar bu konuyla ilgilenmiştim ve baktımki yapmaya çalıştıklarım zaten piyasada var bu şu demek oluyor 'AMERİKAYI BİR DAHA KEŞFETMEYE GEREK YOK' yazdıklarımı bir düşün.

Yaa tuturdunki illa ben kendi işimi kendim yapacağım Elalemin yazdığı komponenti kullanmak istemiyorum aramızda kalsın bunu ben bazen diyorum. Ama Component yazmak tam bir problem.


Bir zamanlar yararlandığım kaynakları sizle paylaşmak istiyorum umarım OOP ile ilgilenen bütün arkadaşların işine yarar.
TCollection, TObjectList, TDataset

TPersistent sınıfyla ilgili kısa açıklamadan sonra kalıcı nesne çatımızda kullanacağımız nesnelerin açıklamalarına devam ediyorum. Konumuza TObjectList sınıfıyla devam edeceğiz. Delphi 6 ile birlikte Contnrs.pas adında yeni bir unit geldi. Gerçi eskiden Jedi JCL kütüpahesini kullananlar delphi 5 ile de bu sınıfları kullanabiliyorlardı ama Borland artık bu tür kapsayıcı sınıfları da delphi’ye ekledi.

TCollection sınıfını kullananlar TcollectionItem sınıfından türettiğimiz sınıfları TCollection sınıfından türettiğimiz kapsayıcılara ekleyerek Nesne kolleksiyonları oluşturulabileceğini bilirler. Örneğin TDBGrid TCollection sınıfından türetilmiş bir TDBGridColumns sınıfına sahiptir. Ayrıca bir de TCollectionItem sınıfından türetilmiş bir TColumn sınıfına sahiptir. Gridin columns özelliği TDBGridColumns tipindedir ve bu sınıfın görevi TColumn sınıfının örneği olan nesneleri kapsamaktır. Yani “grid1.columns[1].fieldName” dediğimiz zaman kapsayıcı nesne olan Columns nesnesinin kapsadığı 2. nesnenin (yani TColumn tipinde bir nesne) fieldName özelliğine erişiriz. Sonuç olarak TCollection sınıfını gridin kolonları için yaratılmış olan nesnelerin işaretçilerini tutan bir array olarak düşünebiliriz. TCollection sınıfı özellikle bileşen yazarları için çok önemli bir sınıftır. Delphi bu sınıf için design-time da object Inspecordan erişilebilecek özellik editörü (TdbGrid’in Columns özelliğine çift tıkladığımızda gelen editör) sunar. Hatta bu editörün yeteneklerini kısıtlı bulan programcılar delphinin sunduğunu ezip edip kendi özellik editörlerini de programlayabilirler.

TCollection sınıfını kullanabilmek için kolleksiyona ekleyeceğimiz sınıfın TCollectionItem soyundan gelmesi şarttır. Bileşen yazmıyorsak ama yine de bir nesne listesine ihtiyacımız varsa TList sınıfı yardımımıza koşar. Bu sınıf yarattığımız (create) nesnelerin işaretçilerini (pointer) depolamak maksadıyla kullanabileceğimiz bir sınıftır. Liste üzerinde iterasyon yaparak istediğimiz nesneye erişebilir, listeye yeni nesneler ekleyebiliriz. Bu sınıf çok genel amaçlı bir sınıf olduğu için işaretçi tutmaktan ve sıralama yapmaktan başka hiçbir iş yapmaz.

Daha yetenekli bir nesne kapsayıcısı TList soyundan gelen TObjectList’tir. Bu sınıftan yarattığımız nesneler TObject’ten yaratılmış her türlü nesneyi içerebilirler. TObjectList sınıfı içerdiği nesneleri sahiplenir ve bu nesnelerin yıkılmasından sorumlu olur. MyObjectList.items[0].remove gibi bir çağrı sıfırıncı nesneyi hem listeden çıkarır hem de nesneyi yıkar (free). Bu sınıfın add,first,last,remove,indexof gibi metodlarını kullanarak nesneleri yönetebiliriz.

Üçüncü önemli sınıfımız TDataset sınıfıdır. TDataset sınıfını duyduğumuz zaman hemen aklımıza BDE, access, interbase gibi veri kaynaklarına erişim gelir. Aslında TDataset sınıfı bir verikaynağına erişim için gerekli genel metodları sağlar. TDataset sınıfının database’ler ile ilgili bir bilgisi yoktur. Veritabanına erişimi TBDEDataset, TCustomAdoDataset, TIBCustomDataSet gibi TDataset soyundan gelen sınıflar sağlar. TDataset sınıfı bir verikaynağına erişim sağlarken kullanılacak olan genel sanal metodlar içermektedir. BDE’te erişmek için kullanılan TBDEDataset sınıfında bu metodlar ezilir ve BDE’ye özgü işlemler bu metodlara yazılır.

İşte güzel olan nokta TDataset sınıfından TObjectList sınıfını verikaynağı olarak kullanabilecek TObjectDataset gibi özel bir TDataset yazılabilir olmasıdır. Yani klasik Tstok nesnemizin published özelliklerini alan (Field) olarak kullanacak ve klasik dataset komutlarıyla çalışabilecek olan bir Dataset. Bu sayede TPersistent konusunu anlatırken bahsettiğim şekilde TStok nesnelerini veritabanından okuyup, TStokList gibi bir TObjectList kapsayıcısı oluşturursak ve bunu TObjectDataset’imize bağlarsak bir DBGird (veya TdxDbGrid gibi üçüncü parti bir grid) içinde bütün stoklarımıza erişebilir, TObjectList içinde barınan nesnelerimizin özelliklerini değiştirebiliriz. Örneğin MyObjectDataset.delete dediğimiz zaman dataset otomatik olarak kayıt katmanına nesnenin işaret ettiği kaydın (record) silineceğini bildirecek ve TObjectlist’in remove metodunu kullanarak nesnenin yıkılmasını sağlayacaktır. Burada kayıt katmanına yaptığımız çağrılarla kayıt katmanının bir TObjectList oluşturmasını sağlayacağız. Oluşan TObjectList’i sunum katmanına geçerek sunum katmanının otomatik olarak grid içeren bir form oluşturmasını veya kendi dizayn ettiğimiz bir forma bağlanmasını sağlayacağız. Bu mekanizma kurulduktan sonra programcıya programı yazarken düşecek iş sadece kayıt katmanının nesne listesini oluştururken hangi kriteri kullanacağını belirlemek olacaktır.
TPersistent

Tpersistent sınıfı “Kalıcı Sınıflar” (Persistent Objects) konumuzda çok önemli bir rol oynamaktadır. Bu yüzden bu sınıf ve bu sınıfla yapılabilcekler hakkında bir kaç konuyu incelemekte fayda var.

Delphi design time modunda iken forum üzerine koyduğumuz nesneleri dfm dosyasının içine kaydeder. Bu kaydetme sonucunda oluşan dosya formun üzerinde iken ctrl+f12 kombinasyonuyla görüntülenebilir. Sonra program çalışırken bizim dfm dosyalarının içinde kaydolmuş olan özelliklerin değerleri nesneler create edilirken atanır. Yani dfm dosyasının içinde edit1.text = ‘TEST’ yazıyorsa program çalışıyorken edit1 içinde TEST yazılı halde gelir. Bunda ilginç olan bir durum yok. Yani herşey beklendiği gibi çalışıyor ve pek bir sihir yok gibi görünüyor. Burada bilinmesi gereken nokta edit1.text = ‘TEST’ gibi bir bilginin exenin içinde biryerlerde yazılmış durumda olmasıdır. Bu bilgilere RTTI (Runtime Type Information) denmektedir ve resource olarak exe’nin içine kaydedilirler. Bu nedenle exescope gibi resource editor programlar kullanılarak delphi programlarının exesiyle oynanabilir ve örneğin kötü niyetli kişiler programın ana formunun caption property’sini değiştirebilmektedirler. İşin büyülü kısmı TPersistent sınıfında gizlidir. TPersistent sınıfından türetilen bütün nesneler published özelliklerini bir stream’e yazıp stream’den okuyabilirler. Yani bir bileşen (Tcomponent de Tpersistent sınıfından türemiştir) yazmıyorsak ama özelliklerini kaydedip yükleyebilmek istiyorsak o zaman nesnemizi TPersistent sınıfından türetmeliyiz. Bu bize nesnemizi olduğu gibi bir dosyaya kaydedebilmemize hatta stream’i bir variant’a çevirip com nesneleri arasında paylaşabilmemize, olanak tanırlar. Bir nesneyi olduğu gibi DCOM ortamında iki bilgisayar arasında geçebilmek bir nevi delphi türü soap uygulamasıdır.

Kalıcı nesneler oluşurmak için RTTI bilgilerinin kullanılabileceğini düşünmekteyim. Mesela TStok nesnemizi TPersistent sınıfından türetirsek bu sınıfın RTTI bilgilerine bakarak bu stok için alanları nesnenin published özellikleriyle adaş olan bir tablo yaratabilir, bu tablodan seçim yapabilecek bir SQL cümlesi otomatik olarak oluşturulabilir. Kısaca standart sql ile yapılabilecek her türlü işlemi otomatik olarak yapabiliriz.

Tstok = class(TPersistent)
Public
Procedure Save;
Proceudre Load;
Property TabloAdi:String
Published
Property IND:Integer;
Property Stokkodu:String;
Property MalinCinsi:String;
Property Birim:Integer;
End;

Gibi bir sınıfımız olduğu zaman eğer biz Tablo adı özelliğine ‘TBLSTOKLAR’ gibi bir isim verip IND özelliğini key Field olarak ele alırsak. IND özelliğine 100,101 gibi bir numara atayıp load dediğimizde

Select Stokkodu, Malincinsi, Birim From TBLSTOKLAR Where IND = 100

Gibi bir cümle veya save dediğimizde

Update TBLSTOKLAR set Stokkodu = ‘XX’, Malincinsi = ‘XX’, Birim = 10 where IND = 100

Gibi bir cümle otomatik olarak oluşturulabilir. Burada yine bir property olan ama Published kısmında yazılmadığı için asla RTTI’dan ulaşılamayacak olan TabloAdi özelliğine dikkat ediniz.

Bu konular derinlemesine “Kalıcı Nesne Çatısı” dökümanında incelenecektir. Nesnelerin bu mekanizma ile yüklenip kaydedilmesinin uygun olup olmayacağını tartışmaya açabilmek için konuyu ayrıca ele aldım. Bu dökümanın devamında nesnelerin ve nesne kolleksiyonlarının kullanıcıya nasıl gösterilebileceğine dair kısımlar eklenecektir.
Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

ya arkadaşlar şu özel mesaj/e-mail olayına bir son verelim artık.

1. yöneticilerden özel mesajla cevap alamazsınız :!:

2. Kıdemli Üyelerden özel mesajla cevap alamazsınız :!:

3. Siz de lütfen özel mesajla cevap vermeyin ve sormayın.

SEBEPLER

1. Bir kişi herşeyi bilemez. Onun bilmediği birşeyse sorunuz zaten cevapsız kalır. 1 kişiye sormakla 1050 kişiye sormak farklı şeyler.

2. Forumda zaten arkadaşlar bildikleri birşeyse çok kısa sürede cevap yazıyorlar zaten. İnanmayan oturup bir istatistik yapsın :) 10.000 mesaj için benim gözüm yemedi, sonucu bana da gönderirse sevinirim. Ben sadece son hakkus'un sorusunu örnek veriyim.

soru sorma zamanı : 02:47
ilk cevap : 02:54 (7 dakika)
2. cevap : 02:57 (10 dakika)

3. Bir de soru sorduğunuz zaman o kişi müsait olmayabilir. Onun çalışmasını bölmeniz hoş olmaz. Ama herkes müsait olduğu zamanda foruma giriyor.

4. Özel mesajla/maille cevap alsanız bile bu sadece size faydalı olur, diğer türlü 1050 kişi ve sonraki üyelerde faydalanıyor.
...........

Bu bu konudaki son uyarım.

Kolay gelsin.
Cevapla