Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Как получить доступ на чтение к переменной из другого юнита?   Найти похожие ветки 

 
DmT   (2008-01-01 23:54) [0]

сабж


 
Джо ©   (2008-01-01 23:59) [1]

Объявить переменную в секции implementation, включить этот юнит (uses) в другой.


 
DmT   (2008-01-02 00:10) [2]

теперь выдал ошибку
[Fatal Error] Unit1.pas(7): Circular unit reference to "Unit1"


 
{RASkov} ©   (2008-01-02 00:13) [3]

> [0] DmT   (01.01.08 23:54)
> Как получить доступ на чтение к переменной из другого юнита?

Не совсем понятно.... т.е. хочется ТОЛЬКО чтение или....

Если неважно (и чтение и запись) - то uses"ма пользуйся, иначе уточни вопрос....

> [2] DmT   (02.01.08 00:10)

Уточни вопрос....

> Circular unit reference to "Unit1"

Зацикливание.... у тебя ссылка стоит на модуль в котором есть ссылка на этот модуль...


 
{RASkov} ©   (2008-01-02 00:15) [4]

unit Unit1
interfase
var T: Integer;

implementation
......
--------------------------------
unit unit2;
interfase
uses unit1;

implementation

function GetT: Integer;
begin
 Result:=T; читаем переменную из unit1
end;


 
Германн ©   (2008-01-02 00:36) [5]


> Джо ©   (01.01.08 23:59) [1]
>
> Объявить переменную в секции implementation

Хм.


 
Германн ©   (2008-01-02 00:38) [6]


> {RASkov} ©   (02.01.08 00:15) [4]
>
>

Не надо без нужды прописывать другой модуль в interface uses. Из-за этого и получается "Circular reference".


 
korneley ©   (2008-01-02 00:56) [7]


> Не надо без нужды прописывать другой модуль в interface
> uses.

Беда D7 + пользование "File" -> "Use Unit" или всё-таки это к разработчикам?


 
Германн ©   (2008-01-02 01:01) [8]


> korneley ©   (02.01.08 00:56) [7]
>
>
> > Не надо без нужды прописывать другой модуль в interface
> > uses.
>
> Беда D7 + пользование "File" -> "Use Unit" или всё-таки
> это к разработчикам?
>

Не знаю Д7. В Д4, Д6 если я забыл сам указать в uses нужный модуль, то при компиляции мне всегда выдается сообщение с предложением включить его туда. И когда я соглашаюсь, он прописывается в implementation uses.


 
korneley ©   (2008-01-02 01:11) [9]


> И когда я соглашаюсь, он прописывается в implementation
> uses

Это если ты пользуешь автосоздаваемые средой переменные :) Опять к Остеру не ходи. Или к АП.


 
Германн ©   (2008-01-02 01:37) [10]


> Это если ты пользуешь автосоздаваемые средой переменные
> :)

Не понял. Но возможно ты и прав. Во всяком случае в ситуации {RASkov} ©   (02.01.08 00:15) [4] я очень редко когда забываю сам ручками включить модуль в uses. Тем более, что я хоть "глобальных  переменных" и не чураюсь, но пользую их крайне редко.


 
DmT   (2008-01-02 13:16) [11]

я не могу обойтись без uses ссылок друг на друга
в С++Builder 6 можно в обоих модулях написать
#include "Unit1.h"
#include "Unit2.h"
и всё компилится
никаких циркуляров


 
Сергей М. ©   (2008-01-02 14:10) [12]


> не могу обойтись без uses ссылок друг на друга


unit1
interface
uses unit2

unit2
implementation
uses unit1


 
{RASkov} ©   (2008-01-02 17:27) [13]

> [6] Германн ©   (02.01.08 00:38)
> Не надо без нужды прописывать другой модуль в interface uses.

Здесь согласен, а здесь

> Из-за этого и получается "Circular reference".

это получается из-за другого...... прокладка? :)

Навсяк для автора:

В делфи оператор uses может использоваться в двух местах в интерфейсной части модуля и в части реализации(implementation)
Возмем к примеру два модуля, например из [4]. В модуле Unit2 нам необходимо использовать модуль Unit1.... т.е. нам нужна всего лишь переменная T... Смотрим.... она(переменная) нам в unit2 в интерфейсной части не нужна, тогда нет необходимости подключать unit1(как я сделал в примере) в интерфейсную часть, а нужно было в implementation....
Другая ситуация когда необходимо в interfase подключать:
В модуле unit1 в интерфейсе обявлен тип, этот тип нужно использовать в объявлении нового класса в интерфейсе модуля unit2.... Пример:

unit Unit1
interfase
type MyString = String[15];
var T: Integer;

implementation
......
--------------------------------
unit unit2;
interfase
uses unit1;

type MyClass = class
     Name: MyString;
.........
    end;

implementation

function GetT: Integer;
begin
Result:=T; читаем переменную из unit1
end;


А в [4] второй юнит должен быть таким:
unit unit2;
interfase
..............

implementation

uses unit1;

function GetT: Integer;
begin
Result:=T; читаем переменную из unit1
end;


 
MsGuns ©   (2008-01-02 19:49) [14]

Вот несколько принципов, соблюдая которые навсегда избавишься от проблем "видимости":

1. Объекты, переменные, методы ОБЩЕГО ПОЛЬЗОВАНИЯ всегда размещать в датамодуле, причем сам код датамодуля не должен "ведать" ни о каких переменных извне - все, что ему надо, должно передаваться в параметрах.
Ссылку на датамодуль располагать в инфтерфейсной части всех юнитов - "клиентов", там, где перечисляются VCL-ные юниты. Датамодуль так же, как и гл.формы, должен быть включен в список автосоздаваемых.

2. Главная форма не должна обращаться ни к какому юниту, кроме датамодуля, ПО ИМЕНИ. Только по явной ссылке, используя разыменование типа. Уместно иногда вместо прямых вызовов внешних процедур использовать сообщения - при этом нет необходимости делать методы сторонних юнитов видимыми (uses в implementation) - такая технология удобна, например, при реализации общего функционала в MDI - приложениях.

3. "Дочерние" формы могут обращаться к переменным и методам Главной формы так же, как к датамодулю, для чего имя инита гл.формы также располагается в интерфейсной части uses. Все "дочерние" формы должны быть исключены из списка автосоздаваемых.

4. Не следует хранить данные, относящиеся к какому-то объекту (например, доч.форме), вне этого объекта. В сторонние методы, обрарабывающие объект, адрес на него передавать параметром.

5. Объекты уничтожает тот, что его создает.

6. Объект никогда не уничтожается в процедуре (функции), которой он передается как параметр (точнее, ссылка на него)

7. Объект, созданный в процедуре, не должен никуда передаваться, а используется лишь как временный участок памяти, очвобождаемый по выходу из процедуры.

Это схема, конечно, не является догмой, но новичкам позволяет избежать массу ошибок.



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
2-1198511187
@!!ex
2007-12-24 18:46
2008.01.27
Вопрос про многопоточность.


2-1198663138
trubin
2007-12-26 12:58
2008.01.27
Отличие дисков


1-1193213006
kyn66
2007-10-24 12:03
2008.01.27
Подобие EkRtf для Excel


4-1182518359
Dib@zol
2007-06-22 17:19
2008.01.27
И снова шрифты


15-1198224803
vajo
2007-12-21 11:13
2008.01.27
Как узнать поддерживает ли материнка HDD большого объема?