掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CreateしたMemoに書き込めない (ID:21907)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ScoreBoxの配列の宣言ってどうなっているんですか? コレ自体が怪しい気がする。 TListあたりを使ったほうが良いと思うんですが。 それもめんどくさいので、Componentsを使ってみよう。 どうせ動的につくるなら、継承しても問題ありませんよね。 TForm1.Components[]とComponentCountを使って TMemoから派生して、TScoreBoxMemoで識別できるようにして 利用してみよう。 interface 部 type //TForm1の上ぐらいに書く。 TScoreBoxMemo = class( TMemo) end; //(TMemoと全く同じように使えますが、 //TScoreBoxMemoというクラス名で識別できるようになります。 //もちろん派生なのでTMemoとしても識別できます。) TForm1 = class( TForm) //省略 protected function GetScoreBox( aTag: integer): TScoreBoxMemo; virtual; public property ScoreBox[index: integer]: TScoreBoxMemo read GetScoreBox; end; implementation 部 //のどこかのブロック(不明)。 //を配列を使わないように変更 for i:= 1 to nStudent do begin with TScoreBoxMemo.Create( Self) do begin Left := 232; top := i * 14; width := 250; //height 小さいと見えないかもしれません。 height:= 120; alignment:= taCenter; tag:= i; //Form1は内部からの呼び出しなら、Form1は不要かもしれない。 //あってもまあいい。TForm1のインスタンスが複数ある場合、 //特定の1つを指すようになるので注意が必要。 //Parent:= Form1.pnlClass; Parent:= pnlClass; //これが問題ということはありえないと思うんだけどなぁ。 Text:= 'AAAA'; end; //再構築などを自分で行わないのであれば //TScoreBoxMemoの開放は TForm1に、任せて OK。 //なので配列は基本的に不要。 end; procedure TForm1.Button1Click(Sender: TObject); begin ScoreBox[1].Text:='225'; // 1 という値が無効な場合、EAccessViolationが出ます。 //例外はそのまま放置し、バグ発見に役立てたほうがよいですよ。 end; function TForm1.GetScoreBox( aTag: integer): TScoreBoxMemo; var tmp: TComponent; begin Result:=nil; for i:=0 to ComponentCount-1 do begin tmp:= Components[i]; if tmp is TScoreBoxMemo then begin if tmp.Tag=aTag then begin Result:= tmp; Exit; end; end; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.