Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как в Edit1.text вводить только число.


Автор: ConstantinXXX 14.6.2006, 17:48
Как отсеивать только числа. При вводе. Или запритить ввод букв. smile  

Автор: Mal Hack 14.6.2006, 18:51
В OnKeyPress
Код
 if NOT (key in ['0'..'9',#45,#44])  then
   key:=#0;

Ну а если серьезнее, то в Onchange пытаемся сделать преобразование, если ошибка - возвращаем старое значение, которое при успешном преобразовании устанавливаем. 

Автор: Friackazoid 14.6.2006, 19:06
В onchande лучше не делать, потому что это может привести к нежелательным результатам а вот OnClick хорошо может получиться. Тут если немного извратиться вообще можно  сделать универсальный обработчик исключений, если проверок всяких разный много, ведь наверняка дробное число должно быть коректным, то обработчик исключений самое то. 

Автор: Mal Hack 14.6.2006, 19:10
На сколько я помню, OnClick выовется в других случаях.... 

Автор: Friackazoid 14.6.2006, 20:06
Mal Hack
Я имею ввиду он клик по той кнопке которая запускает код для обработки этих данных. 

Автор: ivan219 14.6.2006, 21:40
Вот процедура которая разрешает только ввод-выводит цыфр.
Код

Procedure TForm1.EditChange(Sender: TObject);
var
Text: String;
SelStart: Integer;
begin
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);
 TLabeledEdit(Sender).Text:=Text;
 TLabeledEdit(Sender).SelStart:=SelStart;
end;


Код

{Процедура ограничения в вода в Edit с преобразованием '.' в ',' ('0..9',',','.','E','+','-')}
Procedure EditCh(TextIn:String; SelStartIn:Integer; var Text:String; SelStart:Integer);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель

Var
  CurStr: String;
  Counter,SelPos,SeparatorPos  :Integer;
begin
  SelPos:=SelStartIn; //положение курсора
  CurStr:=PChar(TextIn);//Текст из эдита, который изменён
  if length(curStr)<1 then Exit; //Проверка длины
  for counter := 0 to 1 do  //Перечисление по массиву
    if WrongSepArr[counter]<> DecimalSeparator then
      While Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент масива в тексте
        CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор
  SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор
  for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
   Begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
        curStr[Counter] := DecimalSeparator  //удаляем
    else
      if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
       Begin
        Delete(CurStr,counter,1);  //удаляем
        dec(SelPos); //Уменьшить на 1
       End;
  End;
  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
  Begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
  End;
  if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then //Если последний символ E
      Delete(CurStr,length(curStr),1);  //Удалить
  if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then //Если последний символ знак
      Delete(CurStr,length(curStr),1);  //Удалить
  if length(curStr)>=2 then //Если длина больше 1
    if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
      Begin
       insert('0',curStr,2); //Вставить 0 вторым символом
       inc(SelPos);  //Увеличить на 1
      End;
  if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый сивол запрещён
   Delete(CurStr,1,1); //Удалить
  While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
   delete(CurStr,1,1); //Удалить
  While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
   delete(CurStr,2,1); //Удалить
  Text:=CurStr;  //Результат
  SelStart:=SelPos;  //Результат
end;
 

Автор: Lence 14.6.2006, 21:55
А я так выходил из положения

Код


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9'])  then
  begin
     if not (Key= #13) then
        begin
          if not (Key= #8) then
            begin
              Key := #27;
            end;
        end;
    end;
 end;
 

Автор: ConstantinXXX 15.6.2006, 00:27
Спасибо всем smile . Алгоритмов конечно много. Но необходим самый простой. 

Автор: skyboy 15.6.2006, 00:40
Цитата(ConstantinXXX @  15.6.2006,  00:27 Найти цитируемый пост)
Алгоритмов конечно много. Но необходим самый простой. 

Stanard -> MaskEdit.
 

Автор: Rrader 15.6.2006, 07:26
Код

SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(Edit1.Handle, GWL_STYLE) Or ES_NUMBER);
 

Автор: Poseidon 15.6.2006, 19:40
Вот такой пример во всех учебниках присутствует:

Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
  '0'..'9':;
  #13:;
  #8:;
  else key:= chr(0);
  end;
end;


Правда у этого примера есть минус. Он не спасает от ввода из буфера  

Автор: Mal Hack 15.6.2006, 22:32
Цитата(skyboy @  15.6.2006,  01:40 Найти цитируемый пост)
Stanard -> MaskEdit.

Это бабушка на двое сказала... Там все-таки маска, а не формат. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)