2

メインフォームにリストビューがあり、別の非モーダルフォームに追加できるようにしたいです。リストビューを非モーダルフォームに渡すにはどうすればよいですか? 変更できるようにしたいフォームは、ボタンをクリックすると、Form.Show だけで MainForm によって表示されます。

また、循環参照を避けるために、フォームでメインフォームを使用しないようにすることも明確にする必要があります。

4

3 に答える 3

2

最も簡単で最良の方法は、受信フォーム(つまり、ListViewを含むフォーム)に「AddThingsToListView」というメソッドを追加し、追加したいもの(おそらくTListItem?)を受け入れるようにすることです。

そうすれば、電話をかけることができます

MyMainForm.AddThingsToListView(ANewListItem);

どこからでも。

つまり、リストビューを非モーダルフォームに渡さないでください。代わりに、メインフォームがリストビューへの追加を受け入れることができるようにします。

于 2012-04-10T19:24:57.833 に答える
2

注:質問はもともと 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 つのユニットのインターフェイス セクションの節を変更する必要がないため、これは簡単に調整できます。

于 2012-04-10T19:21:06.680 に答える
0

私がすること: この種の状況のた​​めに: 私は通常、データ モジュールを宣言し、非 GUI ライブラリ ユニットにうまく収まらないほとんどのコードをデータ モジュールに入れます。データ モジュールはフォームを参照でき、その逆も可能ですが、どのフォームも互いに参照しません。

この例では、Form2 は DataModule を使用でき、次のいずれかを実行できます。

  1. データモジュールで MainForm の ListView へのグローバル参照を作成し、それをフォームから使用します。
  2. リストを更新できるデータモジュールに関数/クラスを用意し、フォームからそれを呼び出します。

いずれにせよ、フォームはデータ モジュールについてのみ知る必要があり、データ モジュールが残りの処理を行います。フォームの追加/削除/変更が可能で、通常は DM を更新するだけで済みます。

于 2012-08-13T02:22:28.633 に答える