Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизTedit Найти похожие ветки
← →
poroshm (2007-08-05 16:36) [0]Как надо настроить TEdit чтобы вводились только цифры?
← →
Инс © (2007-08-05 16:46) [1]SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);
← →
{RASkov} © (2007-08-05 17:27) [2][1] - но этот способ отвечат на 100% вопроса:
> чтобы вводились только цифры
Т.е. уже никакие другие символы, такие как -+., , вводиться уже не будут....
Если нужно более шире, то обработывать нужно OnKeyXxxx и контролировать параметр Key.... который var....
← →
Инс © (2007-08-05 17:30) [3]
> [2] {RASkov} © (05.08.07 17:27)
Да и ваш способ на 100% не решает проблемы. Следующий вопрос будет, а как мне сделать, чтобы туда нельзя было вставить не-цифры. Ответ - перекрывать обработку WM_PASTE. В общем, все сводится к написанию своего компонента:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1140 + обсуждение
← →
SergeIT (2007-08-05 21:45) [4]Что-нибудь вроде этого (использую больше 10 лет)
type
TLetters = #32..#255;
TLetSet = set of TLetters;
var
_IntChars: TLetSet = ["0","1","2","3","4","5","6","7","8","9"];
function CheckString(var str: String; const let: TLetSet): Boolean;
var
s: String;
n, i: Integer;
begin
Result := TRUE;
s := "";
n := Length(str);
if n < 1 then exit;
Result := FALSE;
for i := 1 to n do
begin
if str[i] in let then s := s + str[i];
end;
if Length(s) = n then Result := TRUE else str := s;
end;
procedure EditCheckValue(Edit: TEdit; Let: TLetSet);
var
i, n: Integer;
s: String;
begin
if NOT Edit.Focused then exit;
i := Edit.SelStart;
n := Length(Edit.Text);
s := Edit.Text;
if NOT CheckString(s, Let) then
begin
Edit.Text := s;
i := i - (n - Length(s));
if (i >= 0) AND (i <= Length(s)) then
Edit.SelStart := i
else Edit.SelStart := 0;
if Edit.Focused then MessageBeep($FFFFFFFF);
end;
end;
EditCheckValue вызывется в OnChange TEdit.
← →
DVM © (2007-08-05 22:00) [5]в OnKeyPress нужного Edit-а:
if not (key in [ #0.." ","0".."9"]) then key:=#0;
← →
SergeIT (2007-08-05 22:52) [6]
> в OnKeyPress
А Copy/Paste ?
← →
Инс © (2007-08-05 22:55) [7]
> вызывется в OnChange TEdit.
Лично я противник таких методов. Модуль формы превращается в большую свалку, разобраться в которой по меньшей мере трудно.
Нужно просто создать свой компонент и бросить его на форму. Все будет чистенько и аккуратненько
← →
Двигатель внешнего сгорания (2007-08-05 23:07) [8]
> poroshm (05.08.07 16:36)
> Как надо настроить TEdit чтобы вводились только цифры?
TMaskEdit использовать не получится?
← →
{RASkov} © (2007-08-06 00:47) [9]
uses ...., Unit2;
type
TEdit = class(TMyEdit); //Альтернатива "создания" нового компонента, т.е. без регистрации в палитре.
TForm1 = class(TForm)
Edit1: TEdit;
//...................................................
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.
Но это так же "отсеивает" все кроме цифр(т.е. 100% решение вопроса)... под руку попался этот модуль.
> [8] Двигатель внешнего сгорания (05.08.07 23:07)
> TMaskEdit использовать
Есть у него некоторые "неприятные" моменты :)
← →
SergeIT (2007-08-06 01:22) [10]> Модуль формы превращается в большую свалку
Никакой свалки. Функции проверки ввода в отдельном модуле. А в модуле формы только добавляется EditXonChange - для однотипных едитов одна функция.
← →
Двигатель внешнего сгорания (2007-08-06 02:07) [11]
> {RASkov} © (06.08.07 00:47) [9]
> Есть у него некоторые "неприятные" моменты :)
Какие?
← →
{RASkov} © (2007-08-06 02:23) [12]> [11] Двигатель внешнего сгорания (06.08.07 02:07)
> Какие?
Есть вроде....) с ходу не помню, просто он мне как-то однажды так не понравился, что я его стараюсь избегать :)
К данному вопросу впрочем не относится, указать маску "!99999;1; " и то что нужно автору, вроде бы получится..... только девяток указать столько сколько нужно по максимуму...
ЗЫ Одна из "проблем" с ним - Invalid input value. Use escape key to abandon changes. - почему-то вспомнилась. Впрочем - проблема - в кавычках :)
← →
Германн © (2007-08-06 02:32) [13]И ничего не изменилось пока я "купался и загорал" :)
Опять вопрос "не знаю чей", "не знаю о чём". И сразу ответы на "не знаю что, но я думаю про это" :)
← →
Leonid Troyanovsky © (2007-08-06 09:26) [14]
> {RASkov} © (06.08.07 00:47) [9]
> procedure TMyEdit.KeyPress(var Key: Char);
http://www.rsdn.ru/Forum/Message.aspx?mid=517237&only=1
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-08-06 09:31) [15]
> {RASkov} © (06.08.07 02:23) [12]
> ЗЫ Одна из "проблем" с ним - Invalid input value. Use escape
type
TMyMaskEdit = class(TMaskEdit)
private
procedure CMExit(var msg: TCMExit); message cm_exit;
end;
procedure TMyMaskEdit.CMExit;
begin
try
inherited;
except
on E: EDBEditError do
raise Exception.Create("My exception");
end;
end;
Если же хочется снабдить оной функциональностью существующий контрол,
то ему нужно подменять WindowProc на приблизительно такую:
procedure TForm1.NewProc(var msg: TMessage);
begin
try
OldProc(msg);
except
on E: EDBEditError do
raise Exception.Create("My exception"); // do something
end;
end;
таким образом:
OldProc := MaskEdit1.WindowProc; // OldProc - поле формы :TWndMethod
MaskEdit1.WindowProc := NewProc;
--
Regards, LVT.
← →
{RASkov} © (2007-08-06 11:15) [16]> [14] Leonid Troyanovsky © (06.08.07 09:26)
???
> [15] Leonid Troyanovsky © (06.08.07 09:31)
Угу.... именно поэтому "проблема" в кавычках....
← →
Leonid Troyanovsky © (2007-08-06 11:29) [17]
> {RASkov} © (06.08.07 11:15) [16]
Не KeyPress, а Change.
--
Regards, LVT.
← →
{RASkov} © (2007-08-06 11:43) [18]> [17] Leonid Troyanovsky © (06.08.07 11:29)
> Не KeyPress, а Change.
Все равно не пойму.... нужно объеденить что ли мой код и твой по ссылке??? или заменить... или что?
Может [14] - это не мне тогда, а автору, как альтернативный вариант....
← →
Leonid Troyanovsky © (2007-08-06 13:17) [19]
> {RASkov} © (06.08.07 11:43) [18]
> Может [14] - это не мне тогда, а автору, как альтернативный
> вариант....
Это тебе персонально, у вопрошающего и так много предложений.
А заменить или что - думай сам.
--
Regards, LVT.
← →
{RASkov} © (2007-08-06 16:40) [20]> [19] Leonid Troyanovsky © (06.08.07 13:17)
> Это тебе персонально
Пригодится. Спасибо)
← →
Eraser © (2007-08-06 17:00) [21]TSpinEdit
← →
Германн © (2007-08-06 17:37) [22]
> Eraser © (06.08.07 17:00) [21]
>
> TSpinEdit
>
TRxSpinEdit
← →
HWNDDeletor (2007-08-13 13:21) [23]
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_STYLE,
GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);
end;
Правда этот способ от Paste не помагает...
← →
{RASkov} © (2007-08-13 13:26) [24]> [23] HWNDDeletor (13.08.07 13:21)
Ты его из первого поста скопировал?
← →
HWNDDeletor (2007-08-13 14:07) [25]Тфу епт RASkov, не заметил...
Просматривал бегло, туплю чего-то ((((
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c