Bir Objenin Ait Olduğu Forum

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:

Bir Objenin Ait Olduğu Forum

Mesaj gönderen husonet »

Arkadaşlar bir objenin ait olduğu formu nasıl bulabilirim.


Sadece ortada obje var hangi forumdan geldiği belli değil sadece objeden yol alarak ait olduğu formu bulabilirmiyiz merak ettimde :)

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ı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

İyi günler. BilesenAdi.Owner -> Sahip bileşeni (genelde form veya datamodüldür) verir. Hatta bir makalede bileşenler hakkında bir miktar bilgiden bahsetmiştim. Makalede sadece bileşenlerin anlatıldığı kısmı dikkate alırsan bu konuda daha detaylı bir bilgi edinebilirsin. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

sabanakman yazdı:İyi günler. BilesenAdi.Owner -> Sahip bileşeni (genelde form veya datamodüldür) verir. Hatta bir makalede bileşenler hakkında bir miktar bilgiden bahsetmiştim. Makalede sadece bileşenlerin anlatıldığı kısmı dikkate alırsan bu konuda daha detaylı bir bilgi edinebilirsin. İyi çalışmalar.
Merhaba

Hocam öncelikle ilgine teşekkür ederim.

Fakat öyle bir an oluyorki bileşenin owner ı ve parenti formdan önce bir kaç bileşenden geçebiliyor mesala bir kaçtane panel üstünde olabiliyor bu kesin çözüm olmuyor bu sebepten

yerine göre owner bazılarında owner.owner vb... Bence daha pratik bir çözüm olmalı bence


Not objeyi pointer olarak mouse ile alıyorum.

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ı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

GetParentForm bu işi halledebiliyor.
function GetParentForm(Control: TControl): TCustomForm;
begin
while Control.Parent <> nil do Control := Control.Parent;
if Control is TCustomForm then
Result := TCustomForm(Control) else
Result := nil;
end;

Teşekkürler...

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ı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

husonet yazdı:Fakat öyle bir an oluyorki bileşenin owner ı ve parenti formdan önce bir kaç bileşenden geçebiliyor mesala bir kaçtane panel üstünde olabiliyor bu kesin çözüm olmuyor bu sebepten yerine göre owner bazılarında owner.owner vb... Bence daha pratik bir çözüm olmalı bence
Öncelikle şunu belirmem gerekir. Owner ile Parent'ın birbirleriyle uzaktan yakından alakası yoktur. Bir bileşenin sahibi siz aksini belirtmedikçe (TComponent.Create(Self)) ve sonradan müdahele etmedikçe (RemoveComponent ve InsertComponent ile) her zaman Formun kendisidir. Bu hafıza yönetimi ile alakalıdır. Parent ise görünürlükle alakalı bir yönetim sistemidir. Belirttiğiniz metot sadece görsel bileşenlerde işe yarar. Görsel olmayan bileşenlerde ise Parent diye bir özellik yoktur ama bileşen olduğu için Owner özelliği muhakkak bulunmaktadır. şöyle söyleyeyim;

Form1.Free o form üzerinde owner özelliği form olan tüm bileşenleri hafızadan yok eder. Sen kodla TComponent.Create(Edit1); gibi bir kodla owner olarak formdan başka bir bileşen vermediysen owner delphinin verdiği VCL imkanları dahilinde ya formdur ya da DataModul. Aksini yapamazsın :) .

Parent ise bahsettiğim gibi görsellikle ilgili olup Panel1.Hide kodu Parent özelliği bu kontrol olan tüm kontrolleri gizleyecektir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Verdiğiniz bilgilere teşekkürlere
sabanakman yazdı:Sen kodla TComponent.Create(Edit1); gibi bir kodla owner olarak formdan başka bir bileşen vermediysen owner delphinin verdiği VCL imkanları dahilinde ya formdur ya da DataModul. Aksini yapamazsın Smile .
Malesef dediğiniz gibi değil ben 3.parti bileşenlerden CxGrid ile örnek verecem ve ressimde bakacaz owner ı nedir bahsi geçen konu component değil Object bu Object nesnesinin bir point nesnesi ile tespit edilip işlenmesi.

Resim

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ı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

e o da güzel.
sabanakman yazdı:delphinin verdiği VCL imkanları dahilinde
:? . Sanırım sonradan oluşturulan bu alt bileşenler üzerine yoğunlaşmadığım için böyle söyledim. Çünkü bu bileşenler .dfm kaydından görünmezler. Ek bazı özellikler veya sonradan yapılan klavye grişleriyle oluşmaktadır. Mesela verdiğiniz örnek bir Grid örneği olduğu için InplaceEditor sonradan oluşuyor ve sahibi (owner) grid oluyor. Sadece .dfm kaydına yönelik cevap yazdığım için bunu söyledim ama bu alt bileşenler için sözümü geri alıyorum :oops: . Verdiğiniz örneğe göre GetParentForm işinizi göreceği gibi GetOwnerForm isminde yazacağınız benzeri başka bir fonksiyon da benzeri işi görecektir.

