![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Содержание одинаковых модулей в разных пакетах [D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
BFG9k © (2005-10-24 18:30:00)Несколько пакетов загружаются в основную программу с помощью LoadPackage. Эти пакеты содержат одинаковые модули и дельфи на это ругается. Как этого избежать ?
Не хотелось бы загонять повторяющиеся модули в отдельный пакет.
BFG9k (2005-10-27 13:04:00) [1]Хотя не совсем. Добавляю форму в репозиторий, создаю от нее потомка - модуль с формой включается в contains :( Как же все-таки вытащить ее из Shared , помещенной в requires ?
BFG9k (2005-10-27 13:00:00) [2]Разобрался, спасибо.
BFG9k (2005-10-26 18:14:00) [3]Добавил в закладку Forms. Наследование недостпуно - только Copy. Указываешь директорию (зачем?) - ошибка : Cannot Copy a Repository Project to a directory underneath itself.
Reindeer Moss Eater (2005-10-26 17:46:00) [4]Add To Repository
BFG9k (2005-10-26 17:35:00) [5]Вынес TAbstractForm в пакет Shared.
Включил в Shared в requires остальных пакетов.
Как мне добиться того, чтобы модули этих пакетов видели тип TAbstractForm и могли создавать от него потомков ?
Reindeer Moss Eater (2005-10-25 17:23:00) [6]Конструктор у TAbstractForm виртуальный.
Общий пакет в котором реализован TAbstractForm умеет создвать наследников этого класса.
Нужный тип наследника передается из пакета в котором реализован наследник.
Таким образом создается экземпляр конкретного наследника TAbstractForm.
Игорь Шевченко (2005-10-25 17:13:00) [7]Reindeer Moss Eater © (25.10.05 16:52) [24]
> procedure CreateAnyForm(AClass : TClassOfAbstractForm);
Тут уже я перестаю понимать. В пакете надо создать конкретного наследника TAbstractForm, насколько я уяснил. Каким образом может помочь такая функция (я все-таки надеюсь, что это функция, возвращающая ссылку на созданную форму, а не процедура) ?
Reindeer Moss Eater (2005-10-25 16:52:00) [8]TAbstractForm=class(TForm)
TClassOfAbstractForm = class of TAbstractForm;
procedure CreateAnyForm(AClass : TClassOfAbstractForm);
begin
with AClass.Create(Application) do
begin
end;
end;
Все это реализуется в одном месте общего пакета. И все дочерние пакеты создают экземпляры своих форм вызывая CreateAnyForm
Игорь Шевченко (2005-10-25 16:48:00) [9]
> Так вот, эту экспортируемую функцию (и еще кое что) придется
> писать N раз в N числе практически одинаковых модулей.
И как здесь может помочь условная компиляция ? Или, иначе говоря, как это реализовано сейчас для N пакетов ?
BFG9k (2005-10-25 16:47:00) [10]Придумал вроде. Использовать директиву компилятора {$I <имя_файла>} в N количестве PAS файлов. Эти N файлов будут по-разному называться и иметь одну и ту же основу.
BFG9k (2005-10-25 16:31:00) [11]Поздравляю, а вот мне это сделать не удалось, так как в моих модулях используется условная компиляция.
Представим себе такую ситуацию. Есть бызовый класс :
TAbstractForm=class(TForm)
Содержащий его модуль - один на все пакеты, его мы включаем в тот самый отдельный пакет.
Если нам нужно обращаться к формам, содержащимся в пакетах, извне - обращаемся к базовуму классу.
Сами формы представляют собой потомков базового класса:
TForm1=class(TAbstractForm)
Создание формы происходит внтури экспортируемой функции, которая возвращает в основную программу экземпляр формы:
function CreateForm(AOwner:TComponent): TAbstractForm;
begin
Result:= TForm1.Create(AOwner);
end;
Так вот, эту экспортируемую функцию (и еще кое что) придется писать N раз в N числе практически одинаковых модулей. А если что-либо изменится, то N раз изменять. Здесь я использовал условную компиляцию, поэтому экспорт функции у меня фактически осуществляется в одном общем модуле на все N пакетов. Если бы в пакетах этот модуль бы назывался по-разному, это бы решило проблему.
Игорь Шевченко (2005-10-25 16:12:00) [12]BFG9k © (25.10.05 16:00) [18]
> удалось ли им решить ее малой кровью
Удалось. Вынесением общих модулей в отдельный пакет. Это сделать быстрее, чем дискутировать на форуме.
Reindeer Moss Eater (2005-10-25 16:08:00) [13]Можно ли из pas файла получить dcu с другим именем с помощью какой-нибудь директивы компилятора ?
Не надо страдать ерундой.
Допустим у меня в usesнаписано myunit
А dcu от него называется yourunit.
Предтавь после этого себя на месте компилятора и попробуй что - нибудь придумать мудрое.
BFG9k (2005-10-25 16:00:00) [14]Это все понятно. Я ищу людей, которые сталкивались с такой проблемой и хочу узнать, не удалось ли им решить ее малой кровью.
Насчет условной компиляции. Можно ли из pas файла получить dcu с другим именем с помощью какой-нибудь директивы компилятора ?
Игорь Шевченко (2005-10-25 15:41:00) [15]BFG9k © (25.10.05 15:36) [16]
Да просто на протяжении ветки народ пытается донести мысль, что в пакетах модули не должны пересекаться...Поэтому пытаться изменить что-либо в этом направлении можно только двумя путями - либо переименованием, либо вынесением общих модулей в дополнительный пакет (пакеты). Второе предпочтительнее.
BFG9k (2005-10-25 15:36:00) [16]
> Есть парвила игры, хочешь - принимай, хочешь - отказывайся.
Уважаемый, я к сожалению не в игры играю. Есть возможность, подходит под мою задачу, да вот установили одно правило нехорошее. Обидно. Вопрос пока открыт.
Игорь Шевченко (2005-10-25 15:22:00) [17]Never attribute to malice which can be adequately explained by stupidity.
> Неужели нельзя скрыть эту информацию ?
Более того, нельзя даже скрыть приватные поля объектов в этих модулях.
Есть парвила игры, хочешь - принимай, хочешь - отказывайся.
BFG9k (2005-10-25 15:06:00) [18]Ну хорошо, условная компиляция исключается ?
Почему весь свет должен видеть, какие модули я использую в bpl ? Неужели нельзя скрыть эту информацию ?
Reindeer Moss Eater (2005-10-25 14:43:00) [19]Что если разные модули имеют одинаковые имена?
А вот не надо так делать и не будет проблем.
А что если вообще все модули имеют одинаковые имена?
BFG9k (2005-10-25 14:01:00) [20]Появилась одна проблема. Что если разные модули имеют одинаковые имена? Казалось бы, переименовать и все. Но как быть с условной компиляцией (IFDEF..ENDIF), когда один и тот же pas файл компилируется по разному в зависимости от того, в какой проект он включен ?
Такой уже не включишь в Shared.bpl :(