我的表单上有几个TEdit框。数据与每个范围具有相同最小值和最大值但具有相同范围的硬件相关联。如果用户通过在TEdit框中键入来更新任何范围的最大值,我想更新相应的min框以及一个TEdit框,其中包含max乘以另一个值的乘积等。因为所有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;
答案 0 :(得分:1)
您有四个变量R_IMax
,R_IMin
,R_Power
,R_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;