我更改代码。以下是程序中的结构Form1.BitBtn1Click(Sender: TObject):ComboBox1.ItemIndex, StringGrid1.Cells[0,0], Edit1.Text. 我想将此过程拆分为几个较小的过程,但是我收到一个错误,即edit1找不到元素,找不到元素combobox等等。我通过TObject了程序,但还是有错误。我需要做什么?可以传达其他信息吗?总的来说,为什么会发生这种情况,因为BitBtn1Click一切正常?
完整代码:是这样的:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,x:real;
j:integer;
begin
//проверка ввода
if (Edit1.Text='')or(Edit2.Text='')or(Edit3.Text='') then
MessageBox(Handle,'Enter all fields!','Error',MB_Ok+MB_ICONSTOP)
else if (ComboBox1.Text='') then
MessageBox(Handle,'Take parametr','Error',MB_Ok+MB_ICONSTOP);
//else if (StrToFloat(Edit1.Text)=StrToFloat(Edit2.Text)) then
//MessageBox(Handle,'a != b!','Error',MB_Ok+MB_ICONSTOP);
//проверка для вывода: грид или мемо
if (ComboBox1.ItemIndex=0) then begin
//вывод грида
i:=1;
StringGrid1.RowCount:=StrToInt(Edit3.Text)+2;
x:=(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/StrToFloat(Edit3.Text);
StringGrid1.Cells[0,0]:='№';
StringGrid1.Cells[1,0]:='x';
StringGrid1.Cells[2,0]:='Y1';
StringGrid1.Cells[3,0]:='Y2';
StringGrid1.Cells[4,0]:='Y3';
for j:= 1 to StrToInt(Edit3.Text)+2 do begin
StringGrid1.Cells[0,j]:=IntToStr(j);
StringGrid1.Cells[1,j]:=FloatToStr(i);
StringGrid1.Cells[2,j]:=Y1(i);
StringGrid1.Cells[3,j]:=Y2(i);
StringGrid1.Cells[4,j]:=Y3(i);
i:=i+x;
end;
end else if (ComboBox1.ItemIndex=1) then begin
//вывод мемо
i := 1;
x:=(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/StrToFloat(Edit3.Text);
Form2.Show();
Form2.Memo1.Lines[0]:=' № x y1 y2 y3 ';
for j:= 1 to StrToInt(Edit3.Text)+1 do begin
Form2.Memo1.Lines[j]:=FloatToStrf(j,ffFixed,6,2)+' '+FloatToStrf(i,ffFixed,6,2)+' '+Y1(i)+' '+Y2(i)+' '+Y3(i);
i:=i+x;
end; end; end;
我希望它是这样的:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
checkOnError(TObject);
fillArray(TObject);
end;
procedure checkOnError(Sender: TObject); begin
if (Edit1.Text='')or(Edit2.Text='')or(Edit3.Text='') then
MessageBox(Handle,'Enter all fields!','Error',MB_Ok+MB_ICONSTOP)
else if (ComboBox1.Text='') then
MessageBox(Handle,'Take parametr','Error',MB_Ok+MB_ICONSTOP)
else if (StrToFloat(Edit1.Text)=StrToFloat(Edit2.Text)) then
MessageBox(Handle,'a != b!','Error',MB_Ok+MB_ICONSTOP)
end;
procedure fillGrid(Sender: TObject);
var i,x:Real; j:ineteger;
begin
i:=1;
StringGrid1.RowCount:=StrToInt(Edit3.Text)+2;
x:=(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/StrToFloat(Edit3.Text);
StringGrid1.Cells[0,0]:='№'; // заполнить массив циклом через процедуру
StringGrid1.Cells[1,0]:='x'; //допереносить в функции
StringGrid1.Cells[2,0]:='Y1';
StringGrid1.Cells[3,0]:='Y2';
StringGrid1.Cells[4,0]:='Y3';
for j:= 1 to StrToInt(Edit3.Text)+2 do begin
StringGrid1.Cells[0,j]:=IntToStr(j); //тоже самое
StringGrid1.Cells[1,j]:=FloatToStr(i);
StringGrid1.Cells[2,j]:=Y1(i);
StringGrid1.Cells[3,j]:=Y2(i);
StringGrid1.Cells[4,j]:=Y3(i);
i:=i+x;
end;
end;
procedure fillMemo(Sender: TObject);
var i, x : real;
begin
i := 1;
x:=(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/StrToFloat(Edit3.Text);
Form2.Show();
Form2.Memo1.Lines[0]:=' № x y1 y2 y3 ';
for j:= 1 to StrToInt(Edit3.Text)+1 do begin
Form2.Memo1.Lines[j]:=FloatToStrf(j,ffFixed,6,2)+' '+FloatToStrf(i,ffFixed,6,2)+' '+Y1(i)+' '+Y2(i)+' '+Y3(i);
i:=i+x;
end;
end;
procedure fillArray(Sender: TObject); begin
if (ComboBox1.ItemIndex=0) then fillGrid(TObject);//проверка комбобокса для вывода через грид или мемо
else if (ComboBox1.ItemIndex=1) then fillMemo(TObject);
end;
请注意,您在使用表单时不只是编写一些函数。表单是具有属性和方法的 OOP 类。您可以从类中访问这些属性,或使用实例引用来访问公共属性。
由于您将新功能描述为单独的,而不是类的成员
TForm1,因此可以访问它Edit1等等。您无法获得的组件。在这种情况下,最好将这些方法添加到表单类中:
在这种情况下,您将可以访问班级成员
Edit1等。