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

Вниз

Запрет на вставку текста из буфера в Edit   Найти похожие ветки 

 
KiLLiR ©   (2008-03-29 18:57) [0]

В моей программе нужно, чтобы Edit принимал только цифры. Событие нажатия клавиатуры я обработал как:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If not (Key in [ #48..#57]) then
Key := #0
end;

Но до сих пор можно вставить все, что угодно из буфера. Нашел пример защиты от нажатия комбинации Ctrl+V, но не могу сделать аналогично для Shift+Insert.
Может кто-то знает как сделать еще проще. Скажем, постоянно производить какую-нибудь проверку и в случае вставки из буфера мгновенно очищать поле. Буфер очищать нельзя - вдруг там что-то полезное для пользователя. И желательно чтобы это не было ресурсозатратным.
Буду очень признателен, если кто-то поможет.

P.S. Нигде не могу найти коды для служебных клавиш и их комбинаций.


 
{RASkov} ©   (2008-03-29 19:39) [1]

> [0] KiLLiR ©   (29.03.08 18:57)

unit Unit2;
interface
uses Windows, Messages, StdCtrls;

const EM_AFTERPASTE = WM_USER+10;
     PASTE_CODE    = 22;
     MAX_LENGTH    = 10;

type
 TMyEdit = class(TEdit)
 protected
   procedure KeyPress(var Key: Char); override;
   procedure WndProc(var Mes: TMessage); override;
 end;

implementation

{ TMyEdit }
procedure TMyEdit.KeyPress(var Key: Char);
begin
 inherited;
 if ORD(Key) = PASTE_CODE then Exit;
 if not (Key in ["0".."9", #8]) then Key:=#0 else
  if ((Length(Text)>MAX_LENGTH-1) and (Key<>#8)) then
   if SelStart<MAX_LENGTH then SelLength:=1 else Key:=#0;
end;

procedure TMyEdit.WndProc(var Mes: TMessage);
var S: String; N: Integer;
begin
if Mes.Msg = WM_PASTE      then PostMessage(Handle, EM_AFTERPASTE, 0, 0);
if Mes.Msg = EM_AFTERPASTE then begin
 S:=Text;
 for N:= Length(S) downto 1  do if not (S[N] in ["0".."9"]) then Delete(S, N, 1);
 if Length(S)>MAX_LENGTH then SetLength(S, MAX_LENGTH);
 Text:=S;
end else inherited;
end;

end.


 
KiLLiR ©   (2008-03-30 18:35) [2]

Создал новый Unit в проекте и засунул весь этот код туда, Edit назвал MyEdit, в главном юните в разделе uses тоже добавил этот юнит. Программа компилируется нормально, но Edit принимает всё и отовсюсду: все символы с клавиатуры, можно делать вставку из буфера. Что я делаю не так?


 
{RASkov} ©   (2008-03-30 19:33) [3]

> [2] KiLLiR ©   (30.03.08 18:35)
> Edit назвал MyEdit

:) Нда...
не нужно его никак обзывать...

в модуле с тестовой формой пропиши в раздел uses ..., Unit2;
сам Unit2 выше.
И например на OnCreate формы напиши следующее:

TMyEdit.Create(self).Parent:=Self;
F9 и проверяй.
Объясняю:
В модуле Unit2 мы описали и реализовали новый класс с именем TMyEdit.
На создании формы мы создаем экземпляр нашего нового класса с родителем и владельцем которого есть - тек. форма(self)...
И еще Edit1(брошенный в дизайнере) <> нашему новому классу... Что еще не понятно? :)


 
KiLLiR ©   (2008-03-30 21:36) [4]

Все, разобрался :)  Но появился новый вопрос. Edit создается в левом верхнем углу формы. Как задать ему определенные координаты?


 
{RASkov} ©   (2008-03-30 21:39) [5]

> [4] KiLLiR ©   (30.03.08 21:36)

Гы... у "нового" эдита есть теже свойства, что и у старого :)


 
{RASkov} ©   (2008-03-30 21:40) [6]

with TMyEdit.Create(self) do begin
Parent:=Self;
left:=
top:=
....
end;
Ты в первом классе? :)


 
KiLLiR ©   (2008-03-30 22:46) [7]

Спасибо! Все сделал как надо. А по поводу первого класса - можешь считать и так. Я поэтому и обратился за помощью. Просто все эдиты, которые я создавал ранее, я создавал не с помощью Create, а просто кидал на форму с вкладки Standard, и тогда их было видно еще до запуска программы, и можно было переместить и изменить размеры просто мышью или в окне свойств и событий. Но теперь буду знать и этот метод. Еще раз спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
8-1179134344
ЯХ
2007-05-14 13:19
2008.04.27
Библиотека графических файлов


2-1206873520
vegarulez
2008-03-30 14:38
2008.04.27
Вопрос про Max(Memo1.Lines.Values[i])


15-1205653077
pvr
2008-03-16 10:37
2008.04.27
Языковая панель


9-1169396515
Samarik
2007-01-21 19:21
2008.04.27
Программа установки игры


2-1206948924
asdf2
2008-03-31 11:35
2008.04.27
TQuery.Locate(field, str, [loPartialKey])