2012-04-16 2 views
3

Я хочу получить доступ к основной переменной формы из класса, который вызывается из основного. Что-то вроде этого:Доступ к основной форме из дочернего подразделения в Delphi

Unit1:

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 я добавить использует Unit1 циркуляра ошибки всплывает.

Как сделать блок 1 GLOBAL?

+6

Название «Variable» для постоянной, это просто ... гениален , – NGLN

ответ

4

Как говорят другие ответы, вы должны использовать один из блоков в разделе реализации.

Предположим, что вы выбрали в 'unit2', вы использовали бы 'unit1' в реализации. то вам нужно разработать механизм, чтобы сообщить «TChiled», как получить доступ к «Form1». Это потому, что, поскольку вы не использовали «unit1» в разделе интерфейса «unit2», вы не можете объявить переменную «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 вы можете установить свойство Form1 из TChiled перед вызовом метода TChiled в:

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

Ну, простой наивный ответ, что вы должны добавить Unit1 к статье о реализации секции Unit2uses:

unit Unit2; 
...... 
implementation 

uses 
    Unit1; 
..... 

Вы не можете добавить его в пункте uses в разделе интерфейса из Unit2, поскольку это создаст круговую ссылку в разделе интерфейса. Для слов, интерфейс Unit1 будет использовать Unit2, а интерфейс Unit2 будет использовать Unit1. Язык этого не позволяет. Общее решение - use - один из блоков на уровне реализации.


Сказав это, ваш код довольно смущен и терпит неудачу многими другими способами. Ваши проблемы выполняются глубже круговой ссылки. Например, что вы подразумеваете под Form1.Variable? Константа Variable не является членом TForm1. Вы объявляете две глобальные переменные с именем Form1 типа TForm1. Зачем ты это делаешь?

Кроме того, вы неправильно указали ребенка.

3

Самое простое решение состоит в том, чтобы добавить Unit1 в раздел uses в разделе реализации Unit2, поскольку это обходит круговую ссылку.

Однако я бы предположил, что этот дизайн испорчен. Трудно понять, чего вы пытаетесь достичь с помощью примерного кода, поэтому трудно предложить какие-либо реальные советы.

1

Обычно я создаю модуль данных (или любой тип невизуального контейнера) для обмена глобальными переменными. Таким образом, обе единицы могут использовать переменную без круговой ссылки.

+0

Хотя это может быть хорошей идеей, было бы лучше, если бы вы ответили на заданный вопрос, а также предложили здравый совет. –

+0

и этот ответ не ... – GolezTrol

+1

@golez Почему бы и нет? Я имею в виду, что модуль данных находится над вершиной, я думаю, простой блок будет делать. Но вы имеете в виду больше? –

Смежные вопросы