Консультация № 66615
12.12.2006, 08:42
0.00 руб.
0 5 4
Уважаемые эксперты, помогите пожалуйста.
Не силен в Delphi, и совсем не знаю что делать...

Есть модуль главной формы проекта - unit Main
И модуль потока - unit TestThread;

И есть переменные i, WorkFlag которые должны быть доступны во всех функциях и процедурах обоих модулей.

Где, в каком разделе нужно объявить эти переменные???

P.S.: Прилагаю код, но на него особо внимания не обращайте, это пробный вариант.

Приложение:
unit Main;interfaceuses TestThread, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XPMan, ComCtrls, ImgList, ExtCtrls, ActnCtrls, ToolWin, ActnMan, ActnMenus, XPStyleActnCtrls, ActnList, BCPort, StdStyleActnCtrls, Menus, ActnPopup, StdCtrls;type TForm1 = class(TForm) StatusBar1: TStatusBar; ActionManager1: TActionManager; ActionMainMenuBar1: TActionMainMenuBar; ActionToolBar1: TActionToolBar; TrayIcon1: TTrayIcon; ImageList1: TImageList; ProgressBar1: TProgressBar; XPManifest1: TXPManifest; BComPort1: TBComPort; Work: TAction; PauseWork: TAction; StopWork: TAction; ShowHelp: TAction; About: TAction; ShowHints: TAction; PopupActionBar1: TPopupActionBar; N3211: TMenuItem; N3212: TMenuItem; N3213: TMenuItem; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; CheckBox5: TCheckBox; CheckBox6: TCheckBox; CheckBox7: TCheckBox; CheckBox8: TCheckBox; CheckBox9: TCheckBox; CheckBox10: TCheckBox; CheckBox11: TCheckBox; CheckBox12: TCheckBox; CheckBox13: TCheckBox; CheckBox14: TCheckBox; CheckBox15: TCheckBox; CheckBox16: TCheckBox; CheckBox17: TCheckBox; CheckBox18: TCheckBox; CheckBox19: TCheckBox; CheckBox20: TCheckBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; Edit11: TEdit; Edit12: TEdit; Edit13: TEdit; Edit14: TEdit; Edit15: TEdit; Edit16: TEdit; Edit17: TEdit; Edit18: TEdit; Edit19: TEdit; Edit20: TEdit; ComboBox1: TComboBox; CheckBox21: TCheckBox; CheckBox22: TCheckBox; CheckBox23: TCheckBox; CheckBox24: TCheckBox; CheckBox25: TCheckBox; CheckBox26: TCheckBox; CheckBox27: TCheckBox; CheckBox28: TCheckBox; CheckBox29: TCheckBox; CheckBox30: TCheckBox; CheckBox31: TCheckBox; CheckBox32: TCheckBox; CheckBox33: TCheckBox; CheckBox34: TCheckBox; CheckBox35: TCheckBox; CheckBox36: TCheckBox; CheckBox37: TCheckBox; CheckBox38: TCheckBox; CheckBox39: TCheckBox; CheckBox40: TCheckBox; Edit21: TEdit; Edit22: TEdit; Edit23: TEdit; Edit24: TEdit; Edit25: TEdit; Edit26: TEdit; Edit27: TEdit; Edit28: TEdit; Edit29: TEdit; Edit30: TEdit; Edit31: TEdit; Edit32: TEdit; Edit33: TEdit; Edit34: TEdit; Edit35: TEdit; Edit36: TEdit; Edit37: TEdit; Edit38: TEdit; Edit39: TEdit; Edit40: TEdit; ComboBox2: TComboBox; procedure ShowHintsExecute(Sender: TObject); procedure PauseWorkExecute(Sender: TObject); procedure WorkExecute(Sender: TObject); procedure StopWorkExecute(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; WorkFlag : Boolean; // флаг работыimplementation{$R *.dfm}procedure TForm1.ShowHintsExecute(Sender: TObject);beginForm1.ShowHint := ShowHints.Checked;end;procedure TForm1.PauseWorkExecute(Sender: TObject);beginWorkFlag := FALSEend;procedure TForm1.StopWorkExecute(Sender: TObject);beginCloseend;procedure TForm1.WorkExecute(Sender: TObject);beginWorkFlag := TRUEend;end.====================================unit TestThread;interfaceuses Classes;type TTestThread = class(TThread) private { Private declarations } protected procedure Execute; override; end;implementation{ Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TTestThread.UpdateCaption; begin Form1.Caption := ‘Updated in a thread‘; end; }{ TTestThread }procedure TTestThread.Execute;Var i:Real;begin i:=i+1; if WorkFlag = FALSE then i:=0;end;end.

Обсуждение

Неизвестный
12.12.2006, 08:59
общий
это ответ
Здравствуйте, Пепеляев Александр Павлович!

Объявляйте их в юните Main как глобальные;
где
Var Form1: TForm1;
Неизвестный
12.12.2006, 09:57
общий
Более точно: "Чтобы переменные были доступны везде, их надо объявлять в секции <b>interface</b>, а не <b>implementation</b>". Ну и <b>uses</b>, конечно.
Неизвестный
12.12.2006, 17:11
общий
это ответ
Здравствуйте, Пепеляев Александр Павлович!
Создайте третий модуль н-р uVariable, в котором опишите нужные переменные, а потом подключите его в Main и в TestThread.
Неизвестный
12.12.2006, 22:22
общий
это ответ
Здравствуйте, Пепеляев Александр Павлович!
Насколько я знаю переменные, типы, константы, процедуры, функции и т. д. для того чтобы быть доступны в других модулях, где это модуль используется, должны быть описаны в интерфейсной (interface) части.
Неизвестный
12.12.2006, 22:36
общий
это ответ
Здравствуйте, Пепеляев Александр!

Поясняю.Если форма в модуле Unit1 должна управлять формой в модуле Unit2,то в оператор uses модуля Unit1 должно быть включено имя второго модуля.В свою очередь,если форма в модуле Unit2 должна пользоваться процедурами или каким-либо кодом,содержащимся в модуле Unit1,то в uses модуля Unit2 должно быть введено имя модуля Unit1.

Смотрите структуру модуля,я всё пояснил:

unit Unit1; //имя модуля

interface //открытый интерфейс модуля

{Сюда могут помещаться списки подключаемых модулей,объявления типов,констант
переменных,фунций,процедур,К КОТОРЫМ БУДЕТ ДОСТУП ИЗ ДРУГИХ МОДУЛЕЙ}

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; //список подключаемых модулей

type //объявляются классы формы
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private //закрытый раздел класса
{ Private declarations }
{Сюда могут помещаться объявления типов,констант переменных,фунций,
процедур,К КОТОРЫМ ДОСТУП ИЗ ДРУГИХ МОДУЛЕЙ ЗАКРЫТ}

public //открытый раздел класса
{ Public declarations }
{Сюда могут помещаться объявления типов,констант переменных,фунций,
процедур,КОТОРЫЕ НЕ БЫЛИ ВКЛЮЧЕНЫ В КЛАСС ФОРМЫ}

end;

var //ОБЪЯВЛЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ
Form1: TForm1;
{Сюда могут помещаться объявления типов,констант переменных,фунций,
процедур,К КОТОРЫМ ДОСТУП ИЗ ДРУГИХ МОДУЛЕЙ ЗАКРЫТ}

implementation //реализация модуля

uses Unit2; //ОБЪЯВЛЕНИЕ ССЫЛКИ НА ДРУГОЙ МОДУЛЬ
{Сюда могут помещаться списки подключаемых модулей,объявления типов,констант
переменных,фунций,процедур,не объявленных ранее,но К КОТОРЫМ НЕ БУДЕТ ДОСТУПА
ИЗ ДРУГИХ МОДУЛЕЙ}

{$R *.dfm}
{здесь помещается,собственно сам код программы,то есть процедуры,функции,
переменные,константы и т.д}

procedure TForm1.FormCreate(Sender: TObject);
begin
TForm2.Create(Application);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form2.Color:=clRed;
end;
end. //Завершение работы всего модуля
Следует так же заметить и это ВАЖНО!!!

Если вы используете циклические ссылки с помощью предложения uses, ни в коем случае нельзя их размещать в разделах interface!!!

Для первого модуля

unit Unit1

...

interface

uses ... Unit2

implementation

...

Для второго модуля

unit Unit2

...

interface

uses ... Unit1

implementation

При этом компилятор выдаст вам ошибку!

Правильно будет так:

Для первого модуля

unit Unit1

...

interface
implementation

uses ... Unit2
...

Для второго модуля

unit Unit1

...

interface
implementation

uses ... Unit2

...

Надеюсь,теперь вам стало ясно,куда помещать свои переменные.

Удачи!!
Форма ответа