Почему когда я ввожу в Hour.Text цифру к примеру 1 мне пишет что 1 is an invalid integer?
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
MaskEdit;
type
{ TForm1 }
TForm1 = class(TForm)
MinLable: TLabel;
HourLabel: TLabel;
IntervalLabel: TLabel;
Hour: TMaskEdit;
Min: TMaskEdit;
Interval: TMaskEdit;
ResultButton: TButton;
Result: TLabeledEdit;
procedure HourChange(Sender: TObject);
procedure IntervalChange(Sender: TObject);
procedure MinChange(Sender: TObject);
procedure ResultButtonClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
strthour, strtmin, intervalinmin, endhour, endmin:integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.HourChange(Sender: TObject);
begin
if (StrToInt(Hour.Text) >= 0) and (StrToInt(Hour.Text) <= 23) then
strthour:= StrToInt(Hour.Text);
end;
procedure TForm1.MinChange(Sender: TObject);
begin
if (StrToInt(Min.Text) >= 0) and (StrToInt(Min.Text) <= 59) then
strtmin:= StrToInt(Min.Text);
end;
procedure TForm1.IntervalChange(Sender: TObject);
begin
intervalinmin:=StrToInt(Interval.Text)
end;
procedure TForm1.ResultButtonClick(Sender: TObject);
begin
endmin:= strthour * 60 + strtmin + intervalinmin;
endhour:= endmin div 60;
endmin:= endmin mod 60;
Result.Text:= IntToStr(endhour div 10) + IntToStr(endhour mod 10) + ':' + IntToStr(endmin div 10) + IntToStr(endmin mod 10);
end;
end.
procedure TForm1.HourChange(Sender: TObject);
begin
if (StrToInt(Hour.Text) >= 0) and (StrToInt(Hour.Text) <= 23) then
strthour:= StrToInt(Hour.Text);
end;
Почему когда я ввожу в Hour.Text цифру к примеру 1 мне пишет что 1 is an invalid integer ? Это же целое число ? Если что у меня MaskEdit и в шаблоне стоит ##
РЕШЕНИЕ:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
MaskEdit, Spin;
type
{ TForm1 }
TForm1 = class(TForm)
MinLab: TLabel;
IntervalLab: TLabel;
HourLab: TLabel;
ResultButton: TButton;
Result: TLabeledEdit;
Hour: TSpinEdit;
Min: TSpinEdit;
Interval: TSpinEdit;
procedure HourChange(Sender: TObject);
procedure IntervalChange(Sender: TObject);
procedure MinChange(Sender: TObject);
procedure ResultButtonClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
nachhour, nachmin, intervalinmin, endhour, endmin:integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.HourChange(Sender: TObject);
begin
TryStrToInt(Hour.Text, nachhour);
end;
procedure TForm1.MinChange(Sender: TObject);
begin
TryStrToInt(Min.Text, nachmin);
end;
procedure TForm1.IntervalChange(Sender: TObject);
begin
TryStrToInt(Interval.Text, intervalinmin);
end;
procedure TForm1.ResultButtonClick(Sender: TObject);
begin
endmin:= nachhour * 60 + nachmin + intervalinmin;
endhour:= endmin div 60;
endmin:= endmin mod 60;
Result.Text:= IntToStr(endhour div 10) + IntToStr(endhour mod 10) + ':' + IntToStr(endmin div 10) + IntToStr(endmin mod 10);
end;
end.
Ответы (1 шт):
Автор решения: Old Skull
→ Ссылка
- Если кратко, то причина в том, что при вызове
StrToInt()содержимоеHour.Text = '1 '(содержит пробел). Соответственно, нужно или предварительно валидироватьHour.Text, или использовать функцииTryStrToInt()/StrToIntDef() - Сомневаюсь, что маска
##- это то, что Вам хотелось бы, т.к.
# only an optional number or + or -
Т.е. текст может содержать символы +/-. Скорее всего, более подходящей была бы маска 99
9 only an optional number
- Зачем Вы трижды используете
StrToInt()? Достаточно единожды вызвать эту функцию, присвоив результат временной переменной. - Если уж требуются раздельные поля для часов и минут, то почему бы не использовать
TSpinEdit? В его свойствах можно задать минимальное и максимальное значения, тем самым избежав лишних проверок. - На всякий случай. Поскольку речь о Lazarus, то в его наборе компонентов присутствует
TTimeEdit