掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TListBox の インデックスを知る方法について (ID:20964)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>こうなった場合にメンテナンスやデバッグで悩まされる原因にもなるため >できればこの方法を避けたいのです。 こうなると、TListBoxから派生したクラスを書かないと いけなさそうな気もしますが・・・。 挑戦してみました。 >クリック時に「アイテム変更処理」が行われるようにしたいのです。 TListBoxのアイテムと、それの付加的な情報が常に存在するわけですよね。 その付加的な情報を TObjectから派生したクラスにして、どなたかが 書かれた様にObjectsに追加すればよいです。 この場合、BackItemみたいなインデックスを保存しておく変数は いりません。 ただ、オブジェクトを作成するコードと破棄するコードを ListBoxのItemsの状態と同期を取って 書かねばら無いので、やはりソースが見にくくなったり、 バグがでたりといろいろ問題があるかと。 TListData= class( TObject) Data1: string; Data2: string; end; //挿入ボタンのクリック procedure TForm1.InsertButtonClick(Sender: TObject); var ListData: TListData; begin ListData:= TListData.Create; ListBox1.Items.AddObject('3333',ListData); end; procedure TForm1.ListBoxClick(Sender: TObject); begin // これは TListBox1.OnClickのハンドラ EditButtonClick(nil); end; //編集 procedure TForm1.EditButtonClick; var ListData: TListData; begin if ListBox1.ItemIndex<0 then Exit; if ListBox1.ItemIndex<ListBox1.Items.Count-1 do begin ListData:= ListBox1.Items.Objects( ListBox1.ItemIndex) as TListData; Edit1.Text:= ListData.Data1; Edit2.Text:= ListData.Data2; end; end; //削除 procedure TForm1.DeleteButtonClick; begin if ListBox1.ItemIndex<0 then Exit; if ListBox1.ItemIndex<ListBox1.Items.Count-1 do begin ListData:= ListBox1.Items.Objects( ListBox1.ItemIndex) as TListData; ListData.Free; ListBox1.Items.Delete( ListBox1.ItemIndex); end; end; //クリア procedure TForm1.ClearListBoxItems; begin if ListBox1.Items.Count>0 then for i:=ListBox1.Items.Count-1 downto 0 do begin (ListBox1.Objects[i] as TListData).Free; end; ListBox1.Items.Clear; end; こんな感じで常に、選択項目と付加的な情報の表示内容が 一致すると思います。 >この状態ですと、リストボックスのクリックだけの処理であれば >問題ないのですが、例えば、[削除][追加][挿入]などのボタンを >フォームに貼り付けて、リストの内容が変更された場合に >次に、このクリックイベントが発生されたときに >BackItem の中身と実際にクリック直前に選択されていたItemIndexの値とが >違うものになってしまいます。 は、これで回避できてると思います。(確認はしてませんが) まあ、結局のところ、igyさんが最後の1つ前に言ったことと同じかもしれない。 気もする。 やっぱり、派生 を避けては通れないと思います。 これを機に、学んでみてはどうでしょうか。 これまでの内容を TListBoxExで再実装(涙) TListBoxEx = class(TListBox) //自分で考えてください(汗) end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.