Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
15-1198322066
homm
2007-12-22 14:14
2008.01.27
У меня счас крыша поедет


15-1198337868
Evgeniy
2007-12-22 18:37
2008.01.27
Что такое BigInt?


15-1198058066
Kerk
2007-12-19 12:54
2008.01.27
К проблеме ИИ


2-1199292200
Петровский
2008-01-02 19:43
2008.01.27
Привязка к ПК


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский