Форум: "Начинающим";
Текущий архив: 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