Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unit X was compiled with a different version of Y 
V
    Опции темы
XperT
Дата 24.1.2014, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Помогите решить проблему: "Unit MyClasses was compiled with a different version of AppSettings.Z". Выскакивает при изменениях в классе AppSettings.Z, помогает только ребилд проекта, но это долго каждый раз такое делать.

Точно помню, что уже сталкивался с этой проблемой и решил её, но как я это тогда сделал не могу вспомнить.
PM MAIL   Вверх
northener
Дата 25.1.2014, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Недостаточно информации. Эта "проблема" имеет массу корней. Который из них вы затронули не известно. Например о каких изменениях в классе AppSettings.Z идёт речь?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
XperT
Дата 27.1.2014, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



В общем так. Есть модуль AppSettings, в котором есть класс TAppSettings, в котором в свою очередь есть переменная класса TProgramFolders. Так вот изменения в класс TProgramFolders (например добавление новых констант и методов класс) приводят к появлению таких сообщений. Для большей ясности привожу кусок кода программы.

Код

unit AppSettings;

TProgramFolders = class
private
    FExeDir : String;

    const cCore = 'Core\';
    const cProjects = 'Projects\';
    const cTemp = 'Temp\';

    function FGetTempDir():string;
    function FGetCoreDir():string;
    function FGetProjectsDir():string;
public
    constructor Create(ExeDir : String);

    property Exe: string read FExeDir;
    property Temp: string read FGetTempDir;
    property Core: string read FGetCoreDir;
    property Projects: string read FGetProjectsDir;
end;

TAppSettings = class
private
    FDIR : TProgramFolders;
    ...
public
    ...
    property DIR : TProgramFolders read FDIR;
end;

var
    Z : TAppSettings;

implementation

...

PM MAIL   Вверх
XperT
Дата 31.1.2014, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Апну тему. Может кто-то подскажет где почитать? Для меня например не понятно, почему IDE сама не контролирует какие модули нужно перекомпилировать.
PM MAIL   Вверх
XperT
Дата 1.2.2014, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



В общем удалось найти причину и устранить проблему. В моём случае проблема была из-за такой структуры файлов:

Модуль A: ссылается на модуль C (в interface)
Модуль B: ссылается на модуль C (в interface) и на модуль А (в implementation)
Модуль C: ссылается на модуль А (в implementation)

Переделал немного структуру модулей таким образом, чтобы уменьшить количество перекрестных ссылок и проблема исчезла.
PM MAIL   Вверх
Poseidon
Дата 2.2.2014, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Когда А ссылается на С, а С ссылается на А, это говорит об ошибке проектирования кода. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
XperT
Дата 2.2.2014, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Цитата(Poseidon @ 2.2.2014,  02:11)
Когда А ссылается на С, а С ссылается на А, это говорит об ошибке проектирования кода.

Ок, тогда подскажите как сделать в такой ситуации: есть модуль с классом А, который генерирует кнопки в меню программе по клике на которые должна открываться определенная форма Б. Один из методов модуля А - это обработчик на клик по кнопке, в котором вызывается форма Б, а это значит, что необходимо добавить в зависимость модуль формы Б. В самой форме Б используется объект класса из модуля А для чтения настроек и генерирования правильных контролов и обработчикок.

Получается, что А ссылается на Б, а Б ссылается на А. Какой выход из подобной ситуации без допуска ошибок по проектированию? Создавать в модуле Б свой класс с настройками, в которые будут копироваться необходимые значения из модуля А? Ну так это дублирования данных, что имхо еще хуже.

Единственный вариант, который я вижу - это передавать в конструктор класса А делегат на создание формы Б, но в таком случае сильно ухудшается чтение кода, так как он получается размазан по 3 модулям.


Очень сильно не хватает аналога сишным заголовочным файлам, тогда бы эта проблема исчезла сама собой. Там проще проектировать за счет того, что объявления и реализацию можно разнести по модулям.
PM MAIL   Вверх
Poseidon
Дата 2.2.2014, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(XperT @  2.2.2014,  15:23 Найти цитируемый пост)
есть модуль с классом А, который генерирует кнопки в меню программе по клике на которые должна открываться определенная форма Б. Один из методов модуля А - это обработчик на клик по кнопке, в котором вызывается форма Б, а это значит, что необходимо добавить в зависимость модуль формы Б. В самой форме Б используется объект класса из модуля А для чтения настроек и генерирования правильных контролов и обработчикок.
Если я правильно понял, в А у нас генерация кнопок и реакция на их нажатие. В Б у нас описана форма, на которой генерируются эти кнопки. Очевидно, что Б должен знать об А, но вот А совсем не должен знать о Б. Если приведете пример конкретного кода, то объясню на примере.


Цитата(XperT @  2.2.2014,  15:23 Найти цитируемый пост)
Один из методов модуля А - это обработчик на клик по кнопке, в котором вызывается форма Б

Цитата(XperT @  2.2.2014,  15:23 Найти цитируемый пост)
В самой форме Б используется объект класса из модуля А

Уже это говорит о не правильном проектировании. Если в Б используется объект из А, то Б зависит от А. Описывать при этом в А обработчик события из Б как-то не логично.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1711 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.