0

詳細については本文を編集してください。

EnpView ユニットで定義された ENP というフォームがあります。ENP フォームは、メイン フォーム (TPrincipal) のツールバー項目をクリックしたハンドラー イベントから作成および表示されます。

procedure TPrincipal.ENP1Click(Sender: TObject);
begin
  TENP.Create(self).Show();
end;

Enp フォームは (パブリック宣言で) clearGrid() メッセージを知っています。

ENP フォームには、StringGrid と呼ばれる TStringGrid があります。そして「追加」というボタン。[追加] ボタンをクリックすると、別のフォームが作成されて表示されます: EnpViewAdd ユニットで定義された AddEnp フォーム。

procedure TENP.opAgregarClick(Sender: TObject);
begin
  TAddEnp.Create(self).Show();
end;

AddEnp フォームには TEdit があります。入力の値は、EnpView.StringGrid に追加する必要があります。

私はこれを試します:

implementation

uses
  EnpView, Main;
procedure TAddEnp.AgregarClick(Sender: TObject);
begin

  { Agrego el nodo xml }
  Globals.Xml.agregarMuestra(muestra.Text);
  Globals.Xml.insertEnp(muestra.Text,golpes.Text,metros.Text);

  { Send messages to EnpView Form }
  ENP.clearGrid();
  ENP.populateGrid();

end;

ClearGrid メッセージは 1 行目で失敗し、アクセス違反が発生します。

procedure TENP.clearGrid();
begin
  Self.StringGrid.RowCount := 2;
  Self.StringGrid.Rows[1].Clear();
end;

clearGrid メソッドは、クラス内で送信する場合に機能します。何か案は ?。

4

2 に答える 2

1

たとえば、TAddENP で ENPForm という名前のプロパティを作成し、作成直後に ENP フォームを割り当てます。次のように宣言します。

TAddENP = class(TForm)
private
  FENPForm: TENP;

// all of your already existing declarations

public
  property ENPForm: TENP read FENPForm write FENPForm;
end;

ENP フォームへの参照が可能になったので、好きなように使用できます。

TAddENP フォームの作成中に、次の手順を実行します。

procedure TENP.opAgregarClick(Sender: TObject);
var
  addForm: TAddENP;
begin
  addForm := TAddEnp.Create(Self);
  addForm.EnpForm := Self;
  addForm.Show;
end;

これで、2 番目のフォームが作成され、最初のフォームへの安全な参照が与えられました。彼らは今、お互いに安全に話すことができます.

あるフォームで他のコンポーネントを操作することは避けることをお勧めします。これにより、フォーム間の依存関係が増加するためです。代わりに、パブリック メソッドを宣言して、フォームが実装ではなくインターフェイスに依存するようにします。

これが役立つことを願っています。

于 2013-07-19T10:51:56.660 に答える