Вот процедура которая разрешает только ввод-выводит цыфр.
Код | 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;
|
|