Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрет ввода некоторых символов в Edit [D7, WinXP]


Dimitry ©   (2004-04-06 15:38:00) 

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


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

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

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

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


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

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


Suntechnic   (2004-04-07 18:21:00) [3]

>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, в котором и можно сделать все изменения текста.

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


RealRascal   (2004-04-07 17:08:00) [4]

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


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


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;


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


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


#ifdef offtopic

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

#endif


SPeller   (2004-04-07 15:55:00) [7]

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


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

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

Код в студию.


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

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


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


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

Нет.

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

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


Suntechnic   (2004-04-06 19:34:00) [11]

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

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


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

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

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


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


Suntechnic   (2004-04-06 18:35:00) [13]

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


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

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


Suntechnic   (2004-04-06 16:16:00) [15]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо