initialization не отрабатывает

AndrewVL
Дата: 25.05.2011 16:07:52
Здавствуйте.
Есть BPL-ка.
В ней фреймы лежат. в каждом юните есть секция initialization.
Расставляю брейки на них. на каких-то секциях останавливается. на каких-то нет.
пробую GetClass jодного из фреймов - nil.
Получается что не зарегистрирован. Хотя соответсвующий код прописан.

Куда копать?


Спасибо
Кроик Семён
Дата: 25.05.2011 16:29:49
Если не останавливается, то как одна из возможных причин из моей практики:
- оптимизатор, который выкинул строчку.

Пример:

INITIALIZATION
   i:= 10;
   i:= 11;
ДжекНепотрошитель
Дата: 25.05.2011 16:32:04
Если BPL-ка зарегистрирована в Delphi и грузится явно самой IDE, то initialization должна отрабатывать всегда. Если BPL-ка грузится динамически из другой BPL, то... должна отрабатывать всегда, но на практике где-то там есть баг (по крайней мере, в D2007), и инициализация вызывается не по всем модулям. Получить стабильный и компактный пример, воспроизводящий этот баг, у меня не получилось (к слову, я не сильно и стремился, мне было проще его обойти, чем возиться с глюками RTL).
AndrewVL
Дата: 25.05.2011 16:43:39
ДжекНепотрошитель,

Синие точки останова при отладке стоят. значит дельфя считает их активными.
сама строка точки останова красная. значит останавливаться должна.

поставил messagebox на инициализацию - ноль внимания.
ДжекНепотрошитель
Дата: 25.05.2011 17:32:34
AndrewVL
Синие точки останова при отладке стоят. значит дельфя считает их активными.
сама строка точки останова красная. значит останавливаться должна.

Синие точки означают всего лишь, что данный текст компилируется в машинный код. То, что этот код потом еще и будет выполняться, синие точки не означают.
Сергей Фролов
Дата: 25.05.2011 18:43:08
AndrewVL
Куда копать?

В главной форме программы попробуй в uses прописать все модули из bpl.
Не красиво, конечно, но initialization отработает :)
GunSmoker
Дата: 25.05.2011 19:36:59
С чего бы секциям initialization вызываться? BPL - это же не DLL.

Вот если модуль из BPL используется вызывающим, тогда он инициализируется, иначе - нет и не должен.
Сергей Фролов
Дата: 25.05.2011 19:42:24
GunSmoker
Вот если модуль из BPL используется вызывающим, тогда он инициализируется, иначе - нет и не должен.

В хелпе так и написано:

The initialization section is optional. It begins with the reserved word initialization and continues until the beginning of the finalization section or, if there is no finalization section, until the end of the unit. The initialization section contains statements that are executed, in the order in which they appear, on program start-up. So, for example, if you have defined data structures that need to be initialized, you can do this in the initialization section.

For units in the interface uses list, the initialization sections of the units used by a client are executed in the order in which the units appear in the client's uses clause.

The older "begin ... end." syntax still functions. Basically, the reserved word "begin" can be used in place of initialization followed by zero or more execution statements. Finalization was accomplished by providing a procedure to the ExitProc variable. This method is not recommended for code going forward but you might see it used in older source code. Code using the older "begin ... end." syntax cannot specify a finalization section.
AndrewVL
Дата: 25.05.2011 20:54:49
Сергей Фролов,


Спасибо.

Допер )