Form1にあるリストボックスにForm2からAddメソッドでリスト追加します。
この時、Form1側でリスト項目が増えた事をイベントとして処理したい
ルーチンがあるのですが、こんなの可能でしょうか?。
ヘルプみてみましたが、どうもよく解からず。。。。。
御教授の程、よろしくお願い致します。
面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。
どうしてもイベントにしたいのであれば、TListboxを継承したクラスを作り、Addメソッドをオーバーライドして、たとえばOnAddイベントなどを呼び出すようにすればOKです。
やはり、自作しないとダメでしたか。。
>面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。
↑こちらのほうが面倒でないので、この方法でいきます。
ありがとうございました。
「かごッパ」 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です〜♪
かっぱの花道さん。ありがとうございます。
さっそく試してみます。
TListBoxのItemsプロパティのwriteには、SetItemsプロシージャが設定されています。
これは、
procedure TCustomListBox.SetItems(Value: TStrings);
begin
Items.Assign(Value);
end;
となっているので、
ListBox1.Items := SList;
は、
ListBox1.Items.Assign(SList);
と同じになり、結果 SList.OnChangeは呼ばれません。
仮想リストボックスにするという手法もありますね。
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;
hatenaさん。ありがとうございます。
あれこれ試してみましたが、、
やはりコードが煩雑になるし、私のレベルを超えてしまうので(^^;
>面倒でなければ、Addの後にその関数を呼び出すようにした方がよいです。
↑これにしました。
でも、教えてもらったコードはなかなか興味深く、コツコツ勉強して使える
ようになりたいです。
ありがとうございました。
ツイート | ![]() |