Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Замена запятой на точку
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Компоненты
Dream
У меня в коде есть момент когда Edit2.text:=edit1.text данные в edit1 вводяться в ручную разделение между целой и дробной частью числа через запятую, подскажите пожалуйста как правильно оформить код что бы данные в edit2 числа разделялись через точку????
nataly_ukr
Delphi - BdeaDMINISTRATOR - sYSTEM - Formats - Number - Decimalseparator где-то здесь , сообрази сам делала уже такое давно
zubr
Вариантов много. Можно, к примеру так:
Код
function FloatValue(data:string):string;
var
  i:Integer;
  s:string;
begin
s:=data;
i:=1;
While i<=Length(s) do
begin
  If (not (s[i] in ['0'..'9'])) and (s[i]<>'.') then
  begin
   Delete(s, i, 1);
   continue;
  end;
  inc(i);
end;
Result:=s;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
TEdit(Sender).Text:=FloatValue(TEdit(Sender).Text);
TEdit(Sender).SelStart:=Length(TEdit(Sender).Text);
end;
Silver Wind
Как вариант, можно запретить пользователю набрать неправильное значение, написав примерно такой обработчик OnKeyPress:

Код
procedure TfmAdd.edVmKeyPress(Sender: TObject; var Key: Char);
begin
if Not(Key in ['0'..'9',',','.','-',' ',#8])
  then begin Key:=#0; exit; end;
if Key in [',','.',' ']
  then Key:=DecimalSeparator;
if (Key='-') and
    (Pos('-',TEdit(Sender).Text)>0)
  then Key:=#0;
if (Key=DecimalSeparator) and
    ((TEdit(Sender).Text='') or (Pos(DecimalSeparator,TEdit(Sender).Text)<>0))
  then Key:=#0;
end;


Он автоматически исправит точку, запятую или пробел на DecimalSeparator - эта стандартная переменная типа char в Delphi и принимает свое значение в зависимости от региональных настроек.
Заодно приведенный код блокирует ввод недопустимых символов.

Подредактируй под свои нужды.
sax_ol
Цитата(Silver Wind @ 21:11:2007, 14:48 )
OnKeyPress

он не спасает от Ctrl+V, ...

PS:
в некоторых случаях помогает TMaskEdit
h-falcon
Можно попробовать таким способом. Может и не совсем красиво, но работает.

Код
procedure TMainForm.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not (Key in ['0'..'9',#8,#9]) then begin             //для числа иные символы недопустимы
    if Pos('.',TEdit(Sender).Text)>0 then Key:=#0   //разделитель должен быть ОДИН
    else if TEdit(Sender).Text<>'' then begin          //если строка непустая, то разделитель
                                                                        //можно ввести только после любой цифры
      if Length(TEdit(Sender).Text)-TEdit(Sender).SelLength=0 then Key:=#0
      else if TEdit(Sender).SelStart=0 then Key:=#0
      else Key:='.';
    end
    else Key:=#0;
  end
  else if (Key=#8) and (TEdit(Sender).SelStart=1) and (Pos('.',TEdit(Sender).Text)=2) then
                                                                        //при удалении BackSpace'ом разделитель
                                                                       //не должен оказаться первым символом в строке
    Key:=#0;
end;


Прошу извинить за отсутствие форматирования текста (см. сообщение выше),
но когда набирал в окне всё было отформатировано.
Barmutik
От Ctrl+V спасёт ещё OnChange обработка.. а лучше использовать спец контрол...
sax_ol
Для: h-falcon
Вы код проверяли? Он рабочий?
Для: Barmutik
Как?
h-falcon
Цитата(sax_ol @ 11:01:2008, 19:15 ) *
Для: h-falcon
Вы код проверяли? Он рабочий?

А, что - разве не работает?
Он сопирован из эксплуатирующегося проекта.
Почти полностью, за исключением кое-каких "проверок".
sax_ol
Для: h-falcon
при проверке 10 ошибок
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.