Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
AfterShow olayını gerçekleştirme. (Implement AfterShow Event)
#1
Zaman zaman OnShow event ı içerisinde gerçekleştiremediğimiz bazı işlemlerin form görüntülendikten sonra yapılmasını isteriz.

Örneğin:

Belli bir koşul oluşmadığı için formun kendisinin kapatılması.
Bir kontrole (bileşene, component'e) focus olunması.
Formun maksimize (maximize) edilmesi. (Ana menü formunun maximize durumda gelmesi Logo programında yıllarca sorun olmuştur.)

Bu tür işlemler için AfterShow türünden bir event'a ihtiyacımız olur. Delphi'nin TForm bileşeninde bu event yoktur ama kolaylıkla kendimiz bir AfterShow event'ı yazabiliriz.

unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
 WM_AFTER_SHOW = WM_USER + 300;

type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
 private
   { Private declarations }
   procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
 PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
 // Buraya istediğiniz kodları yazın.
end;

end.
WWW
Cevapla
#2
Hocam merhaba
TForm VCL sınıfı yardımıyla bir form oluşturduğumuzda, Windows işletim sisteminde çalışan uygulama Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonunu çağırıp arka planda bir kuyruk oluşturuluyor.
Alıntı:Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

To post a message in the message queue associated with a thread, use the Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol function.
Biz Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ile kuyruğa bir işlenmesi için bir mesaj ekliyoruz aslında değil mi hocam.Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bahsi geçmişti.
My name is nobody.
WWW
Cevapla
#3
(06-09-2017, Saat: 11:07)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam merhaba
TForm VCL sınıfı yardımıyla bir form oluşturduğumuzda, Windows işletim sisteminde çalışan uygulama Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonunu çağırıp arka planda bir kuyruk oluşturuluyor.
Alıntı:Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

To post a message in the message queue associated with a thread, use the Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol function.
Biz Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ile kuyruğa bir işlenmesi için bir mesaj ekliyoruz aslında değil mi hocam.Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bahsi geçmişti.

Aslında konuyu derinleştirmek için yazıyorsun sanırım güzel kardeşim Wink 

Her bir pencerenin bağlı olduğu bir Thread vardır ama her thread'in bir pencereye ihtiyacı olmaz. Bir pencere var ise, bir mesaj kuyruğu da var demektir. Bir thread, kendi içinde User32 ve GDI API'lerinden herhangi birisini çağırdığında eğer bir mesaj kuyruğu yok ise ilgili thread için işletim sistemi tarafından bir kuyruk oluşturulur. Ondan sonraki süreçte pencere mesajları bu kuyruğa gelir ve Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol / Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol API'leri vasıtası ile Thread hayatta olduğu müddetçe işletilir/işletilmesi gerekir.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol API'si için Thread'in handle'ını bilmek yeterli olur. İlla ilgili pencerenin HWND(Handle)'ını bilmek gerekmez. Merak eden arkadaşlarımız, mesaj döngülerinin nasıl işletildiğini gözlemlemek adına Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol sınıfının Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol metodunu inceleyebilirler. Aslında Thread'ler, pencereler ve Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol; Windows işletim sistemi için son derece önemli ve büyük bir yer kaplar. Bu konuların bilinmesi inanılmaz faydalı olur.

Kuyuya bir taş attın bakalım, hadi hayırlısı Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#4
Hocam yeri gelmişken yazayım dedim.
ReactOS'un kaynak kodlarında incelediğim kadarıyla Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonu aşağıdaki şekilde dallanıyor.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol -> Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol -> Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

NtUserPostThreadMessage fonksiyonu içersinde thread'in id'sinden Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol yapısına ulaşılmış ve mesaj kuyruğunun var olup olmadığı kontrol edilmiş buradan mesaj kuyruğunun thread nesnesi içinde olduğunu net olarak görebiliriz sanırım. Confused
My name is nobody.
WWW
Cevapla
#5
(06-09-2017, Saat: 15:54)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam yeri gelmişken yazayım dedim.
ReactOS'un kaynak kodlarında incelediğim kadarıyla Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonu aşağıdaki şekilde dallanıyor.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol -> Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol -> Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

NtUserPostThreadMessage fonksiyonu içersinde thread'in id'sinden Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol yapısına ulaşılmış ve mesaj kuyruğunun var olup olmadığı kontrol edilmiş buradan mesaj kuyruğunun thread nesnesi içinde olduğunu net olarak görebiliriz sanırım. Confused

Bu noktaya kadar eğilip bakabilen için görülemeyecek ne var ki Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'a dönmüş burası Smile
There's no place like 127.0.0.1
WWW
Cevapla
#7
Alıntı:Hocam merhaba
TForm VCL sınıfı yardımıyla bir form oluşturduğumuzda, Windows işletim sisteminde çalışan uygulama Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fonksiyonunu çağırıp arka planda bir kuyruk oluşturuluyor.
Alıntı: Adlı Kullanıcıdan Alıntı:Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

To post a message in the message queue associated with a thread, use the Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol function.
Biz Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ile kuyruğa bir işlenmesi için bir mesaj ekliyoruz aslında değil mi hocam.Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bahsi geçmişti.

İsmail arkadaşım madem ki konuyu açmışsın o zaman WndProc olayını biraz açalım. Dikkat edecek olursanız WindowClass register işlemi yapılırken mesaj işlenecek fonksiyonu belirtmiştik.
Bu fonksiyon içerisinde ise DefWindowProc diye external bir fonksiyon çağrısı daha yapmıştık.
Her mesajın kontrolünü biz yapamayız dolayısı ile default olarak mesajların işlenebileceği bir fonksiyon çağrımı yapılır.

function DefWindowProc; external user32 name 'DefWindowProcA';

function DefWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

Önceki konuda yaptığımız örnek üzerinden bazı değişiklikler yaparak devam edecek olursak.
Oluşturduğumuz her pencere 
Pencereye sahip olan her thread için bir mesaj kuyruğu oluşturulmakta ve dispatch edilerek bu mesajı işleyebilecek bir fonksiyon çağrılmaktadır.
Bu mesaj sadece komut değil pencerenin sahiplik yaptığı bir takım nesnelerle ilgili parametreleri de barındırır.
Yani pencere üzerindeki handle ı bulunan nesnelere gelen mesajlarda burada işlenir. 
Handle ı olan her nesnenin bir mesaj kuyruğu yoktur dur. 
Sahiplik eden pencerenin bir mesaj kuyruğu vardır ve bu mesajlar tabiri caiz ise pencere tarafından işlenir.

Örnek verecek olursak:

program Message;

uses
  Windows,
  Messages;

var
  WindowClass: TWndClassA;
  Inst, MainWindowHandle, btnDoIt: HWND;
  Msg: TMsg;

{$R *.res}


function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
   case uMsg of
     WM_COMMAND :
       begin
         //Gelen parametre bizim butonun handle ı ise ver coşkuyu
         if lParam = btnDoIt then 
            MessageBox(MainWindowHandle, 'Hop laley tereyağlı ballı ekmek', 'Hop laley tereyağlı ballı ekmek', 0);
       end;

     WM_RBUTTONDOWN: ExitProcess(0);  //Sağ tıklandı ise çık
     WM_DESTROY: Halt;
   end;

  //Default mesaj işleme cağrımı
  Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;


begin
  //Processi sisteme kayıt edelim mesaj işleyecez bize handle ver diyelim
  Inst := hInstance;
  with WindowClass do begin
    style              := CS_HREDRAW or CS_VREDRAW ;
    lpfnWndProc        := @DefWindowProc;      //Default proc olarak belirtelim sonradan oluşturacağımız pencereye atama yapalım
    hInstance          := Inst;
    hbrBackground      := CreateSolidBrush($9fffff);
    lpszClassname      := 'DelphiCan';
    hCursor            := LoadCursor(0, IDC_ARROW);
  end;
  RegisterClassA(WindowClass);

  //Ana pencere
  MainWindowHandle := CreateWindow( WindowClass.lpszClassName, 'DelphiCan Message',
                            WS_OVERLAPPED, //WS_VISIBLE direk olarak show yapar forumu biz sonradan show yapacağız
                            (GetSystemMetrics(SM_CXFULLSCREEN) - 280 )div 2 ,
                            (GetSystemMetrics(SM_CYFULLSCREEN) - 200 ) div 2,
                             280, 200, 0, 0, Inst, nil);

  //Pencere için mesaj işleyeceğimiz fonksiyonumuzu belirtiyoruz
  SetWindowLong(MainWindowHandle, GWL_WNDPROC, integer(@WindowProc));

  //Birde buton oluşturalım
  btnDoIt := CreateWindow( 'Button', 'Show Message',
                           WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,
                           50, 100, 175, 25,
                           MainWindowHandle, 0, Inst, nil);

  //Pencereyi ekrana getirelim
  ShowWindow(MainWindowHandle, SW_SHOWNORMAL);

  //Gelen giden ne var diye bakalım
  while(GetMessage(Msg, MainWindowHandle, 0, 0)) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.

Not : Uyarı için Tuğrul hocama teşekkürler.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi