4

mainfromから呼び出されるクラスからmainフォーム変数にアクセスしたい。このようなもの:

ユニット1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Unit2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;
var
  Form1: TForm1;
  Chiled:TChiled;
const
 Variable = 'dsadas';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chiled.ShowMainFormVariable;
end;

end.

ユニット2:

unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

  type
  TChiled = class
  private
  public
    procedure ShowMainFormVariable;
  end;
var
  Form1: TForm1;
implementation

procedure TChiled.ShowMainFormVariable;
begin
  ShowMessage(Form1.Variable);
end;
end.

Unit2で、Unit1を使用するように追加すると、循環エラーがポップアップします。

Unit1をグローバルにする方法は?

4

4 に答える 4

6

他の回答が示すように、実装セクションのユニットの1つを使用する必要があります。

'unit2'で、実装で'unit1'を使用することを選択したとします。次に、「TChiled」に「Form1」へのアクセス方法を指示するメカニズムを考案する必要があります。これは、「unit2」のインターフェースセクションで「unit1」を使用していないため、インターフェースセクションで「Form1:TForm1」変数を宣言できないためです。以下は、考えられる解決策の1つにすぎません。

unit2

type
  TChiled = class
  private
    FForm1: TForm;
  public
    procedure ShowMainFormVariable;
    property Form1: TForm write FForm1;
  end;

implementation

uses
  unit1;

procedure TChild.ShowMainFormVariable;
begin
  ShowMessage((FForm1 as TForm1).Variable);
end;

次に、unit1で、TChiledのメソッドを呼び出す前にTChiledのForm1プロパティを設定できます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chiled.Form1 := Self;
  Chiled.ShowMainFormVariable;
end;
于 2012-04-16T13:01:43.553 に答える
3

さて、単純な素朴な答えは、次の実装セクションの句に追加Unit1する必要があるということです。usesUnit2

unit Unit2;
......
implementation

uses
  Unit1;
.....

インターフェイスセクションで循環参照が作成されるため、usesのインターフェイスセクションの句に追加することはできません。Unit2つまり、のインターフェイスはUnit1を使用しUnit2、のインターフェイスはUnit2を使用しますUnit1。言語はそれを許可していません。一般的な解決策はuse、実装レベルのユニットの1つです。


そうは言っても、あなたのコードはかなり混乱していて、他の多くの点で失敗します。問題は循環参照よりも深くなります。たとえば、どういう意味Form1.Variableですか?定数VariableはのメンバーではありませんTForm1Form1タイプが名前の2つのグローバル変数を宣言しますTForm1。どうしてそれをするの?

また、子のスペルが間違っています。

于 2012-04-16T12:42:08.783 に答える
3

最も簡単な解決策は、Unit1をUnit2の実装セクション内のuses句に追加することです。これにより、循環参照が回避されます。

ただし、この設計には欠陥があることをお勧めします。サンプルコードで何を達成しようとしているのかを理解するのは難しいため、実際のアドバイスを提供することは困難です。

于 2012-04-16T12:42:45.820 に答える
1

私は通常、グローバル変数を共有するためにデータモジュール(または任意のタイプの非ビジュアルコンテナ)を作成します。このようにして、両方のユニットが循環参照なしで変数を使用できます。

于 2012-04-16T12:48:08.473 に答える