Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Можно ли запретить в "Edit" вводить буквы? (http://forum.oszone.net/showthread.php?t=120116)

ShadowMas 15-10-2008 14:26 924591

Можно ли запретить в "Edit" вводить буквы?
 
Скажите, мож но ли запретить в "Edit" в инструментах "Стандартные" вводить буквы? Я тут подумал зачем писать кучу условий и окон подсказки, тем самым усложнять код програмки, есть ли возможность запретить ввод строковых символо (текста), что бы вводились только числа? :)

CyberDaemon 15-10-2008 15:03 924625

Использовать компонент MaskEdit ?

ShadowMas 15-10-2008 15:35 924648

Извиняюсь за глупый вопрос, просто я только учусь и поэтому ещё не всё понятно а где находится "компонент MaskEdit" в смысле в какой групе инструментов?

Просто вот уже столько сижу с програмкой которую хочу написать в виде тренеровки но видно знаний катострофически мало так, как програмка то работает но вот когда оставляеш поля ввода "Edit1" и "Edit2" пустыми или пишеш текст то возникает критическая ошибка и програмка виснет :(



procedure TForm1.ZimLezaClick(Sender: TObject);


begin

Edit1.Enabled:= ZimLeza.Checked;
Edit3.Enabled:= ZimLeza.Checked;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

x1: real;
x2: integer;
y: real;

begin

x1:= StrToInt(Edit1.Text); x2:=StrToInt(Edit2.Text);
y:= StrToInt(Edit1.Text);

Edit3.Text:= floattostr(Strtofloat(Edit1.text)*(1.013- 0.0267123*strtofloat(edit2.text)));

label5.Caption :='Вес: '+ Edit3.Text+ #13 + 'Кл.раз: '+ Edit2.Text;

end;

end.

Drongo 15-10-2008 16:25 924700

ShadowMas, А вот посмотрите, мне когда-то тоже нужно было, код не на Delphi, но думаю, не составит труда перевести или другие участники помогут. [решено] *Теория* | Контроль ввода в компоненте Edit

ShadowMas 15-10-2008 17:02 924727

if(Edit2->Text != "" && Edit1->Text != "" && StrToInt(Edit2->Text)<=StrToInt(Edit1->Text){
//если оба Edit'а не пусты то проверяем их на
//валидность
Edit2->Text=""; //Очищаем Edit2...
Edit2->SetFocus(); //...и устанавливаем фокус на него.
Application->MessageBox("Error", "Error", 16); //Показываем Messagebox.
}


Да, что то я совсем подвис не могу понять само условие if(Edit2->Text != "" && Edit1->Text != "" && StrToInt(Edit2->Text)<=StrToInt(Edit1->Text)

Что ето значит???

Drongo 15-10-2008 17:27 924746

ShadowMas,
Код:

if(Edit2->Text != "" && Edit1->Text != "" && StrToInt(Edit2->Text)<=StrToInt(Edit1->Text)
Если Edit не равен пустому и содержимое первого Edit меньше или равно содержимому второго Edit то очистить второй Edit и установить фокус на него, я извиняюсь, это не совсем тот код, но мне он тогда помог. Нужно условие немножко изменить с && на || и добавить в обработчике onExit строки: Естественно Edit'ы могут быть разными.
Код:

Edit1->Text=""; //Очищаем Edit1...
Edit1->SetFocus(); //...и устанавливаем фокус на него.

можно ещё так, в обработчике OnKeyPress:
Код:

//Функция ввода, проверяет ввод только цифр  А != 0 или D != 0, для Edit1 и Edit2
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
        if ((Key >= '0') && (Key <= '9') || Key == '-' || Key == VK_BACK) {}  // цифры
        else if ((Key == '.') || (Key == ','))//{ // запятая
//                if (((TEdit*)Sender)->Text.Pos(DecimalSeparator)!= 0) // если запятая уже есть
                    Key = 0;
  //              else // если ещё нет
    //                Key = DecimalSeparator;
      //        }
            else
                  Key = 0; // не цифра
}

Здесь я оставил символ '-' - минус, точку и запятую, чтобы вводить дробные отрицательные значения.

ShadowMas 15-10-2008 21:11 924938

Спасибо Drongo очень подробно описал попробую применить к своей програмке на Delphi

VasyaPupkin81 16-10-2008 13:39 925443

Лень копипастить, поэтому приведу ссылку на один из возможных вариантов решения задачи. Ее можно также усовершенствовать, использовав вместо "." константу DecimalSeparator.

З.Ы. Также можно использовать функции StrToIntDef и StrToFloatDef. Но это получится, так сказать, борьба с последствиями, а не их предотвращение.

detrin 20-10-2008 23:22 928998

В свое время часто пользовался вот таким кодом:
Код:

var  OldText:String;
...
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text<>'' then
try
  StrToFloat(Edit1.Text);
  OldText:=Edit1.Text;
except
  Edit1.Text:=OldText;
  Edit1.SelStart:=Length(Edit1.Text);
  Edit1.SelText:='';
end;
end;

На мой взгляд очень удобный и компактный код.

VasyaPupkin81 21-10-2008 08:17 929188

Порылся в своих исходниках и вот еще что обнаружил:
Код:

procedure NumericKor(Edit: TEdit);
begin
  if Edit.Text <> '' then
  begin
    try
      StrToFloat(Edit.Text);//если поменять StrToFloat на StrToDate, то также можно контролировать правильность введения даты
    except
      Edit.SetFocus;
      MessageBeep(0);
      raise Exception.Create('"' + Edit.Text + '" - некорректное число');
      Exit;
    end
    Edit.Text := FloatToStr(StrToFloat(Edit.Text));
  end
  else
    Edit.Text := '0';
end;

Чем-то схоже это решение с решением detrin, единственное существеyное отличие, что мою процедуру нужно вставлять в событие OnExit компонента TEdit

IBars 19-12-2008 13:06 984881

Если вы хотите, чтобы пользователь мог вводить в окно редактирования Edit только цифры и символ точки, вы можете в обработчик события OnKeyPress этого компонента вставить оператор:
if not (Key in ['0'..'9', ',']) then Key := #0;
Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом, который не занесется в текст окна Edit.


Время: 16:15.

Время: 16:15.
© OSzone.net 2001-