Текущий архив: 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.48 MB
Время: 0.036 c