Войти

Показать полную графическую версию : Можно ли запретить в "Edit" вводить буквы?


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

CyberDaemon
15-10-2008, 15:03
Использовать компонент MaskEdit ?

ShadowMas
15-10-2008, 15:35
Извиняюсь за глупый вопрос, просто я только учусь и поэтому ещё не всё понятно а где находится "компонент 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
ShadowMas, А вот посмотрите, мне когда-то тоже нужно было, код не на Delphi, но думаю, не составит труда перевести или другие участники помогут. [решено] *Теория* | Контроль ввода в компоненте Edit (http://www.forum.oszone.net/thread-69344.html)

ShadowMas
15-10-2008, 17:02
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
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
Спасибо Drongo очень подробно описал попробую применить к своей програмке на Delphi

VasyaPupkin81
16-10-2008, 13:39
Лень копипастить, поэтому приведу ссылку (http://delphiworld.narod.ru/base/numbers_edit.html) на один из возможных вариантов решения задачи. Ее можно также усовершенствовать, использовав вместо "." константу DecimalSeparator.

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

detrin
20-10-2008, 23:22
В свое время часто пользовался вот таким кодом:

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




© OSzone.net 2001-2012