Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Frame OnHide Event
#1
Question 

Merhabalar

ufak bi araştırma yaptım bulamadım, frame unitlerinde oncreate olayını şu şekilde yapabiliyoruz.
constructor TfrmYukleniyor.Create(AOwner: TComponent);
 begin
 inherited;
Formana.BeginUpdate;
end;

ama aynı şekilde onhide olayını nasıl yapabiliriz, frame gizlendiğinde işletmem gereken kodlarım var.

şimdiden teşekkürler.
There is no place like "127.0.0.1"

"Vatanını en çok seven, görevini en iyi yapandır."

Cevapla
#2
Merhaba. Sorunuzun cevabı, CM_VISIBLECHANGED component mesajını dinlemek üzerine olacaktır. Aşağıdaki gibi kullanabilirsiniz:

type
 TFrame3 = class(TFrame)
 private
   { Private declarations }
 public
   { Public declarations }
   procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
 end;

implementation

{$R *.dfm}

procedure TFrame3.CMVisibleChanged(var Message: TMessage);
begin
 Application.MainForm.Caption := 'Visible Changed ' + TimeToStr(Time);
end;

Ancak, sadece kod paylaşmayı sevmediğim için bu sonuca nasıl ulaştığımızı da anlatmak isterim müsaadeye binaen.

Öncelikle TFrame'in kaynak kodlarına gidilir ve bir Frame nesnesini gizleyip göstermeye yarayan metodların (Hide, Show) nerede olduklarına ve ne yaptıklarına bakmaya çalışılır.

   

Görüldüğü gibi, ilgili sınıf TCustomFrame'den türüyor ve ne TFrame sınıfında ne de TCustomFrame sınıfında Hide ve Show metodları bulunmuyor. Bu durumda; kod editöründe iken, Hide ya da Show metodunun tanımlı olduğu yeri bulabilmek için; yazdığınız kod üzerinde iken Alt + Yukarı Ok tuşlarına basabilir ve ilgili tanıma gidebilirsiniz.

   

Görüldüğü gibi; Show ve Hide metodları aslında ilgili sınıfın Visible property'sinin değerini değiştiriyor. Bu durumda; bu property'nin setter'ına bakmamız gerekiyor.

   

Görüldüğü üzere, Visible property'sinin her değişiminde ilgili kontrole CM_VISIBLECHANGED mesajı gönderiliyor.

Umarım faydalı olmuştur.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
Hocam cevabınız için çok teşekkür ederim,

sizin gibi bende kaynak dosyalarında ilgili hide ve show olaylarını inceledim,

fakat yukarıdaki sizin vermiş olduğunuz kodları göremedim,

muhtemelen siz vcl tipinden örnek verdiniz ama fmx olarak tasarım yaptığım projede ilgili "CM_VISIBLECHANGED;" olayını bulamadım.
FMX.Forms alıntı
procedure TCommonCustomForm.SetVisible(const Value: Boolean);
begin
 FExplicitVisible := Value;
 if (FVisible <> Value) and (not (csLoading in ComponentState)) then
 begin
   if Value then
     Show
   else
     Hide;
   FExplicitVisible := FVisible;
 end;
end;

FMX.Controls alıntı
procedure TControl.SetVisible(const Value: Boolean);
var
 AlignRoot: IAlignRoot;
begin
 if FVisible <> Value then
 try
   if FVisible then
     Repaint;
   FVisible := Value;
   VisibleChanged;
 finally
   if FVisible then
     Show
   else
     Hide;
   // We notify all child controls, that parent changed visibility
   AncestorVisibleChanged(FVisible);
   if not (csLoading in ComponentState) and (Align <> TAlignLayout.None) then
   begin
     if FParentControl <> nil then
       FParentControl.Realign
     else
       if not(csLoading in ComponentState) and Supports(Parent, IAlignRoot, AlignRoot) then
         AlignRoot.Realign;
   end;
   if ParentContent <> nil then
     ParentContent.Changed;
   if FVisible then
   begin
     RecalcUpdateRect;
     Repaint;
     TAnimator.StartTriggerAnimation(Self, Self, 'IsVisible');
   end
   else
     ResetFocus;
 end;
