Почему когда я ввожу в 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
  1. Если кратко, то причина в том, что при вызове StrToInt() содержимое Hour.Text = '1 ' (содержит пробел). Соответственно, нужно или предварительно валидировать Hour.Text, или использовать функции TryStrToInt()/StrToIntDef()
  2. Сомневаюсь, что маска ## - это то, что Вам хотелось бы, т.к.

# only an optional number or + or -

Т.е. текст может содержать символы +/-. Скорее всего, более подходящей была бы маска 99

9 only an optional number

  1. Зачем Вы трижды используете StrToInt()? Достаточно единожды вызвать эту функцию, присвоив результат временной переменной.
  2. Если уж требуются раздельные поля для часов и минут, то почему бы не использовать TSpinEdit? В его свойствах можно задать минимальное и максимальное значения, тем самым избежав лишних проверок.
  3. На всякий случай. Поскольку речь о Lazarus, то в его наборе компонентов присутствует TTimeEdit
→ Ссылка