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

解決


さすらい初心者  2003-04-06 23:15:06  No: 3268

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

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


にしの  2003-04-07 04:07:32  No: 3269

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


さすらい初心者  2003-04-07 15:12:56  No: 3270

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

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

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


かっぱの花道  2003-04-07 16:34:14  No: 3271

「かごッパ」 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

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


にしの  2003-04-07 20:41:10  No: 3273

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

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

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加