end;

bu kodlar arasında peki nasıl bir yol izlemeliyiz

ayrıca detaylı açıklamanız için çok teşekkür ederim.
There is no place like "127.0.0.1"

"Vatanını en çok seven, görevini en iyi yapandır."

Cevapla
#4
(24-05-2022, Saat: 11:21)YILDIRIMBEY Adlı Kullanıcıdan Alıntı: Hocam cevabınız için çok teşekkür ederim,

sizin gibi bende kaynak dosyalarında ilgili hide ve show olaylarını inceledim,

fakat yukarıdaki sizin vermiş olduğunuz kodları göremedim,

muhtemelen siz vcl tipinden örnek verdiniz ama fmx olarak tasarım yaptığım projede ilgili "CM_VISIBLECHANGED;" olayını bulamadım.
FMX.Forms alıntı
procedure TCommonCustomForm.SetVisible(const Value: Boolean);
begin
 FExplicitVisible := Value;
 if (FVisible <> Value) and (not (csLoading in ComponentState)) then
 begin
   if Value then
     Show
   else
     Hide;
   FExplicitVisible := FVisible;
 end;
end;

FMX.Controls alıntı
procedure TControl.SetVisible(const Value: Boolean);
var
 AlignRoot: IAlignRoot;
begin
 if FVisible <> Value then
 try
   if FVisible then
     Repaint;
   FVisible := Value;
   VisibleChanged;
 finally
   if FVisible then
     Show
   else
     Hide;
   // We notify all child controls, that parent changed visibility
   AncestorVisibleChanged(FVisible);
   if not (csLoading in ComponentState) and (Align <> TAlignLayout.None) then
   begin
     if FParentControl <> nil then
       FParentControl.Realign
     else
       if not(csLoading in ComponentState) and Supports(Parent, IAlignRoot, AlignRoot) then
         AlignRoot.Realign;
   end;
   if ParentContent <> nil then
     ParentContent.Changed;
   if FVisible then
   begin
     RecalcUpdateRect;
     Repaint;
     TAnimator.StartTriggerAnimation(Self, Self, 'IsVisible');
   end
   else
     ResetFocus;
 end;
end;

bu kodlar arasında peki nasıl bir yol izlemeliyiz

ayrıca detaylı açıklamanız için çok teşekkür ederim.

   

Resimde de göreceğiniz gibi VisibleChanged isimli bir metod çağrılıyor. Bu metod; TControl sınıfında virtual olarak tanımlanmış ve içi boş bırakılmış. Bu durumda; siz TFrame'den türeyen yeni bir sınıf tanımlayıp, o sınıf içinde VisibleChanged metodunu override edebilir ve uygumanızda bu özel TFrame sınıfınızı kullanabilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
orangeui bu işi otomatik hal ediyor, birde skia4delphi Frame yönetim güzel
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi ile Windows Event Log Kayıtları Oluşturma Abdullah ILGAZ 1 1.346 29-11-2021, Saat: 13:16
Son Yorum: Bay_Y
Rainbow Clipboard event bydelphi 2 1.676 25-06-2020, Saat: 17:14
Son Yorum: bydelphi
  Table Bileşen Yazımında Event Yakalama (BeforeDelete Beforepost vb.) ugorkem 2 2.003 01-05-2020, Saat: 14:35
Son Yorum: ugorkem
  Event Alerter İle Son kaydedilen veriyi alma eyln 7 4.450 18-02-2020, Saat: 13:31
Son Yorum: esistem
  Firebird table event larını takip etme(fdeventalerter) 41linea41 10 6.521 02-01-2020, Saat: 17:12
Son Yorum: 3ddark



Konuyu Okuyanlar: 1 Ziyaretçi