-
KiLLiR © (29.03.08 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} © (29.03.08 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 © (30.03.08 18:35) [2]Создал новый Unit в проекте и засунул весь этот код туда, Edit назвал MyEdit, в главном юните в разделе uses тоже добавил этот юнит. Программа компилируется нормально, но Edit принимает всё и отовсюсду: все символы с клавиатуры, можно делать вставку из буфера. Что я делаю не так?
-
{RASkov} © (30.03.08 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 © (30.03.08 21:36) [4]Все, разобрался :) Но появился новый вопрос. Edit создается в левом верхнем углу формы. Как задать ему определенные координаты?
-
{RASkov} © (30.03.08 21:39) [5]> [4] KiLLiR © (30.03.08 21:36)
Гы... у "нового" эдита есть теже свойства, что и у старого :) -
{RASkov} © (30.03.08 21:40) [6]with TMyEdit.Create(self) do begin
Parent:=Self;
left:=
top:=
....
end;
Ты в первом классе? :)