-
Delphi подскажите...
ребят помогите, суть в том, что нужно для Edit'ов сделать проверку, не ввели ли случайно символы вместо цифр, причем только с помощью Val(таково требование препода). Как ни пробовал не получается.
[QUOTE]procedure TForm1.N8Click(Sender: TObject);
const a=0.44;
b=2.28;
var x,l,x1,x2,d:real;
y:real;
f:textfile;
s1,:string;
begin
If Edit1.Text <> '' then x1:=strtofloat(Edit1.Text);
if Edit2.Text <> '' then x2:=strtofloat(Edit2.Text);
if Edit3.Text <> '' then d:=strtofloat(Edit3.Text)
else
l:=messagedlg('ошибка',mterror,[mbOk],0);
x:=x1;
while x<=x2 do
if checkbox2.Checked then begin assignfile(f,'text.txt');
rewrite(f);end;
s1:=' x'+' '+'f(x)';
memo1.Lines.Add(' x'+' '+'f(x)');
begin
begin
y:=a*sqr(sin(x/2)/cos(x/2))/(b+0.7*x);
s1:=floattostr(x)+' '+floattostrf(y,fffixed,10,5);
if CheckBox1.checked then
memo1.LineS.add(s1);
if checkbox2.checked then
writeln(f,s1);
if checkbox3.checked then
series1.addxy(x,y,'',clred);
end;
x:=x+d;
end;
end;[/QUOTE]
-
-
Ну так в чем проблема?
пишем что-то типа
procedure checkfortext(inv:string);
var
retcod, retval: integer
begin
val(inv,retval, retcod);
if retcod<>0 then
messagedlg('ошибка',mterror,[mbOk],0);
end;
-
маленькая поправка, проверку нужно сделать через цикл repeat until.
-
сделал так,проверку выполняет, делает проверку, если некорректный ввод, выводит сообщение о ошибке, и на этом и останавливается, как сделать чтоб после этого прога возвращалась к началу?
[QUOTE]procedure TForm1.N8Click(Sender: TObject);
const a=0.44;
b=2.28;
var x,x1,x2,d:real;
y:real;
c1,c2,c3:integer;
f:textfile;
s1:string;
begin
repeat
val(edit1.Text,x1,c1);
val(edit2.Text,x2,c2);
val(edit3.Text,d,c3);
if c1<>0 then
if c2<>0 then
if c3<>0 then
messagedlg('ошибка',mterror,[mbOk],0);
until (c1=0) and (c2=0) and (c3=0);
x:=x1;
if checkbox2.Checked then
begin assignfile(f,'text.txt');
rewrite(f);
end;
s1:=' x'+' '+'f(x)';
memo1.Lines.Add(' x'+' '+'f(x)');
while x<=x2 do
begin
if (x>0) and (x<>1) then
begin
y:=a*sqr(sin(x/2)/cos(x/2))/(b+0.7*x);
s1:=floattostr(x)+' '+floattostrf(y,fffixed,10,5);
if CheckBox1.checked then
memo1.LineS.add(s1);
if checkbox2.checked then
writeln(f,s1);
if checkbox3.checked then
series1.addxy(x,y,'',clred);
end;
x:=x+d;
end;
end;[/QUOTE]
-
для того чтобы выходило из процедуры, используй оператор [B]exit[/B] или [B]break.[/B]
а чтоб куда то перейти, можно использовать [B]goto,[/B] только не помню синтаксис.
-
exit, break, а тем более goto - это дурной тон в программировании, если вы не на бейсике пишете.
если честно, требования препода мягко говоря - умиляет. Странные они. Вообще проверка ввода в TEdit пишется в событии OnKeyPress этого контрола. и выглядит она так
[CODE]procedure TForm.EditKeyPress(Sender: TObject; var Key: Char);
begin
Case Key of
'0'..'9':begin end; // разрешенные символы, ничего не делаем
#8:begin end; //код кнопки ТАВ
'A'..'F':Begin end; // это ввод шестнадцатиричных чисел
'a'..'f':begin Key:=chr(ord(Key)-32); end; // перевод маленьких HEX в большие
#13:
begin
(FindNextControl(Sender as TEdit,True,True,False)).SetFocus; // завершение ввода по нажатию Enter --> переход на следующий по порядку TabOrder контрол
Key:=#0; // и глушим отображение Enter в TEdit
end;
else
Key:=#0; //иначе глушим любой неправильный символ
end;
end;[/CODE]
вот так вот.. просто и достаточно изящно.
-
[QUOTE=fatman;2069569]exit, break, а тем более goto - это дурной тон в программировании, если вы не на бейсике пишете.[/QUOTE]
Позволю себе не согласится. Если goto, без крайней необходимости (и такое бывает, хоть и не приходилось) лучше не использовать, но вот break continue и еxit, вполне себе нормальные конструкции и зачастую улучшают читаемость.
А по поводу приведенного кода, помоему там не хватает backspace, и delete...
-
backspace и delete - не являются символьными клавишами. Они обрабатыватся хуком по двусимвольным скан-кодам и не дают отображаемых символов в TEdit. А значит - не требуют обработки.
Еще раз по поводу безусловных прерываний кода - это "индийский код"
если вы не можете сделать рефакторинг кода так, чтобы обойтись без них - значит изначально неверно были построены условия.
ИМХО
-
Если имеешь ввиду goto то согласен, однако не всегда есть возможность этого рефакторинга и тогда бывает что с goto код более акуратен чем без.
А по поводу того что [QUOTE]backspace и delete - не являются символьными клавишами. Они обрабатыватся хуком по двусимвольным скан-кодам и не дают отображаемых символов в TEdit. А значит - не требуют обработки.[/QUOTE]
Ты не прав, и очень даже обробатывается и вслучае замены кода нифига не работают, я только что специально проверил.
P.S. вернее бэкспэйс обробатывается а delete нет.
-
onChange
может onChange сработает лучше?
если новое значение ок, созраняем в глоб. переменную
иначе восстанавливаем значение Edit'а из глобальной переменной
<ctrl>+<C> && <ctrl>+<V> к тому же никто не отменял
-
[QUOTE]'0'..'9':begin end;[/QUOTE]
Можно просто
'0'..'9':;
:)