掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
コントロール動的生成時に同じポインタが割り当てられないようにするには? (ID:43897)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
単純なバグっぽい気がします・・・。 List に追加したコントロールは削除できていますか? 削除できて無ければ、たとえば for i:=0 to list.Count-1 do begin if Assigned(list) then begin みたいなコードは list[i] が解放済みでも ここを通ります。 end; end; list.Remove(MyControl) 等でMyControl.Freeと合わせて きちんと削除してやらなければなりません。 >※1と2はまったく違う種類のコントロール(例えば1がパネルで2がボタン)の場合でも発生してしまいます。 var ctr: TControl; begin if Assigned(ctr) then begin if ctr is TPanel then begin end else if ctr is TButton then begin end end end; のようにクラスで分岐可能です。 他に Tag プロパティが自由に使えるので識別にも使えます。 グローバルに var MyControlCount:integer=0 とでもしておいて ctr.Tag:= MyControlCount; inc( MyControlCount) と、作る度に増やしていけば Tag が被ることは無いでしょう。 Tag が被っていたり EAccessViolationとか出るようなら 実は開放されてないとか、開放されたけどリストから消えてなかったとか そういうことになりますね。 ctrl を常に動的に作ってるなら その ctrl を管理する親クラスを TPersisten や TList から派生して function TMyControls.Add: TControl; begin Result:= TMyControl.Create(nil) inherited Add(Result); end; のように追加とか削除とか書き換えとかをTMyControls以外から できないようにしてしまえばデバッグも楽かと思います。 規模にもよりますが・・・。 いろんなクラスのインスタンスを一括で監視するとか、煩雑になってしまいそうなら TListではだんだん対応しづらくなってくるしコードも毎回クラスチェックしたりとかしないと行けないと思うんで派生してしまったほうがいい気がします。 あとは、イベントハンドラに Sender: TObject があるなら、それを有効活用しましょう。 procedure TForm1.ControlClick(Sender:TObject) begin if not Assigned(Sender) then Exit; if Sender is TButton then begin TButton(Sender).Visible:=False; end else if Sender is TPanel then begin TPanel(Sender).Visible:= False; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.