for文とwith文を使って複数のStringGridに値を書き込むには

解決


まっちゃん  2003-09-17 20:16:11  No: 4866

ほとんどどしろうとで、長いこと悩んでいます。
フォームが同一の複数のStringGrid(9ヶ)にfor文とwith文を使ってデータを書き込みたいため、with文に変数を割り当てようとしていますが、withの次の文(Cells[0,0]:= '';でCellsが'定義されていない'というエラーが出ます。どうしたらよいか教えて下さい。
現在のロジックは以下の通りです。
 for J:=1 to 9 do begin
     StrGrid:= FindComponent('DoutDlg.StringGrid'+Format('%d',[J]));
     With StrGrid do begin
          Cells[ 0,0]:= '';
          Cells[ 1,0]:= '展開角(deg)';
          Cells[ 2,0]:= 'R(負)(mm)';
          Cells[ 3,0]:= 'Z(負)(mm)';
          for i:=1 to GNTH3[J] do begin
              Cells[ 0,i]:= IntToStr(i);
              Cells[ 1,i]:= FloatToStr(TH[J,i]*DEG);
              Cells[ 2,i]:= FloatToStr(RL[J,i]);
              Cells[ 3,i]:= FloatToStr(ZL[J,i]);
          end;
     end;
 end;


Halbow  URL  2003-09-17 20:39:56  No: 4867

Halbow です。

FindComponent() の返値は TComponent ですね。TStringGrid にキャスト
する必要があります。

StrGrid:= TStringGRid(FindComponent('DoutDlg.StringGrid'+Format('%d',[J])));


HOota  2003-09-17 20:51:49  No: 4868

StrGridが見つかっていないのでしょう。これは、'DoutDlg.StringGrid'+Format('%d',[J])という名前のコンポーネントを探します。

for J := 0 to Componennts.count - 1 do
  if Componennts(J) is TStringGrid then
    with TStringGrid(Componennts(J)) do

としたらいかがでしょうか?


Halbow  URL  2003-09-17 21:06:38  No: 4869

Halbow です。

> for J := 0 to Componennts.count - 1 do

これでは、StringGrid の「名前の番号」と J の値が一致しなくなって
元質問の J に依存する部分のインデックスが無意味になってしまいます。
やはり FindComponent() を使うべきです。


まっちゃん  2003-09-17 22:26:53  No: 4870

Halbowさん、HOotaさん、ありがとうございます。
Halbowさんに教えていただいた内容でやってみましたが、
StrGrid:= TStringGRid(FindComponent.....);のところで、TStringGridが”未定義の識別子”というエラーになってしまいました。
ちなみに、
  var StrGrid: TStringGrid;
とすると上記同様に”未定義の識別子”というエラーがでます。
どのようにしたらよいのでしょうか?


Halbow  2003-09-17 22:54:03  No: 4871

Halbow です。

>  var StrGrid: TStringGrid;
>とすると上記同様に”未定義の識別子”というエラーがでます。

なにか根本的な勘違いがありそうです。上記のエラーは  uses に
Grids を追加するとよいです。
問題は FindComponent() ですが、これは TComponent クラスの
メソッドです。自分が所有している TComponent の中から文字列で
指定された名前の TComponent を返します。普通は Form1 などの
イベントハンドラで使われるので、そのフォームの上にのっかって
いるコンポーネントの中から見つけてきます。他のフォームの上の
コンポーネントはそのフォームの FindComponent を使わなくては
なりません。

> FindComponent('DoutDlg.StringGrid'+Format('%d',[J]))

これの 'DoutDlg.StringGrid' というのは変な名前ですね。もしか
して DoutDlg というフォーム上のコンポーネントなのではないで
しょうか?だとすると

> StrGrid:= TStringGrid(FindComponent('DoutDlg.StringGrid'+Format('%d',[J])));

ではなく、

StrGrid:= TStringGrid(DoutDlg.FindComponent('StringGrid'+Format('%d',[J])));

となります。DoutDlg を実装しているユニットを uses に加えるのはもちろんです。


まっちゃん  2003-09-17 23:20:48  No: 4872

説明不足で申し訳ありません。DoutDlg はフォームダイアログの名前です。
教えていただいたとおり、usesにGrids を追加し、
  StrGrid:= TStringGrid(DoutDlg.FindComponent('StringGrid'+....
に変更した結果、OKになりました。
ありがとうございました。


HOota  2003-09-18 18:48:39  No: 4873

前のコードは以下のようにしてください。

  for J := 0 to Form1.ComponentCount - 1 do
    if Form1.Components[J] is TStringGrid then
      with TStringGrid(Form1.Components[J]) do


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加