Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Вставка апострофа во всех контролах   Найти похожие ветки 

 
RDA   (2006-01-17 10:13) [0]

Как сделать так чтобы в программе во всех контролах при нажатии, к примеру Ctrl+~ результатом вставлялся бы апостроф?


 
TUser ©   (2006-01-17 10:16) [1]

Перебрать в цикле все Components


 
RDA   (2006-01-17 11:16) [2]

Нет, не это имелось ввиду, нужно просто сделать подмену ввода для каждого контрола в отдельности, можно конечно у каждого описать OnKeyDown - но можно же как-то єто сделать по другому через клавиатурный хук или еще как-то иначе. Подскажите решение.


 
Desdechado ©   (2006-01-17 11:18) [3]

а один обработчик OnKeyDown на всех?


 
medvedenator ©   (2006-01-17 11:22) [4]

Удалено модератором


 
Leonid Troyanovsky ©   (2006-01-17 12:47) [5]


> RDA   (17.01.06 11:16) [2]

> у каждого описать OnKeyDown - но можно же как-то єто сделать
> по другому через клавиатурный хук или еще как-то иначе.


Например, сделать Action (ActionList) with OnExecute:

procedure TForm1.Action1Execute(Sender: TObject);
begin
   ActiveControl.Perform(WM_CHAR, Ord(""""), 0);
end;

--
Regards, LVT.


 
RDA   (2006-01-17 12:53) [6]

Сделать то можно, вот только форм же много, для каждой делать? Может есть лучше вариант?


 
Игорь Шевченко ©   (2006-01-17 13:51) [7]


> Может есть лучше вариант?

unit HookUnit;

interface

procedure SetHook;
procedure RemoveHook;

implementation
uses
 Windows, Messages, SysUtils;

var
 hGetMsgHook: THandle;

const
 VK_OEM_3 = $C0;
 
function GetMsgProc(Code: Integer; wParam1: Integer;
 lParam: Integer): LRESULT; stdcall;

 function KeyIsPressed (Key: Integer): Boolean;
 begin
   Result := GetKeyState(Key) and $80000000 <> 0;
 end;

begin
 if Code >= 0 then begin
   if (PMsg(lParam)^.Message = WM_KEYDOWN)  and (wParam1 = PM_REMOVE) then
     if (PMsg(lParam)^.wParam = VK_OEM_3) and
         KeyIsPressed(VK_CONTROL) then begin
       PMsg(lParam)^.message := WM_NULL;
       PostMessage(PMsg(lParam)^.hWnd, WM_CHAR, Ord(""""),
          PMsg(lParam)^.lParam);
     end;
 end;
 Result := CallNextHookEx(hGetMsgHook, Code, wParam1, lParam);
end;

procedure SetHook;
begin
 Assert(hGetMsgHook = 0);
 hGetMsgHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, 0,
   GetCurrentThreadId);
end;

procedure RemoveHook;
begin
 Assert(hGetMsgHook <> 0);
 UnhookWindowsHookEx(hGetMsgHook);
 hGetMsgHook := 0;
end;

end.


И пример использования:

unit main;

interface

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

type
 TfMain = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 end;

var
 fMain: TfMain;

implementation
uses
 HookUnit, Other;

{$R *.DFM}

procedure TfMain.FormCreate(Sender: TObject);
begin
 SetHook;
end;

procedure TfMain.Button1Click(Sender: TObject);
begin
 with TfOther.Create (Application) do
   try
     ShowModal;
   finally
     Free;
   end;
end;

end.


unit Other;

interface

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

type
 TfOther = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
 end;

var
 fOther: TfOther;

implementation

{$R *.DFM}

end.


 
RDA   (2006-01-17 14:40) [8]

Игорь Шевченко
То что доктор приписал. Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
15-1138610774
Opilki_Inside
2006-01-30 11:46
2006.02.19
Посоветуйте хороший XML-редактор.


2-1138582094
Anatoly123
2006-01-30 03:48
2006.02.19
QReports


3-1135080293
wild_arg
2005-12-20 15:04
2006.02.19
Спонтанные округления


2-1138883033
Mirrorballman
2006-02-02 15:23
2006.02.19
Редактор форм


15-1138217669
Kerk
2006-01-25 22:34
2006.02.19
Аукцион