Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > [delphi] ограничение на edit


Автор: porsche 23.9.2010, 15:53
Код

unit Unit1;

interface

 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  var a,b:real;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var c,d:real;

begin
 a:=StrToFloat(Edit1.Text); //переводим из строки в число
 b:=StrToFloat(Edit2.Text); //переводим из строки в число
    c:=sum(a,b); //вызываем функцию из Unit2 сложения
    d:=raz(a,b); //вызываем функцию из Unit2 разности

 label5.Caption:='равна '+ FloatToStr(c); //выводим сумму
 label6.Caption:='равна '+ FloatToStr(d); //выводим разность

end;

procedure TForm1.Button2Click(Sender: TObject); //очищаем поля
begin
edit1.Clear;
edit2.Clear;
label5.Caption:=' ';
label6.Caption:=' ';
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  var //цифровая маска
  vrPos, vrLength, vrSelStart: byte; s,ss:string;a,b:integer;
const
  I: byte = 8;
    //I+8 = количество знаков после запятой (в данном случае - 9 знака)
begin

  with Sender as TEdit do
  begin
    vrLength := Length(Text); //определяем длину текста
    vrPos := Pos(',', Text); //проверяем наличие запятой
    vrSelStart := SelStart; //определяем положение курсора
    s:=edit1.Text;
    ss:=edit1.text;
  end;

  case Key of
     '0': begin
     if vrlength=1 then
     if  edit1.Text[1] = '0' then key:=#0 ;
     if vrlength=2 then
     if (edit1.text[2]='0') then
     if (edit1.Text[1] = '-') or(edit1.Text[1] = '+') then key:=#0;
     end;
    '1'..'9': begin
    if vrlength=1 then
    if edit1.Text[1]='0' then begin delete (s,1,1); edit1.Text:=s;end;
     if vrlength=2 then
    if (edit1.Text[1]in['-','+']) and (edit1.Text[2]='0') then
     begin edit1.Clear;delete (s,2,1);edit1.text:=s;end;

        //проверяем положение курсора и количество знаков после запятой
        if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then
          Key := #0; //"погасить" клавишу
      end;
    ',', '.':
      begin
        //если запятая уже есть или запятую пытаются поставить перед
        //числом или никаких цифр в поле ввода еще нет
        if (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then
          Key := #0 //"погасить" клавишу
        else
          Key := #44; //всегда заменять точку на запятую
      end;
    #8: ; //позволить удаление знаков клавишей 'Back Space'
    '+','-':
     begin
     if (vrSelstart>0) then
        Key :=#0 //"погасить" клавишу
       end;

  else
    Key := #0; //"погасить" все остальные клавиши
  end;
end;
end.

Проблема в том что при вводе в поле edit допустим -03 должна произойти замена на -3 а происходит на 3- не могу понять проблемы а в случаи для 03 все работает как надо получается 3...изучал паскаль делфи только начал поэтому сделал как мог...проблема в строчках 88-89

Автор: DarkProg 23.9.2010, 18:22
Я потерялся в вашем коде  smile 
а десятки бессмысленых вложений if вообще добили smile  smile 

У вас он слишком формализвоан что ли - никогда не вводите десятки ненужных переменных - только сами запутаетесь

Попробуйте что-ливыполнить трассировку и поглядеть что у вас там программа вытворяет

Автор: SeregaAltmer 23.9.2010, 21:36
Возьми TSptinEdit, не мучайся

Сори для флота он не подойдет. В любом случае код изначально не верен так-как ты обрабатываеш лишь реакцию на нажатие клавиш. А если значение вставят мышкой? Если и делать адаптацию эдита к флоту, то делать это нужно минимум в onchange и приминительно ко всей строке.


     if vrlength=2 then  //дело в этом условии для "03" оно выполяняется, а для "-03" нет
    if (edit1.Text[1]in['-','+']) and (edit1.Text[2]='0') then
     begin edit1.Clear;delete (s,2,1);edit1.text:=s;end;


в любом случае лучше переписать весь код целиком, и делать это точно не в кейпрэссе

Автор: superVad 23.9.2010, 21:51
Возможно регулярные выражения помогут тебе.

Что бы ты не делал... (это намек)

Автор: ivan219 26.9.2010, 01:36
Процедура позволяет вводить вещественные значения от 0 и до.... с отрицательными числами придётся самому разбиратся они как то коряво реализованы.

Код

{Процедура ограничения в вода в 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;//Текст из эдита, который изменён
  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;


Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
 EditCh(Sender);
end;

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