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

Вниз

Запрет ввода некоторых символов в Edit   Найти похожие ветки 

 
Dimitry   (2004-04-06 15:38) [0]

Здравствуйте!
Как запретить вводить некоторые символы в Edit в диалоге.
И как можно ограничить длину текста в Edit (как MaxLength в VCL).


 
Suntechnic ©   (2004-04-06 16:16) [1]

>Dimitry
Как запретить вводить некоторые символы в Edit в диалоге.
Смотря какие. Если надо разрешить вводить только целые числа, то это совсем просто (с помощью установки соотв. стиля). Если логика посложнее, тогда традиционными (как и в VCL) способами.

И как можно ограничить длину текста в Edit (как MaxLength в VCL).
Послать сообщение EM_GETLIMITTEXT


 
Dimitry   (2004-04-06 16:24) [2]

А какие сообщения нужно обрабатывать при вставке из буфера обмена и при вводу символа (чтобы потом этот ввод отменить)?


 
Suntechnic ©   (2004-04-06 18:35) [3]

>Dimitry
А какие сообщения нужно обрабатывать при вставке из буфера обмена
WM_PASTE вестимо.
при вводу символа
Можешь WM_KEYDOWN


 
Dimitry   (2004-04-06 19:30) [4]

Писал вот так:

 case Msg of
   WM_PASTE: MessageBox(0, "", "", 0);
 end;


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


 
Suntechnic ©   (2004-04-06 19:34) [5]

>Dimitry
Это ты где писал? Небось в WndProc диалогового окна. Ясное дело что программа ноль внимания. Сообщения ведь шлются в оконную процедуру Edit control-а, а не диалоговому окну.

Про Subclassing слыхал когда-нибудь? Набери в хелпе по Win API. Там по-моему как раз на примере Edit-а показано.


 
Dimitry   (2004-04-06 19:53) [6]


> Про Subclassing слыхал когда-нибудь?

Нет.

> Это ты где писал? Небось в WndProc диалогового окна.

Так и делал. :)
Пойду разбираться...


 
Dimitry   (2004-04-07 13:20) [7]

Suntechnic
Сделал как там в примере. WM_PASTE теперь работает, но Edit перестал реагировать на мышку. Как это можно исправить?


 
Suntechnic ©   (2004-04-07 15:48) [8]

>Dimitry   (07.04.04 13:20)
Сделал как там в примере. WM_PASTE теперь работает, но Edit перестал реагировать на мышку. Как это можно исправить?

Код в студию.


 
SPeller ©   (2004-04-07 15:55) [9]

А я всегда думал что при вставке Ctrl+V окну едита посылается WM_SETTEXT, в котором и можно сделать все изменения текста.


 
Игорь Шевченко ©   (2004-04-07 15:59) [10]


> WM_PASTE теперь работает, но Edit перестал реагировать на
> мышку.


#ifdef offtopic

Диван протащить удалось, но выяснилось странное и необъяснимое обстоятельство: как только я на него сажусь, гаснет свет по всей квартире.

#endif


 
Dimitry   (2004-04-07 16:51) [11]


var
 OldEditProc: Integer;

function EditSubclassProc(Wnd: HWnd; Msg, wParam, lParam: Cardinal): Cardinal; stdcall;
begin
 case Msg of
//    WM_PASTE: messagebox(0,"","",0);
   WM_GETDLGCODE: Result := DLGC_WANTALLKEYS;
 end;
 CallWindowProc(Pointer(OldEditProc), Wnd, Msg, wParam, lParam);
end;

function InputDlgFunc(Wnd: HWnd; Msg: Cardinal; wParam, lParam: Cardinal): Bool; stdcall;
var
 WndEdit: HWnd;
begin
 Result := False;
 case Msg of
   WM_DESTROY:
   begin
     SetWindowLong(GetDlgItem(Wnd, 102), GWL_WNDPROC, OldEditProc);
   end;
   WM_INITDIALOG:
   begin
     WndEdit := GetDlgItem(Wnd, 102);
     OldEditProc := SetWindowLong(WndEdit, GWL_WNDPROC, Integer(@EditSubclassProc));
   end;
 end;
end;

function ShowInputDlg;
begin
 DialogBoxParam(HInstance, PChar(901), Wnd, @InputDlgFunc, 0);
end;


 
RealRascal ©   (2004-04-07 17:08) [12]

а не проще разве обрабатывать событие онкейдаун?
Если символ допустимый, то не делаем ничего. если не допустимы - присваиваем ему #0. И еще надо будет в ончейнж написать, чтобы удаляла недопустимое и обрезала.
у меня лично к winapi выработалось такое отношение, точнее даже сказать сложилось очучение, что оно работает как хочет. то работает - то не работает. седня до обеда работает, после нет. не знаю, может это все надуманно...или из-за неопытности... стараюсь абходится без всяких там сендмессаге и проч.


 
Suntechnic ©   (2004-04-07 18:21) [13]

>Dimitry
А на кой леший тебе сдалось обрабатывать WM_GETDLGCODE?
Дальше... Result у тебя присваевается не тот что нужен.
Должно быть что-то типа

function EditSubclassProc(Wnd: HWnd; Msg, wParam, lParam: Cardinal): Cardinal; stdcall;
begin
case Msg of
   WM_PASTE: messagebox(0,"WM_PASTE","",0);
end;
Result := CallWindowProc(Pointer(OldEditProc), Wnd, Msg, wParam, lParam);
end;


SPeller ©   (07.04.04 15:55) [9]
А я всегда думал что при вставке Ctrl+V окну едита посылается WM_SETTEXT, в котором и можно сделать все изменения текста.

Неправильно думал.


 
Dimitry   (2004-04-07 19:00) [14]

Suntechnic
Еще хочу спросить, там в примере есть UNREFERENCED_PARAMETER(lParam) - что это такое? Это только для си?


 
Suntechnic ©   (2004-04-07 19:15) [15]

>Dimitry   (07.04.04 19:00) [14]
Еще хочу спросить, там в примере есть UNREFERENCED_PARAMETER(lParam) - что это такое? Это только для си?

Не обращай на это внимание. Это не то, что для С, это для VC++ :).

Этот макрос служит для того чтобы убрать предупреждение компилятора о том, что формальный параметр нигде не сипользуется.



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

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

Наверх




Память: 0.5 MB
Время: 0.038 c
14-1083557171
SammIk
2004-05-03 08:06
2004.05.23
Народ, а как вам "Демон" Врубеля?


3-1082701593
Andrey_Zh
2004-04-23 10:26
2004.05.23
Базы данных


1-1084169747
nejest
2004-05-10 10:15
2004.05.23
конвертор dfm


3-1082912534
windows
2004-04-25 21:02
2004.05.23
изменение dbgrid


1-1083923137
Erik
2004-05-07 13:45
2004.05.23
Динамическое определение типа?