Замена запятой на точку

Тема в разделе "Delphi - Компоненты", создана пользователем Dream, 20 ноя 2007.

Статус темы:
Закрыта.
  1. Dream

    Dream Гость

    У меня в коде есть момент когда Edit2.text:=edit1.text данные в edit1 вводяться в ручную разделение между целой и дробной частью числа через запятую, подскажите пожалуйста как правильно оформить код что бы данные в edit2 числа разделялись через точку????
     
  2. nataly_ukr

    nataly_ukr Гость

    Delphi - BdeaDMINISTRATOR - sYSTEM - Formats - Number - Decimalseparator где-то здесь , сообрази сам делала уже такое давно
     
  3. zubr

    zubr Гость

    Вариантов много. Можно, к примеру так:
    Код (Text):
    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;
     
  4. Silver Wind

    Silver Wind Гость

    Как вариант, можно запретить пользователю набрать неправильное значение, написав примерно такой обработчик OnKeyPress:

    Код (Text):
    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 и принимает свое значение в зависимости от региональных настроек.
    Заодно приведенный код блокирует ввод недопустимых символов.

    Подредактируй под свои нужды.
     
  5. h-falcon

    h-falcon Гость

    Можно попробовать таким способом. Может и не совсем красиво, но работает.

    Код (Text):
    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;
    Прошу извинить за отсутствие форматирования текста (см. сообщение выше),
    но когда набирал в окне всё было отформатировано.
     
  6. Barmutik

    Barmutik Гость

    От Ctrl+V спасёт ещё OnChange обработка.. а лучше использовать спец контрол...
     
  7. h-falcon

    h-falcon Гость

    А, что - разве не работает?
    Он сопирован из эксплуатирующегося проекта.
    Почти полностью, за исключением кое-каких "проверок".
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей