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

Вниз

Опять - DeсimalSeparator???   Найти похожие ветки 

 
Юрий Зотов ©   (2002-03-27 22:37) [30]

Ну, вот и вечер...


> Fay © (27.03.02 17:52)
> ... повлияет на весь ввод

А разве я говорил, что не нужно делать никаких проверок? Конечно, в обработчике нужен хотя бы if. Кстати, точно такой же if нужен и при любом другом способе перехвата клавиатуры для всех форм проекта разом. Поэтому речь может идти только о том, как осуществить этот перехват проще, универсальнее и без переделки кучи уже готовых форм. А уж что именно делать в этом перехватчике, что именно проверять или не проверять - это от способа перехвата, по сути, не зависит.



> Alx2 © (27.03.02 17:15)
> Но работает же! И не ругается.

В классе TForm1 обработчик FormKeyPress компилятору известен, поэтому, естественно, работает (а чего бы ему не работать?). Правда, форма не обязана наследоваться от TForm напрямую, поэтому вместо проверки ClassParent=TForm лучше проверять is TForm, иначе проверка может и не сработать.

Но исходную проблему это не решает - если на момент прогона цикла хотя бы одна из 100 форм еще не создана (в чем можно быть практически уверенным), или ее владельцем будет не Application, то и в цикл она не попадет. Соответственно, никаких KeyPreview и никаких обработчиков ей назначено не будет - и мы приплыли! Более того, стоит в процессе работы программы уничтожить любую форму, а потом снова ее создать - и для нее снова придется делать все то же самое. А отсюда новая проблема - как отловить создание формы не из нее самой? Решить можно, но это лишняя головная боль и лишний код.

> Всем желающим

Вот простейший (работающий) пример - во все TEdit"ы проекта, где бы они ни находились разрешается ввод только плюса, минуса, цифр, буквы "E", запятой и точки. При этом запятая, точка и все соответствующие им клавиши (на любом регистре) автоматически преобразуются в корректный DecimalSeparator (при любых настройках системы), а все клавиши, соответствующие русской или латинской букве "E" (на любом регистре) - в латинскую "E". Еще отключен стандартный Beep при Enter. И при этом проект может содержать любое количество любых форм, которые можно создавать и уничтожать где угодно и когда угодно.


type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
const
Separators = [".", ",", "<", ">", "б", "ю", "Б", "Ю", "?", "/" ];
Exponents = ["e", "у", "У", "е", "Е", "t", "T"];
ValidChars = [#8, #9, "+", "-", "E", "0".."9"];
begin
with Msg do
if (Message = WM_CHAR) and (Screen.ActiveControl is TEdit) then
if Char(WParam) in Separators
then WParam := Byte(DecimalSeparator)
else if Char(WParam) in Exponents
then WParam := Byte("E")
else Handled := not (Char(WParam) in ValidChars)
end;





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

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

Наверх




Память: 0.47 MB
Время: 0.016 c
7-22850
МИФИст
2002-01-10 22:25
2002.04.08
Задержки ?


1-22752
Ptr
2002-03-27 11:18
2002.04.08
Hi All ! Кто-нить знает, как поменять форму курсора в чужом (внешнем) приложении ?


1-22733
BlackGrin
2002-03-26 22:25
2002.04.08
Изминения надписи на кнопке зная название кнопки


14-22839
BJValentine
2002-02-25 10:40
2002.04.08
Help


1-22635
Keylook
2002-03-27 21:08
2002.04.08
Как можно программно поменять местами клавиши на клавиатуре?