Kod: Tümünü seç

function GetOwnerForm(Component: TComponent): TCustomForm;
begin
  while Assigned(Component) and not (Component is TCustomForm) do 
    Component := Component.Owner;
  Result:=TCustomForm(Component);//nil değerde sorun çıkmaz
end;
Eğer sana ekranda gösterildiği sahip form lazımsa GetParentForm en uygun fonksiyon olacaktır. Yok bu bileşeni bünyesinde tutan form lazımsa o zaman GetOwnerForm işini daha sahlıklı olarak yürütecektir. Çünkü şöyle bir kod yazıldığı vakit bu iki fonksiyon birbirinden farklı formları verecektir. Form3.Grid.Parent:=Form2;. İşte böyle bir koddan sonra GetParenForm Form2'yi GetOwnerForm ise Form3'ü verecektir. Kısacası bu kodu yazdıktan sonra Form2.Free kodu gridi hafızadan silmeyecektir sadece Form2 silindiği için görüntüden gidecektir. Daha sonra Form3.Grid.Parent:=Form3; yazıldığında ise Grid'imize tekrar kavuşabiliriz. Hatta hiç bir form silinmeden Grid Form2 üzerinde görünürken Form3.Free kodu çalıştırılırsa Form2 üzerindeki Grid hafızadan silineceği için otomatikman Form2 üzerinden uçacaktır. Konuya derin düşünmeden bodoslama daldığım için yukarıdaki sözümü sonradan oluşturulan alt bileşenler yüzünden 2. kez geri alıyorum :) . İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

sabanakman yazdı:e o da güzel.
sabanakman yazdı:delphinin verdiği VCL imkanları dahilinde
:? . Sanırım sonradan oluşturulan bu alt bileşenler üzerine yoğunlaşmadığım için böyle söyledim. Çünkü bu bileşenler .dfm kaydından görünmezler. Ek bazı özellikler veya sonradan yapılan klavye grişleriyle oluşmaktadır. Mesela verdiğiniz örnek bir Grid örneği olduğu için InplaceEditor sonradan oluşuyor ve sahibi (owner) grid oluyor. Sadece .dfm kaydına yönelik cevap yazdığım için bunu söyledim ama bu alt bileşenler için sözümü geri alıyorum :oops: . Verdiğiniz örneğe göre GetParentForm işinizi göreceği gibi GetOwnerForm isminde yazacağınız benzeri başka bir fonksiyon da benzeri işi görecektir.

Kod: Tümünü seç

function GetOwnerForm(Component: TComponent): TCustomForm;
begin
  while Assigned(Component) and not (Component is TCustomForm) do 
    Component := Component.Owner;
  Result:=TCustomForm(Component);//nil değerde sorun çıkmaz
end;
Eğer sana ekranda gösterildiği sahip form lazımsa GetParentForm en uygun fonksiyon olacaktır. Yok bu bileşeni bünyesinde tutan form lazımsa o zaman GetOwnerForm işini daha sahlıklı olarak yürütecektir. Çünkü şöyle bir kod yazıldığı vakit bu iki fonksiyon birbirinden farklı formları verecektir. Form3.Grid.Parent:=Form2;. İşte böyle bir koddan sonra GetParenForm Form2'yi GetOwnerForm ise Form3'ü verecektir. Kısacası bu kodu yazdıktan sonra Form2.Free kodu gridi hafızadan silmeyecektir sadece Form2 silindiği için görüntüden gidecektir. Daha sonra Form3.Grid.Parent:=Form3; yazıldığında ise Grid'imize tekrar kavuşabiliriz. Hatta hiç bir form silinmeden Grid Form2 üzerinde görünürken Form3.Free kodu çalıştırılırsa Form2 üzerindeki Grid hafızadan silineceği için otomatikman Form2 üzerinden uçacaktır. Konuya derin düşünmeden bodoslama daldığım için yukarıdaki sözümü sonradan oluşturulan alt bileşenler yüzünden 2. kez geri alıyorum :) . İyi çalışmalar.
Hocam önemli olan doğruyu bulabilmek bence güzelde bir konu oldu katılım ve paylaşımlarınız için tekrar teşekkür ederim.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Cevapla