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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
15-1186039685
nosfik
2007-08-02 11:28
2007.09.02
Пути к библиотекам


2-1186723135
Savek
2007-08-10 09:18
2007.09.02
TDBGrid.OnMouseDown


2-1186858301
инженер
2007-08-11 22:51
2007.09.02
Microsoft Word


15-1186037896
Knight
2007-08-02 10:58
2007.09.02
Хочу пойти учиться заочно...


2-1186843938
Aleksandrrr
2007-08-11 18:52
2007.09.02
Как добавить в *.exe -файл-проект изображения и текстовые файлы?