リストボックスに項目追加時にイベント取れます?

解決


さすらい初心者  2003-04-06 23:15:06  No: 3268  IP: [192.*.*.*]

Form1にあるリストボックスにForm2からAddメソッドでリスト追加します。
この時、Form1側でリスト項目が増えた事をイベントとして処理したい
ルーチンがあるのですが、こんなの可能でしょうか?。

ヘルプみてみましたが、どうもよく解からず。。。。。
御教授の程、よろしくお願い致します。

編集    削除
にしの  2003-04-07 04:07:32  No: 3269  IP: [192.*.*.*]

面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。
どうしてもイベントにしたいのであれば、TListboxを継承したクラスを作り、Addメソッドをオーバーライドして、たとえばOnAddイベントなどを呼び出すようにすればOKです。

編集    削除
さすらい初心者  2003-04-07 15:12:56  No: 3270  IP: [192.*.*.*]

やはり、自作しないとダメでしたか。。

>面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。

↑こちらのほうが面倒でないので、この方法でいきます。
ありがとうございました。

編集    削除
かっぱの花道  2003-04-07 16:34:14  No: 3271  IP: [192.*.*.*]

「かごッパ」 StringListを使えば、OnChangeイベントがあるッパ♪
「みかッパ」 でも、StringListじゃ見えないッパよ。
「かごッパ」 StringListに Addした後で、それを ListBox.Itemsに AssignすればOKッパ♪
「つじッパ」 お〜ナットクでケロ…
「らぶッパ」 あの〜 Assignだと文字列全部がコピーされるンで、代入の方が良いッパでは?♪

  SList := TStringList.Create;
  SList.OnChange := SListChange;
  ListBox1.Items := SList;

「みかッパ」 あれ?これじゃ、SListに Addしても、ListBox1の方には何も表示されないッパよ。
「らぶッパ」 OnChangeイベントで、ListBox1を Refreshするッパです〜♪

procedure TForm1.SListChange(Sender: TObject);
begin
  ListBox1.Refresh;
end;

「つじッパ」 お〜ナルホドでケロ… ん?ところで、あんたダレ?
「らぶッパ」 どもー!新入りで〜す。 こちらもRefreshです〜♪

編集    削除
さすらい初心者  2003-04-07 18:15:13  No: 3272  IP: [192.*.*.*]

かっぱの花道さん。ありがとうございます。
さっそく試してみます。

編集    削除
にしの  2003-04-07 20:41:10  No: 3273  IP: [192.*.*.*]

TListBoxのItemsプロパティのwriteには、SetItemsプロシージャが設定されています。
これは、
procedure TCustomListBox.SetItems(Value: TStrings);
begin
  Items.Assign(Value);
end;
となっているので、

ListBox1.Items := SList;
は、
ListBox1.Items.Assign(SList);
と同じになり、結果 SList.OnChangeは呼ばれません。

編集    削除
hatena  2003-04-07 22:34:52  No: 3274  IP: [192.*.*.*]

仮想リストボックスにするという手法もありますね。

TListBox の Styleプロパティを lbVirtual にして、
OnDateイベントで、TStringList とリンクさせます。


procedure TForm1.SListChange(Sender: TObject);
begin
  if ListBox1.Count < SList.Count then
  begin
    //追加されたときの処理
  end;
  ListBox1.Count := SList.Count;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SList := TStringList.Create;
  SList.OnChange := SListChange;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SList.Free;
end;

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
  var Data: String);
begin
  Data := SList[Index];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SList.Add('Text')
end;

編集    削除
さすらい初心者  2003-04-09 17:35:18  No: 3275  IP: [192.*.*.*]

hatenaさん。ありがとうございます。
あれこれ試してみましたが、、
やはりコードが煩雑になるし、私のレベルを超えてしまうので(^^;

>面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。

↑これにしました。
でも、教えてもらったコードはなかなか興味深く、コツコツ勉強して使える
ようになりたいです。
ありがとうございました。

編集    削除