Multi inheritance ve bir kac detay
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Multi inheritance ve bir kac detay
Yaptigim arastirmalar neticesinde delphinin multi inheritance desteklemedigini ögrendim. multi inheritance'e alternatif yapabilecegim birsey var mi?
Override ettigim bir prosedüre inherited dedigimde iki alt sinifin prosedürünü cagirmaliyim. Redirecting ile de sonuca varamadim.
Override ettigim bir prosedüre inherited dedigimde iki alt sinifin prosedürünü cagirmaliyim. Redirecting ile de sonuca varamadim.
kıdemsiz üye
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Multi inheritance ve bir kac detay
interfaceleri kullanarak yapabilirsiniz
Re: Multi inheritance ve bir kac detay
http://www.tugrulhelvaci.com/?p=582 makalesi belki faydalı bir kaç malümat içeriyor olabilir.
Re: Multi inheritance ve bir kac detay
ilginiz icin tesekkür ederim.
TCustomForm'a ait olan bir prosedürü override edip multi inheritance yapmam gerekiyor. Bu nedenle interface kullanamiyorum.
Yada benim kacirdigim baska bir nokta mi var?
TCustomForm'a ait olan bir prosedürü override edip multi inheritance yapmam gerekiyor. Bu nedenle interface kullanamiyorum.
Yada benim kacirdigim baska bir nokta mi var?
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
Delphi'nin kendi sınıfları üzerinde değişiklikler yapıp risklere açık olmak yerine; neden TForm'dan türeyen size özel bir sınıf tanımlayıp, uygulamanızdaki tüm formları bu form'dan türetmiyorsunuz ?
Örneğin;
gibi. Bu gibi bir kullanımda, uygulamanızdaki tüm form'lar TXForm'dan türedikleri için istediğiniz an inheritance'ın nimetlerinden istifade edebilirsiniz. Aynı zamanda; TXForm'unuz IMyInterface arabirimini implemente ettiği için, TXForm'dan türeyen tüm formlarınız da bu interface'i implemente etmiş olacaklardır.
Örneğin;
Kod: Tümünü seç
type
IMyInterface = interface
[{.....}]
end;
TXForm = class(TForm, IMyInterface)
...
..
end;
Re: Multi inheritance ve bir kac detay
Tugrul abi ben anlatamadim sanirim.
Makaleyi okudum fakat baglanti kuramadim.
Ben TXForm adinda bir class'i TCustomForm'dan türetiyorum. TCustomForm'un CreateWnd prosedürünü override ediyorum. Override ettigim prosedür icerisinde inherited kullandigimda TCustomForm'un prosedürünü degil, TScrollingWinControl yani TCustomForm'un ata sinifinin prosedürünü isleme sokmasi gerekiyor.yerinegibi...
Makaleyi okudum fakat baglanti kuramadim.
Ben TXForm adinda bir class'i TCustomForm'dan türetiyorum. TCustomForm'un CreateWnd prosedürünü override ediyorum. Override ettigim prosedür icerisinde inherited kullandigimda TCustomForm'un prosedürünü degil, TScrollingWinControl yani TCustomForm'un ata sinifinin prosedürünü isleme sokmasi gerekiyor.
Kod: Tümünü seç
begin
inherited CreateWnd;
end;
Kod: Tümünü seç
begin
inherited inherited CreateWnd;
end;
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
Ama o zaman beklenmeyen durumlar ile karşılaşabilirsin. Inheritance hiyerarşisini bozmak istiyorsun !
Re: Multi inheritance ve bir kac detay
TCustomForm'un CreateWnd prosedüründe yapilan islemi kendi class'im icerisinde yaptiracagim.
Forms.pas dosyasi ile oynama yapmak istemiyorum.
Forms.pas dosyasi ile oynama yapmak istemiyorum.
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
delphi yok şuan, deneme şansım yok ama maksat TScrollingWinControl sınıfının CreateWnd metodunu çağırmaksa,
gibi bir kullanım işinizi görmez mi?
Kod: Tümünü seç
(self as TScrollingWinControl).CreateWnd;
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Re: Multi inheritance ve bir kac detay
Malesef yine kendi kendisini cagiriyor.unicorn64 yazdı:delphi yok şuan, deneme şansım yok ama maksat TScrollingWinControl sınıfının CreateWnd metodunu çağırmaksa,gibi bir kullanım işinizi görmez mi?Kod: Tümünü seç
(self as TScrollingWinControl).CreateWnd;
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
Bir başka bakış açısı olsun diyelim. Zaten Delphi'de MultiInheritance desteği olmadığı konusunda mutabık kaldık gibi görüyorum.
Burada sınıflar üzerinden durumu simülasyon ile aynı işi yapabileceğinize ilişkin çözüm yolları anlatılmış. Zaten bildiğiniz şeyler olduğunu değerlendiriyor olsam da hatırlatıcı olması için burayı inceler misiniz?
Bir de bununla nasıl bir işlem yapmak istediğiniz hakkında fikir alabilir miyim? İhtiyacın nasıl doğduğu konusunda merak ettim. Belki buradan yürüyüp bypass işlemleri uygulayabiliriz.
Burada sınıflar üzerinden durumu simülasyon ile aynı işi yapabileceğinize ilişkin çözüm yolları anlatılmış. Zaten bildiğiniz şeyler olduğunu değerlendiriyor olsam da hatırlatıcı olması için burayı inceler misiniz?
Bir de bununla nasıl bir işlem yapmak istediğiniz hakkında fikir alabilir miyim? İhtiyacın nasıl doğduğu konusunda merak ettim. Belki buradan yürüyüp bypass işlemleri uygulayabiliriz.
Re: Multi inheritance ve bir kac detay
Hocam vermis oldugunuz link'e arastirmalarim sirasinda rastlamistim.
Merakinizi gidermek icin sorunumu mümkün oldugunca izah etmeye calisayim.
MdiForm'daki client area'yi kendim olusturacagim.
Aslinda sorun suradan basladi; WM_NCCalcSize mesajini yakalayip NonClient bölgesi yaptigim halde farenin WM_NCMouseMove mesajini yakalayamiyorum. Oysaki ClientArea'da olusturdugum NonClientArea icerisine kendime has Bar cizip üzerinde fare oynamalari oldugunda invalidate edip yeniden cizdirmem gerekiyor. Bu sorunu cözemedigim icin kendi penceremi olusturup, ignore edilen mouse mesajlarina da ulasabilmeye calisiyorum.
TCustomForm'un CreateWnd prosedürünün icerisinde inherited cagirilmis. Bu da TScrollingWinControl'un CreateWnd prosedürünü cagiriyor.
TCustomForm'u baz alarak yeni bir Class türetip CreateWnd prosedürünü override ettigimde ve bu prosedür icerisinde inherited dedigimde TScrollingWinControl yerine kendi alt sinifi olan TCustomForm'un CreateWnd prosedürünü cagiriyor ve ClientArea iki defa olusturulmus oluyor.
Redirecting ile sorunu cözmeye calistim fakat Delphi7 kullandigim icin Class Helper tanimlayamiyorum ve bu nedenlede Protected deklare edilmis olan CreateWnd prosedürüne ulasamiyorum.
Örnegin metodlarin adreslemeleri sabit olmus olsa ve bir sekilde protected metodun adresi Get edilebilinse Redirecting ile sorunu kökten cözmüs olacagim. Adreslerin get edilebilinmesi icin Package kullanmak gerekiyor. Ben ise Package kullanmadan bu sorunu cözmeye calisiyorum.
Merakinizi gidermek icin sorunumu mümkün oldugunca izah etmeye calisayim.
MdiForm'daki client area'yi kendim olusturacagim.
Aslinda sorun suradan basladi; WM_NCCalcSize mesajini yakalayip NonClient bölgesi yaptigim halde farenin WM_NCMouseMove mesajini yakalayamiyorum. Oysaki ClientArea'da olusturdugum NonClientArea icerisine kendime has Bar cizip üzerinde fare oynamalari oldugunda invalidate edip yeniden cizdirmem gerekiyor. Bu sorunu cözemedigim icin kendi penceremi olusturup, ignore edilen mouse mesajlarina da ulasabilmeye calisiyorum.
TCustomForm'un CreateWnd prosedürünün icerisinde inherited cagirilmis. Bu da TScrollingWinControl'un CreateWnd prosedürünü cagiriyor.
TCustomForm'u baz alarak yeni bir Class türetip CreateWnd prosedürünü override ettigimde ve bu prosedür icerisinde inherited dedigimde TScrollingWinControl yerine kendi alt sinifi olan TCustomForm'un CreateWnd prosedürünü cagiriyor ve ClientArea iki defa olusturulmus oluyor.
Redirecting ile sorunu cözmeye calistim fakat Delphi7 kullandigim icin Class Helper tanimlayamiyorum ve bu nedenlede Protected deklare edilmis olan CreateWnd prosedürüne ulasamiyorum.
Örnegin metodlarin adreslemeleri sabit olmus olsa ve bir sekilde protected metodun adresi Get edilebilinse Redirecting ile sorunu kökten cözmüs olacagim. Adreslerin get edilebilinmesi icin Package kullanmak gerekiyor. Ben ise Package kullanmadan bu sorunu cözmeye calisiyorum.
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
Interposer class kullanıp amacına ulaşabiliyor musun diye test edebilir misin ?
Örneğin:
gibi
Örneğin:
Kod: Tümünü seç
TCustomForm = class(Forms.TCustomForm)
end;
TYeniForm = class(TCustomForm)
end;
Re: Multi inheritance ve bir kac detay
Malesef, yine Forms.pas dosyasinda tanimlanan TCustomForm'un prosedürünü cagiriyor.
kıdemsiz üye
Re: Multi inheritance ve bir kac detay
Daha farkli bir yol izledim.
CreateWnd prosedürünü override ettikten sonra inherited yapip orjinal ClientArea'yi olusturturdum. Hemen akabinde DestroyWindow ile olusturulan area'yi kapatip kendi area'mi olusturdum ve ClientHandle variablesine yeni olusturdugum pencerenin Handle'sini atadim. Yukarida bahsi gecen konu bu sekilde cözüme kavusmus oldu.
Eger ClassName'i MDICLIENT yapmazsak (ki bu isim users32.dll dosyasinda tanimlanmis), olusturmus oldugumuz pencere ClientArea olarak görülmüyor.
Windows'un kendi icerisinde tanimlanmis olan MDICLIENT class'i mouse eventlerini ignore ediyor.
kisacasi, bu sekilde de mouse eventleri yakalayamiyorum.
devam arastiriyorum. konu güncel.
CreateWnd prosedürünü override ettikten sonra inherited yapip orjinal ClientArea'yi olusturturdum. Hemen akabinde DestroyWindow ile olusturulan area'yi kapatip kendi area'mi olusturdum ve ClientHandle variablesine yeni olusturdugum pencerenin Handle'sini atadim. Yukarida bahsi gecen konu bu sekilde cözüme kavusmus oldu.
Eger ClassName'i MDICLIENT yapmazsak (ki bu isim users32.dll dosyasinda tanimlanmis), olusturmus oldugumuz pencere ClientArea olarak görülmüyor.
Windows'un kendi icerisinde tanimlanmis olan MDICLIENT class'i mouse eventlerini ignore ediyor.
kisacasi, bu sekilde de mouse eventleri yakalayamiyorum.
devam arastiriyorum. konu güncel.
kıdemsiz üye