如何读取和更改 TEdit 控件的值?

6

我有一个表单TForm1,其中包含5个TEdit和2个TBitBtn

我还需要一个程序,在BitBtn1Click后,在Edit1Edit2中输入数字数据后,将对Edit1Edit2的值求和,并显示在Edit3中。


3
你的问题里已经包含了你的名字,所以不需要再告诉我们。另外,我在delphi-xe2标签之外,添加了一个通用的Delphi标签,这样可以让更多潜在的回答者看到你的问题。最后,请不要在问题中放置下载链接,我们不想下载东西。请将代码放在问题中并进行格式化。 - David Heffernan
3个回答

5
您想要做类似以下这样的事情:
var
  val1, val2, sum: Integer;
...
val1 := StrToInt(Edit1.Text);
val2 := StrToInt(Edit2.Text);
sum := val1 + val2;
Edit3.Text := IntToStr(sum);

如果你想进行浮点运算,请按照以下方式操作。
var
  val1, val2, sum: Double;
...
val1 := StrToFloat(Edit1.Text);
val2 := StrToFloat(Edit2.Text);
sum := val1 + val2;
Edit3.Text := FloatToStr(sum);

4

要读取和设置TEdit控件的值,只需引用控件的Text属性。Text属性的类型为String。

由于Text是一个String属性,您可以在代码中将其视为String变量。您可以将它传递到一个需要String常量的函数中:

// Edit1 is the name of the TEdit control
// Display the value in the edit control to the user
ShowMessage(Edit1.Text);

你可以通过简单的赋值将其分配给字符串变量:
var
  // My string variable
  myString: String;
begin
  // Edit1 is the Name of the control
  myString := Edit1.Text;
end;

要设置TEdit控件的值,只需要将一个字符串赋值给Text属性即可。这可以是一个字符串常量:

Edit1.Text := 'hello';

或者它可以来自一个字符串变量:

Edit1.Text := myString;

数学运算是在数字类型上进行的,因此进行算术运算时,需要使用函数将字符串值转换为数字。

对于整数算术运算,可以使用StrToInt()StrToIntDef()

var
  myInteger: Integer;
begin
  // Convert Edit1.Text string to a number and assign to numeric type for math
  // If the value in Edit1.Text cannot be converted, an exception will be raised
  myInteger := StrToInt(Edit1.Text);
end;

使用StrToIntDef()函数:
var
  myInteger: Integer;
begin
  // If Edit1.Text cannot be converted, the default value of 0 will be used
  myInteger := StrToIntDef(Edit1.Text, 0);
end;

对于浮点数算术运算,请使用StrToFloat()StrToFloatDef()

如果要将整数赋值回文本属性,则需要在分配之前将整数转换为字符串:

var
  myInteger: Integer;
begin
  myInteger := 12;
  Edit1.Text := IntToStr(myInteger);
end;

对于浮点数,请使用FloatToStr()

最后,将两个编辑框中的数值相加并在第三个编辑框中显示结果,只需执行以下操作:

var
  // Floating point variables
  value1: Real;
  value2: Real;
  sum: Real;
begin
  // Get the values from the edit boxes, converting them to floating point types
  value1 := StrToFloat(Edit1.Text);
  value2 := StrToFloat(Edit2.Text);
  // Sum them
  sum := value1 + value2;
  // Convert the sum to string and assign back to edit box
  Edit3.Text := FloatToStr(sum);
end;

或者一步到位:

Edit3.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text));

你忘记加入try..except语句来检查非数字输入了。 - Johan
1
@Johan,这是有意为之的,虽然我已经警告过可能会出现异常情况。保持简单。 - Marcus Adams

4
我注意到以下片段:

因此,在Edit1和Edit2中输入数字数据后

如果您只想允许数字数据,最好禁止编辑框中的非数字数据。
以下是如何实现这一点。
const
 TabKey = #9;
 Backspace = #8;
 Enter = #13;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9','-',TabKey,Enter,Backspace]) then Key:= #0; //integers
  //realnumbers: if not (Key in ['0'..'9','-','e','E','.',TabKey,Enter,Backspace]) then Key:= #0;
end;

如果您只有整数数据,这将可以解决问题。如果您有科学计数法的数字,则还需要测试字母e和小数点,以允许无理数的存在。
不管您做什么,检查输入是否为有效数字并让用户知道是一个好主意。
procedure TForm1.Edit1Change(Sender: TObject);
var
  MyEdit: TEdit;
  OtherEdit: TEdit;
  TryNumber: double; 
  OtherNumber: double; 
  Success: boolean;
begin
  Success:= true;
  if (Sender is TEdit) then begin
    MyEdit:= TEdit(Sender);
    try
      if MyEdit.Text = '' then TryNumber:= 0
      else TryNumber:= StrToFloat(MyEdit.Text);
      MyEdit.Color:= clWindow; //all is OK make edit standard white.
      MyEdit.Hint:= '';
    except  
      MyEdit.Color:= clRed;  //Let the user know the output will not compute.
      MyEdit.Hint:= MyEdit.Text + ' is not a valid number '; 
      Success:= false;
    end; 
  end;
  if (MyEdit = Edit1) then OtherEdit:= Edit2
  else OtherEdit:= Edit1;
  try
    if OtherText.Text = '' then OtherNumber:= 0
    else OtherNumber:= StrToFloat(OtherEdit.Text);
  except 
    Success:= false;
  end;
  if Success then Edit3.Text:= FloatToStr(TryNumber + OtherNumber); 
end;

请注意,您可以将此Event附加到Edit1Edit2,因此您不必写两次代码。(但我相信您已经知道了这一点)。
(两个edit共享同一个event)
需要记住的重要事项:
  • 始终使用try..except来捕获错误,以便您的程序不会因错误而中断,参见:http://www.delphibasics.co.uk/Article.asp?Name=Exceptions
  • 如果您有一个仅允许数字数据的编辑框,请考虑使用仅允许有效字符的maskedit,或编写自己的筛选器(如果很容易做)。
  • 尝试使用单个例程处理多个控件,这样您就不会得到多个非常相似的例程,它们几乎都做同样的事情。这样,如果您更改了某些内容,您只需在一个地方进行更改,它将适用于使用该例程的所有控件。

我喜欢颜色的处理方式。通常我通过 OnKeyDown 阻止它们甚至进入非数字字符,这有点严厉。 - Marcus Adams
@MarcusAdams,我也在数字字段中使用“无字母”,但这并不能防止用户在专为纯整数数据设计的字段中输入1254-121-1512 - Johan
可能会变得复杂。我也经常使用 TSpinEdit。 - Marcus Adams
1
或者你可以使用TryStrToFloat,这样就可以省略try..except的处理机制了 ;) - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接