KeyPress işlemleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

KeyPress işlemleri

Mesaj gönderen brs »

Merhaba,


Form1 de ListView KeyPress altında yaklaşık 15 tane kısa yol uygulaması var, fakat hangi form açık olursa olsun örnek: ctrl + s yaptığında
Form1 deki ListView KeyPress algılamasını nasıl sağlaya bilirim...


Kod: Tümünü seç

procedure TForm1.ListView1KeyPress(Sender: TObject; var Key: Char);
begin
  try
    if Key = ^A then // Tüm Satırı Seç
    begin
      RowSelectAll(Sender);
    end;
    if Key = ^Z then // Tüm Seçli Satırı İptal Et
    begin
      RowSelectCancel(Sender);
    end;
  except
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: KeyPress işlemleri

Mesaj gönderen bulutsuzluk_35 »

eğer her formda bu kodları yeniden yazmak istemiyorsan bu formu ata form olarak kaydedip , yarattığın diğer formları bu formdan inherit etmen lazım ancak amacın hangi ekranda olursa olsun form1'in altındaki kodlar çalışcak diyosan postmessage ya da sendmessage ile çözebilirsin.
amacını detaylı açıklarsan yardım daha hızlı olur.

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: KeyPress işlemleri

Mesaj gönderen brs »

Form1 deki listview KeyPressi diğer formlardan da kontrol etmek istiyorum,

Form1 de kaydet butonum var ve bu buton listview deki kayıtları databaseye kaydediyor, form2 açtığımda ctrl + s dediğimde Form1 deki listview KeyPressi algılayacak...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: KeyPress işlemleri

Mesaj gönderen bulutsuzluk_35 »

1.seçenek diğer formların uses 'ına form1'in unitini eklersin ve diğer formlarda formun onkeydown'nına ctrl+s kombinasyonuna
form1.ListView1KeyPress(form1) yazarsın ya da
1-form1'de CONST WM_KAYDETMSG = WM_USER+1 OLARAK TANIMINI YAPIYORSUN
2-procedure OnMyMessage(var Msg: TMessage); message WM_KAYDETMSG; BU PROSEDÜRÜN İÇİN LİSTWİEW ALTINA YAZDIĞIN KODLARI YAZIYORSUN
3-ve heryerden şu şekilde çağırabiliyorsun(on keydown'ın altına yazacağın kod yani)
PostMessage(Form1.Handle, WM_KAYDETMSG, 0, 0);

seçim senin :)

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: KeyPress işlemleri

Mesaj gönderen thelvaci »

Tuş basımlarını global bir merkezden yakalamak istediğiniz form üzerine bir adet TApplicationEvents component'i bırakıp (yada Application.OnMessage eventine kendi eventinizi atayarak) OnMessage olayını WM_KEYDOWN mesajı ile yönetebilirsiniz.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: KeyPress işlemleri

Mesaj gönderen brs »

thelvaci yazdı:Tuş basımlarını global bir merkezden yakalamak istediğiniz form üzerine bir adet TApplicationEvents component'i bırakıp (yada Application.OnMessage eventine kendi eventinizi atayarak) OnMessage olayını WM_KEYDOWN mesajı ile yönetebilirsiniz.
Global bir merkezden yakalama olayını kurcaladım ama işin işinden çıkamadım. :roll:
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: KeyPress işlemleri

Mesaj gönderen thelvaci »

Epey açık yazdığımı düşünüyorum ama yine de basit bir örnek paylaşayım:

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message = WM_KEYDOWN then
    caption := msg.wParam.ToString();
end;
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Re: KeyPress işlemleri

Mesaj gönderen dogan »

thelvaci yazdı:Tuş basımlarını global bir merkezden yakalamak istediğiniz form üzerine bir adet TApplicationEvents component'i bırakıp (yada Application.OnMessage eventine kendi eventinizi atayarak) OnMessage olayını WM_KEYDOWN mesajı ile yönetebilirsiniz.
Hocam kusuruma bakmayın (Epey açık yazdığımı düşünüyorum ama yine de basit bir örnek paylaşayım:) yazmışsınız ama ben yapamadım lütfen yardım edebilir misiniz?

"TApplicationEvents component" XE7 de bu componen yok sanırım :D

Bu procedure benzer oluşturdum procedure fakat ses yok :D

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message = WM_KEYDOWN then
    caption := msg.wParam.ToString();
end;


Yaptığım procedure global olması için nerede oluşturmam gerek implementation üstüne aldım olmadı altına ekledim çalıştıramadım :lol:

Kod: Tümünü seç

  procedure TForm1.ApplicationEvents1Message(Sender: TObject; var Key: Char);
begin
  if Key = ^P then
  begin
    showmessage('Merhaba Dünya');
  end;
end;
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: KeyPress işlemleri

Mesaj gönderen thelvaci »

Bende XE7 yok ama Delphi'nin huyu değildir mevcut bir class'ı yada component'i bir sonraki sürümde çıkartmak. Dolayısı ile XE7'de de olması lazım ilgili component'in. XE5'de Component palette'de Additional tabı altında TApplicationEvents component'i. Ancak mesajımda da dediğim gibi component olmasa dahi; Application.OnMessage olay yöneticisini de kullanabilirsiniz bunun için.
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: KeyPress işlemleri

Mesaj gönderen badkursat »

Tabiki Message kullanman en mantıklısı ama hepsini denedim olmuyor diyorsan biraz saçma bir yöntem ama belki işini görür. Eğer bütün formların Form1 den türüyorsa yani main formun Form1 ise şöyle bir mantık kullanabilirsin. Ama bu mantıkla Sadece Form1 den türeyenler çalışır eğer Form2 den Form3 açıyosan çalışmayacaktır.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TForm1 = class(TForm)
    lv1: TListView;
    procedure MyKeyPress(Sender: TObject; var Key: Char);
    procedure FormDeactivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.MyKeyPress(Sender: TObject; var Key: Char);
begin
  try
    if Key = ^A then // Tüm Satırı Seç
    begin
      ShowMessage('Tümü Seç Tetiklendi...');
      //RowSelectAll(Sender);
    end;
    if Key = ^Z then // Tüm Seçli Satırı İptal Et
    begin
      ShowMessage('Seçili Satırı İptal Et Tetiklendi...');
      //RowSelectCancel(Sender);
    end;
  except
  end;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
var
  index : Integer;
begin
  For Index := 0 To Screen.ActiveForm.ControlCount-1 Do
    Begin
      If Screen.ActiveForm.Controls[Index] is TListView then
        TListView(Screen.ActiveForm.Controls[Index]).OnKeyPress := MyKeyPress;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  lv1.OnKeyPress := MyKeyPress;
  Show;
  Application.CreateForm(TForm2,Form2);
  Form2.Show;
end;

end.
Cevapla