メインフォームにリストビューがあり、別の非モーダルフォームに追加できるようにしたいです。リストビューを非モーダルフォームに渡すにはどうすればよいですか? 変更できるようにしたいフォームは、ボタンをクリックすると、Form.Show だけで MainForm によって表示されます。
また、循環参照を避けるために、フォームでメインフォームを使用しないようにすることも明確にする必要があります。
メインフォームにリストビューがあり、別の非モーダルフォームに追加できるようにしたいです。リストビューを非モーダルフォームに渡すにはどうすればよいですか? 変更できるようにしたいフォームは、ボタンをクリックすると、Form.Show だけで MainForm によって表示されます。
また、循環参照を避けるために、フォームでメインフォームを使用しないようにすることも明確にする必要があります。
最も簡単で最良の方法は、受信フォーム(つまり、ListViewを含むフォーム)に「AddThingsToListView」というメソッドを追加し、追加したいもの(おそらくTListItem?)を受け入れるようにすることです。
そうすれば、電話をかけることができます
MyMainForm.AddThingsToListView(ANewListItem);
どこからでも。
つまり、リストビューを非モーダルフォームに渡さないでください。代わりに、メインフォームがリストビューへの追加を受け入れることができるようにします。
注:質問はもともと Delphi とタグ付けされていました。私は FPC/Lazarus を知らないので、以下の詳細の一部は正確ではないかもしれませんが、概念はまだ有効です。
MainForm
引数のために名前が付けられた、メインフォームを表すグローバル変数があると思います。最も迅速で簡単な方法はMainForm.ListView
、他のフォームがメイン フォームのリスト ビューを参照できるようにすることです。
他のフォームがメインフォームの実装に依存することを意味するため、私はこのアプローチにあまり熱心ではありません。
別の方法として、リスト ビューへの参照を他のフォームに渡すことができます。たとえばSetListView
、他のフォームにプロシージャを追加できます。
type
TMyOtherForm = class(TForm)
private
FListView: TListView;
public
procedure SetListView(Value: TListView);
end;
.....
procedure TMyOtherForm.SetListView(Value: TListView);
begin
FListView := Value;
end;
次に、メイン フォームで、おそらくメイン フォームのOnCreate
イベント ハンドラーで、次のメソッドを呼び出すことができます。
procedure TMainForm.FormCreate(Sender: TObject);
begin
MyOtherForm.SetListView(ListView);
end;
これは、最初の提案よりもはるかに優れているわけではありません。もう 1 つのフォームは、メイン フォームの実装に依然依存していますが、依存性はおそらくそれほど重要ではありません。
2 つのフォームの結合をさらに少なくしたい場合は、メイン フォームで、リストへの追加を受け入れるメソッドを公開できます。
procedure TMainForm.AddToList(const Name: sting; const Time: TDateTime);
var
Item: TListItem;
begin
Item := ListView.Items.Add;
Item.Caption := Name;
Item.SubItems.Add(DateTimeToStr(Time));
end;
他のフォーム ユニットでは、メイン フォーム ユニットを実装セクションの uses 句に追加します。これにより、MainForm
グローバル変数にアクセスでき、呼び出すことができます
MainForm.AddToList(Name, Time);
このアプローチは、メイン フォームがそのリストの実装を非公開に保つことができるため、私の見解では最善です。
uses
句による循環参照を避けたいとコメントで述べています。uses
上記のいずれも、問題の 2 つのユニットのインターフェイス セクションの節を変更する必要がないため、これは簡単に調整できます。
私がすること: この種の状況のために: 私は通常、データ モジュールを宣言し、非 GUI ライブラリ ユニットにうまく収まらないほとんどのコードをデータ モジュールに入れます。データ モジュールはフォームを参照でき、その逆も可能ですが、どのフォームも互いに参照しません。
この例では、Form2 は DataModule を使用でき、次のいずれかを実行できます。
いずれにせよ、フォームはデータ モジュールについてのみ知る必要があり、データ モジュールが残りの処理を行います。フォームの追加/削除/変更が可能で、通常は DM を更新するだけで済みます。