Ты номерное с типом Real работаешь случаем не в Edit Процедура для Edit событие OnCange можешь переделать под что хочешь приписав первые и последние две строчки.
| Код | {Процедура ограничения в вода в Edit с преобразованием '.' в ',' ('0..9',',','.','E','+','-')} procedure EditCh(Sender:TObject); const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель Var CurStr: String; Counter,SelPos,SeparatorPos :Integer; begin SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора CurStr:=TLabeledEdit(Sender).Text;//Текст из Edit, который изменён if CurStr='' then //Если текста нет begin TLabeledEdit(Sender).Text:='0'; //Поставить 0 TLabeledEdit(Sender).SelStart:=1; //Отвести курсор на 1 Exit; //Выйти end; 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); //Удалить TLabeledEdit(Sender).Text:=CurStr; //Результат TLabeledEdit(Sender).SelStart:=SelPos; //Результат end;
|
Правда есть некоторые глюки, если выделить текст и нажать - то будет ошибка но я думаю это мелочь если избавишься отпишись. |