我的表单上有几个TEdit框。数据绑定到每个范围具有相同的最小值和最大值但具有多个范围的硬件。如果用户通过在TEdit框中键入任何范围来更新最大值,则我要更新相应的min框以及一个保存最大乘以另一个值的乘积的TEdit框,依此类推。由于所有TEdit框都具有相似的值名称,我想知道是否可以仅将区别字符串传递给通用过程并构造特定的TEdit框的名称以在其中进行更改。在运行时,我收到“模块'MyProject.exe'中地址0074CB11的访问冲突。读取地址8BD88B77。”任何意见,将不胜感激。

procedure TForm1.R1IMaxEditChange(Sender: TObject);
//User types a new Range 1 Maximum I value
begin
  UpdateIMin_Power('R1')
end;


procedure TForm1.UpdateIMin_Power(Range: string);
var
  R_IMax, R_IMin, R_Power, R_Volts: TEdit;
begin
  //Assign variable names to TEdit boxes already on form.
  R_IMax.Name := Range + 'IMaxEdit';  //'R1IMaxEdit' when called by R1IMaxEditChange
  R_Volts.Name := Range + 'VoltsEdit';
  R_IMin.Name := Range + 'IMinEdit';
  R_IPower.Name := Range + 'IPowerEdit';

  //IMax already manually entered by user in R1IMaxEdit; Volts already on form
  R_IMin.Text := R_IMax.Text;  //Let IMin = IMax
  R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage
end;

最佳答案

您有四个变量R_IMaxR_IMinR_PowerR_Volts。您没有初始化这些变量,但是随后尝试使用它们的方法和属性。那是一个错误。

您必须先分配对象引用,然后再使用它们。您需要这样的代码:

R_IMax := GetEditReferenceFromSomewhere(Range + 'IMaxEdit');


显然,您需要实现GetEditReferenceFromSomewhere。我个人将四个编辑控件作为参数传递给方法:

procedure TForm1.UpdateIMin_Power(R_IMax, R_IMin, R_Power, R_Volts: TEdit);
begin
  //IMax already manually entered by user in R1IMaxEdit; Volts already on form
  R_IMin.Text := R_IMax.Text;  //Let IMin = IMax
  R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage
end;


如果要将这些控件视为一个组,则创建一个记录类型来保存它们:

type
  TEditControlGroup = record
    R_IMax: TEdit;
    R_IMin: TEdit;
    R_Power: TEdit;
    R_Volts: TEdit;
  end;


创建表单时声明并填充一堆这些记录,然后将它们传递给现在看起来像这样的方法:

procedure TForm1.UpdateIMin_Power(const Controls: TEditControlGroup);
begin
  //IMax already manually entered by user in R1IMaxEdit; Volts already on form
  Controls.R_IMin.Text := Controls.R_IMax.Text;  //Let IMin = IMax
  Controls.R_Power.Text := FloatToStr(StrToFloat(Controls.R_IMax.Text) * StrToFloat(Controls.R_Volts.Text)); //Power = Imax * Voltage
end;


如果您只是急于使用控件名称,则可以使用FindComponent,但是我不愿意建议这样做。

procedure TForm1.UpdateIMin_Power(const Range: string);
var
  R_IMax, R_IMin, R_Power, R_Volts: TEdit;
begin
  //Assign variable names to TEdit boxes already on form.
  R_IMax := FindComponent(Range + 'IMaxEdit');  //'R1IMaxEdit' when called by R1IMaxEditChange
  R_Volts := FindComponent(Range + 'VoltsEdit');
  R_IMin := FindComponent(Range + 'IMinEdit');
  R_IPower := FindComponent(Range + 'IPowerEdit');

  //IMax already manually entered by user in R1IMaxEdit; Volts already on form
  R_IMin.Text := R_IMax.Text;  //Let IMin = IMax
  R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage
end;

关于delphi - 使用TEdit作为变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21712322/

10-10 13:43