2012-04-16 58 views
3

我想從一個從主窗口調用的類訪問主窗體變量。 事情是這樣的:從德爾福兒童部門訪問主窗體

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. 

UNIT2:

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我添加使用1單元的圓形錯誤彈出。

如何使Unit1成爲GLOBAL?

+6

名稱「變」爲常數,這簡直......天才要比。 – NGLN 2012-04-16 12:58:18

回答

4

其他答案告訴你,你應該使用實現部分中的單位之一。

假設你在'unit2'中選擇了'unit1'的實現。那麼你需要設計一個機制來告訴'TChiled'如何訪問'Form1'。這是因爲你沒有在'unit2'的接口部分使用'unit1',所以你不能在interface部分聲明'Form1:TForm1'變量。以下僅僅是一個可能的解決方案:

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; 

然後在1單元,你可以調用TChiled的方法之前設置TChiled的Form1的屬性:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Chiled.Form1 := Self; 
    Chiled.ShowMainFormVariable; 
end; 
2

好了,簡單天真的答案是,你應該添加Unit1Unit2實施部分的uses條款:

unit Unit2; 
...... 
implementation 

uses 
    Unit1; 
..... 

你不能把它的接口部分添加到uses條款Unit2,因爲這會在界面部分創建一個循環引用。換句話說,Unit1的接口將使用Unit2,並且Unit2的接口將使用Unit1。該語言不允許。常見的解決方案是use執行級別的單位之一。


話雖如此,您的代碼是相當困惑,並在許多其他方面失敗。您的問題比循環參考更深入。例如,你的意思是Form1.Variable?常數Variable不是TForm1的成員。您聲明瞭類型的名爲Form1的兩個全局變量。你爲什麼這樣做?

此外,您拼寫錯誤的孩子。

3

最簡單的解決方案是將Unit1添加到Unit2實現部分中的uses子句中,因爲它解決了循環引用問題。

但是我建議這個設計是有缺陷的。很難看到你想用示例代碼實現的目標,所以很難提供任何真正的建議。

1

我通常創建一個數據模塊(或任何類型的非可視化容器)來共享全局變量。這樣,兩個單元都可以使用該變量而不用循環引用。

+0

雖然這可能是一個好主意,但如果你回答了被問到的問題,並提供合理的建議,情況會更好。 – 2012-04-16 13:01:00

+0

這個答案既不是...... – GolezTrol 2012-04-16 13:04:28

+1

@golez爲什麼不呢?我的意思是一個數據模塊在頂部我猜,一個普通的單位會做。但你的意思不僅僅是這個嗎? – 2012-04-16 13:14:47