1

このようなものを変更する可能性はありますか?

myfunction(1,1,strtoint(form1.a11.text));
myfunction(1,2,strtoint(form1.a12.text));
myfunction(1,3,strtoint(form1.a13.text));
myfunction(1,4,strtoint(form1.a14.text));
myfunction(1,5,strtoint(form1.a15.text));
myfunction(1,6,strtoint(form1.a16.text));
myfunction(1,7,strtoint(form1.a17.text));
myfunction(1,8,strtoint(form1.a18.text));
myfunction(1,9,strtoint(form1.a19.text));

このようなものに?:

   for i:=1 to 9 do
      myfunction(1,i,strtoint(form1.'a1'+i.text));

私はこれがうまくいかないことを知っていますが、私はそれをより速くする方法を見つけたいと思っています。似たようなもの

4

1 に答える 1

7

を使用FindComponentして、コンポーネントを名前で検索できます。これは、コンポーネントがフォームオブジェクトによって所有されていることを前提としています。それが有効な仮定である可能性が高いです。

(form1.FindComponent('a1'+IntToStr(i)) as TEdit).Text

個人的には、この種のコードは好きではありません。編集コントロールの配列を作成します。

type
  TForm1 = class
  ....
  private
    FEditArr: array [1..9] of TEdit;
  ....

次に、コンストラクターで配列を初期化します。

FEditArr[1] := a11;
FEditArr[2] := a12;
....

これにより、インデックスが与えられた後に編集コントロールを取得するコードがはるかにクリーンになります。

このルートをたどると、デザイナーですべてを作成してからコンストラクターでその配列割り当てコードを作成するよりも、実行時に編集コントロールを作成する方が簡単な場合があります。概観するとこんな感じ。

for i := 1 to 9 do
begin
  FEditArr[i] := TEdit.Create(Self);
  FEditArr[i].Parent := Self;
  FEditArr[i].Left := ...;
  FEditArr[i].Top := ...;
end;
于 2013-03-02T15:58:39.937 に答える