selamun aleykum.
söyle bir seneryo denedim.
Iki adet class create ediyorum ve bunlarin constructorunda setwindowlong ile formun wndproc'u override ediyorum.
1) class A create edildi ve getwindowlong ile wndproc bir degiskene atandi. akabinde setwindowlong ile yeni wndproc adresi tanitildi.
2) class B create edildi ve getwindowlong dedigimde class A'nin wndproc adresini döndürdü ve bir degiskene atandi. setwindowlong ile class B'nin wndproc'u set edildi.
dananin kuyrugunun koptugu yer tamda burasi.
ilk create edilen class A oldugu ve class B'nin degiskene atanan degeri class A'nin wndproc'u oldugu icin, class A önceden free edildiginde class B free edilirken class A'dan gelen degeri geriye atamak istedigi ve bu deger gecerli pointer olmadigi icin access'e düsüyor.
böyle bir durumda pointerin gecerliligini nasil kontrol edebilirim? class sayisi belirsiz oldugu icin bir sekilde kontrol mekanizmasi yazmam gerekiyor.
SetWindowLong Wndproc
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
SetWindowLong Wndproc
kıdemsiz üye
Re: SetWindowLong Wndproc
Aleyküm selam; TComponent.Notification metodunu ve yapısını inceleyebilirsiniz, ciddi bir fikir verecektir.
Re: SetWindowLong Wndproc
Tugrul abi cevabin icin tesekkür ederim.
Sanirim ben cevabi buldum fakat test etme imkanim olmadi. En kisa zamanda test edebilirsem sonucu buraya yazarim insaAllah.
Sanirim ben cevabi buldum fakat test etme imkanim olmadi. En kisa zamanda test edebilirsem sonucu buraya yazarim insaAllah.
kıdemsiz üye
Re: SetWindowLong Wndproc
malesef benim planladigim sekilde olmadi.
notification benim yapima uyum saglamiyor. daha farkli bir yöntem bulmam gerekiyor. cözüm bulursam muhakkak paylasirim.
notification benim yapima uyum saglamiyor. daha farkli bir yöntem bulmam gerekiyor. cözüm bulursam muhakkak paylasirim.
kıdemsiz üye
Re: SetWindowLong Wndproc
SendMessage(HWND_BROADCAST...) olayini denedim fakat Non Parented Window'lar mesaji algilayabiliyorlar.
AllocateHwnd ile olusturdugum pencerenin Form'a parent ettigimde Broadcast mesajini algilamiyor.
AllocateHwnd ile olusturdugum pencerenin Form'a parent ettigimde Broadcast mesajini algilamiyor.
kıdemsiz üye
Re: SetWindowLong Wndproc
Ne yapmak istediğinizi söylerseniz belki farklı bir çözüm yolu bulabiliriz.
Soruyu yanlış anlamadıysam form'a gelen bazı mesajları oluşturduğunuz sınıflarda yakalamak istiyorsunuz. Eğer sorun buysa bunu aşmanın birçok yolu bulunur. Aklıma gelen ilk 2 çözüm:
Soruyu yanlış anlamadıysam form'a gelen bazı mesajları oluşturduğunuz sınıflarda yakalamak istiyorsunuz. Eğer sorun buysa bunu aşmanın birçok yolu bulunur. Aklıma gelen ilk 2 çözüm:
- Mesajları yine form içinde yakalayıp ilgili class'ların bir public özelliğini set edebilirsiniz.
- Observer Patern kullanabilirsiniz
There's no place like 127.0.0.1
Re: SetWindowLong Wndproc
Mdi icin bar yapiyorum ve bu bar clientarea icerisinde.
Calcsize mesajini yakalayip hem yukaridan hem asagidan barlar icin yer aciyorum. Daha sonra acilan bu nonclient bölgesine birer pencere olusturup pozisyonluyorum. Bu pencereler vasitasi ile mouseeventleri yakalayip overtab, leavetab eventlerini tetikliyorum. Bu eventlerin tetiklenmelerine göre barlar tekrar repaint oluyorlar.
Yalnizca barlar degil, bar icerisindeki tablar da aslinda temelde birer window. Her biri constructorunda allocatehwnd diyerek window olusturuyorlar.
Benim amacim, mdiform'un wndproc'unu hook edip tüm bu mesajlari gerek barlar ile, gerekse tablar ile yakalamak.
Yakalamak sorun degilde, tablardan biri free edildiginde bir sonra olusturulmus olan tab'in defproc'u nil'e düsüyor.
Aslinda tablari döngüye sokarak gelen tüm mesajlari indexe göre ard arda gönderebilirim fakat bu oop yapisina ters düsüyor.
Sorunu anlatabilmek de yapabilmek kadar zor
Cözüm bulursam paylasirim.
Calcsize mesajini yakalayip hem yukaridan hem asagidan barlar icin yer aciyorum. Daha sonra acilan bu nonclient bölgesine birer pencere olusturup pozisyonluyorum. Bu pencereler vasitasi ile mouseeventleri yakalayip overtab, leavetab eventlerini tetikliyorum. Bu eventlerin tetiklenmelerine göre barlar tekrar repaint oluyorlar.
Yalnizca barlar degil, bar icerisindeki tablar da aslinda temelde birer window. Her biri constructorunda allocatehwnd diyerek window olusturuyorlar.
Benim amacim, mdiform'un wndproc'unu hook edip tüm bu mesajlari gerek barlar ile, gerekse tablar ile yakalamak.
Yakalamak sorun degilde, tablardan biri free edildiginde bir sonra olusturulmus olan tab'in defproc'u nil'e düsüyor.
Aslinda tablari döngüye sokarak gelen tüm mesajlari indexe göre ard arda gönderebilirim fakat bu oop yapisina ters düsüyor.
Sorunu anlatabilmek de yapabilmek kadar zor

Cözüm bulursam paylasirim.
kıdemsiz üye
Re: SetWindowLong Wndproc
Proc'u Free etmeden önce hook edilen proc cagirilip yenile mesaji post edildiginde en üst katmandaki class'dan en alta kadar tüm proclar tetiklenecektir. Bu sayede free edilen class algilanacak ve bir alttaki class'in proc'u tekrardan hook edilecektir.
Isin teorik cözümü budur.
Ihtiyac duyulabilir düsüncesi ile paylasmak istedim.
Isin teorik cözümü budur.
Ihtiyac duyulabilir düsüncesi ile paylasmak istedim.
kıdemsiz üye