ほとんどどしろうとで、長いこと悩んでいます。
フォームが同一の複数の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 です。
FindComponent() の返値は TComponent ですね。TStringGrid にキャスト
する必要があります。
StrGrid:= TStringGRid(FindComponent('DoutDlg.StringGrid'+Format('%d',[J])));
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 です。
> for J := 0 to Componennts.count - 1 do
これでは、StringGrid の「名前の番号」と J の値が一致しなくなって
元質問の J に依存する部分のインデックスが無意味になってしまいます。
やはり FindComponent() を使うべきです。
Halbowさん、HOotaさん、ありがとうございます。
Halbowさんに教えていただいた内容でやってみましたが、
StrGrid:= TStringGRid(FindComponent.....);のところで、TStringGridが”未定義の識別子”というエラーになってしまいました。
ちなみに、
var StrGrid: TStringGrid;
とすると上記同様に”未定義の識別子”というエラーがでます。
どのようにしたらよいのでしょうか?
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 に加えるのはもちろんです。
説明不足で申し訳ありません。DoutDlg はフォームダイアログの名前です。
教えていただいたとおり、usesにGrids を追加し、
StrGrid:= TStringGrid(DoutDlg.FindComponent('StringGrid'+....
に変更した結果、OKになりました。
ありがとうございました。
前のコードは以下のようにしてください。
for J := 0 to Form1.ComponentCount - 1 do
if Form1.Components[J] is TStringGrid then
with TStringGrid(Form1.Components[J]) do
ツイート | ![]() |