Winapi ile form olaylarını yakalama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Winapi ile form olaylarını yakalama

Mesaj gönderen name »

Merhaba

Form üzerindeki herhangi bir nesnenin "OnEnter" yada "OnExit" olayını winapi ile yakalamak istiyorum ama bir türlü yapamadım. Aşağıdaki kod parçasının çalışması gerekli ama çalışmıyor. Bu işlemi hangi windows mesajı ile yapabilirim.

Kod: Tümünü seç

  ....
private
  { Private declarations }
  procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS;
  procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
public
  { Public declarations }
end;
  ....

procedure Tform.WMSetFocus(var Msg: TWMSetFocus);
begin
  //inherited;
  showmessage('WMSetFocus');
end;

procedure Tform.WMKillFocus(var Msg: TWMKillFocus);
begin
  //inherited;
  showmessage('WMKillFocus');
end;
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Mesajın başlığı için özürdilerim . Mesaj içeriği ile ilgili bir şey yazacaktım ama nasıl oldu anlamadım :?: :?:
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Ben sizin icin basligi duzelttim.
Fakat kendiniz de mesajı okurken sag ustte gorunen edit tusuna basarak mesajınızı ve baslığını değiştirebilirsiniz....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
mcihad
Üye
Mesajlar: 283
Kayıt: 18 Tem 2003 03:28
Konum: Sivas

Mesaj gönderen mcihad »

İsrediğin elemanı yeni bir bileşen olarak yaz

yada type bloğunda
örnek:

Kod: Tümünü seç

TBenimEdit=class(TEdit)
  procedure OnBenimEnter(var mesaj:TWMSetFocus);message WM_SETFOCUS;
 procedure OnBenimExit(var mesaj:TWMKillFocus);message WM_KILLFOCUS;
private

public
Daha sonrada

Kod: Tümünü seç

Var EditX:TBenimEdit;
begin
EditX:=TBenimEdit.Create(Self);
..
Şeklinde tanımlarsan istediğin şey olur sanıyorum

sen form üzerindeki nesnelerin değil sadece formun olaylarını yakalıyorsun
Bize iyilik yaraşır.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Sağolun fahrettin bey bunu (Resim) bilmiyordum.

@mcihad bunu başka bir şekilde yapamaz mıyım?
mcihad
Üye
Mesajlar: 283
Kayıt: 18 Tem 2003 03:28
Konum: Sivas

Mesaj gönderen mcihad »

File Close All ile aktif projeyi kapat
Component Menusunden New Component Seç

Daha sonra Ust Kutudan TEdit vs. değiştirmek istediğin nesneyi seç
tamam dedikten sonra sana bazı kodlar oluşturacaktır

orda yukrıda kendi yazdığın procedureleri aynen burayada yaz

kaydet

install component ile bunu kur

istediğin olur

hatta Enter Olayı olmadan önce neler olsun
exit olayı olmadan önce neler olsun
olduktan sonra neler olsun istiyorsan yeni eventler yazabilirsin

OnBeforeEnter;
OnBeforeExit Falan Gibi

Eğer Anlamadıysan haber ver ben yeni bileşen olarak yazıp kodlarını buraya yazarım
Bize iyilik yaraşır.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

@mcihad cevabınız için teşekürler. Başka bir şekilde yapılabilirmi derken, yeni bir component oluşturmadan nasıl yapılabilir demek istedim. Yoksa yeni bir component oluşturabilirim sadece mevcut yapıyı bozmadan ekliceğim bir kaç satır kod ile bu işlemi yapmak istedim (yapılabiliyorsa tabiki).
Eğer istediğim şekilde yapılamıyor ise şu şekilde yapıcam... Bütün nesnelerin "OnEnter" ve "OnExit" olaylarını tek bir procedure bağlayarak.
mcihad
Üye
Mesajlar: 283
Kayıt: 18 Tem 2003 03:28
Konum: Sivas

Mesaj gönderen mcihad »

Öyle desene yaw
ActionList nesnesini kullan iki adet action kullan onExecute Olayına
Mesela

Kod: Tümünü seç

(Sender as TEdit).Text='Delphi';
y
ada

Kod: Tümünü seç

if Sender is TEdit then
   TEdit(Sender).Text='DELHI';
Şeklinde bir ifade kullan ve hepsinin on Enter Olayını Açılır Listeden Acitonlardan istediğini Seç
Bize iyilik yaraşır.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

@mcihad teşekkürler. Evet bütün nesnelerin "OnEnter" ve "OnExit" olaylarını tek bir procedure bağlayarak yapıcam. :cry:
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

cevap biraz gec oldu ama ancak aklıma geldi
su sekilde varolan yapını hic degistirmeden rahatlıkla yapabilirsin

oncelikle bir base form olustur diger formları bundan tureteceksin
base forma iki adet private yordam ekle

Kod: Tümünü seç

    
    procedure MyEnter(Sender: TObject);
    procedure MyExit(Sender: TObject);
ben yaptıgım ornekte edit kontrolleri focus aldıgında rengini sarı yapan kaybettiginde tekrar eski rengini alan bir proje yaptım

eski rengi tutmak icinde private bir FColor :TColor tanımladım
yordamların icine de

Kod: Tümünü seç

procedure TBaseForm.MyEnter(Sender: TObject);
begin
  if Sender is TEdit then
  begin
    FOldColor:=TEdit(Sender).Color;
    TEdit(Sender).Color:=clYellow;
  end;
end;

procedure TBaseForm.MyExit(Sender: TObject);
begin
  if Sender is TEdit then
  begin
    TEdit(Sender).Color:=FOldColor;
  end;
end;
yazdım
Base formun create yordamında da
:idea:

Kod: Tümünü seç

procedure TBaseForm.FormCreate(Sender: TObject);
var
  i:Integer;
begin
  for i:= 0 to ComponentCount-1 do
    if Components[i] is TEdit then
    begin
       TEdit(Components[i]).OnEnter:=MyEnter;
       TEdit(Components[i]).OnExit:=MyExit;
    end;
end;
evet bu sekli ile kullanıma hazır
bu formu projene ekle otocreate listesinden cıkart
diger formlarında uses da goster ve TForm yerine bundan turet
sunun gibi mesela

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  base, StdCtrls;

type
  TBaseForm1 = class(TBaseForm)
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  BaseForm1: TBaseForm1;

implementation

{$R *.DFM}

end.
kolay gelsin
ÜŞENME,ERTELEME,VAZGEÇME
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Teşekkür ederim @gkimirti.
Zaten bütün "OnEnter" ve "OnExit" eventlarını bir procedure atayarak işimi halletmiştim.
Cevapla