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

Merhabasabanakman 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.
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;
Ö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;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
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.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 .
sabanakman yazdı:delphinin verdiği VCL imkanları dahilinde
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;
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.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
. 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.
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ıyorumKod: 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;
. İyi çalışmalar.