Multi inheritance ve bir kac detay

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

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.
kıdemsiz üye
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Multi inheritance ve bir kac detay

Mesaj gönderen anonymousdelphicoder »

interfaceleri kullanarak yapabilirsiniz
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Multi inheritance ve bir kac detay

Mesaj gönderen thelvaci »

http://www.tugrulhelvaci.com/?p=582 makalesi belki faydalı bir kaç malümat içeriyor olabilir.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

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?
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Multi inheritance ve bir kac detay

Mesaj gönderen thelvaci »

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;

Kod: Tümünü seç

type
  IMyInterface = interface
   [{.....}]
  end;

TXForm = class(TForm, IMyInterface)
...
..
end;

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.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

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.

Kod: Tümünü seç

begin
inherited CreateWnd;
end;
yerine

Kod: Tümünü seç

begin
inherited inherited CreateWnd;
end;
gibi...
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Multi inheritance ve bir kac detay

Mesaj gönderen thelvaci »

Ama o zaman beklenmeyen durumlar ile karşılaşabilirsin. Inheritance hiyerarşisini bozmak istiyorsun !
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

TCustomForm'un CreateWnd prosedüründe yapilan islemi kendi class'im icerisinde yaptiracagim.
Forms.pas dosyasi ile oynama yapmak istemiyorum.
kıdemsiz üye
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Multi inheritance ve bir kac detay

Mesaj gönderen unicorn64 »

delphi yok şuan, deneme şansım yok ama maksat TScrollingWinControl sınıfının CreateWnd metodunu çağırmaksa,

Kod: Tümünü seç

	(self as TScrollingWinControl).CreateWnd;
gibi bir kullanım işinizi görmez mi?
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...

Resim
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

unicorn64 yazdı:delphi yok şuan, deneme şansım yok ama maksat TScrollingWinControl sınıfının CreateWnd metodunu çağırmaksa,

Kod: Tümünü seç

	(self as TScrollingWinControl).CreateWnd;
gibi bir kullanım işinizi görmez mi?
Malesef yine kendi kendisini cagiriyor.
kıdemsiz üye
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Multi inheritance ve bir kac detay

Mesaj gönderen mrmarman »

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.
Resim
Resim ....Resim
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

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.
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Multi inheritance ve bir kac detay

Mesaj gönderen thelvaci »

Interposer class kullanıp amacına ulaşabiliyor musun diye test edebilir misin ?

Örneğin:

Kod: Tümünü seç

TCustomForm = class(Forms.TCustomForm)
end;

TYeniForm = class(TCustomForm)
end;
gibi
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

Malesef, yine Forms.pas dosyasinda tanimlanan TCustomForm'un prosedürünü cagiriyor.
kıdemsiz üye
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Multi inheritance ve bir kac detay

Mesaj gönderen ikra »

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.
kıdemsiz üye
Cevapla