Автор: royt
Дата сообщения: 06.06.2006 08:02
разобрался...
В общем при использовании Translation Manager последний при создании .dll-ки для переводимого языка делает копии .dfm-файлов всего проекта. Когда эта .dll-ка используется и подгружается - все значения свойств (properties) и обработчиков событий (events) форм и компонентов, прописанные в "копиях" .dfm, переопределяют те, что находятся в самом .exe-файле.
Так вот, если после изменения каких-либо значений properties или events не были обновлены ресурсы "переводной" .dll-ки (не был заново запущен Translation Manager, затем выполнена компиляция .dll-ки), то при загрузке приложением такой "устаревшей" .dll-ки (если к этому приводит выбор текущей локали) можем получить самые разные фокусы. Например - вешаем на какой-нибудь event свой обработчик, а после запуска приложения в упор не видим чтобы он вызывался (т.е. он именно не вызывается), хотя в силу логики работы компонента этот обработчик ну никак не может не вызываться... (собствнно, так я и набрёл на выяснение причины проблемы)
Аналогичные вещи происходят в случае, когда мы просто кинули на форму дополнительные компоненты, а в "переводной" .dll-ке форма не обновлена - тогда при запуске приложения получим, что добавленные компоненты в "старой" форме вообще не определены (!) и при использовании такой .dll-ки (когда к этому приводит текущая локаль) указатели на такие компоненты будут просто равны NULL - что и просходило в случае, описанном мною в шапке.
Всё вышеозначенное касается C++ Builder 6. На Delphi или других версиях не проверял как оно себя ведет (может там Translation Manager немного по-другому работает).
ps. По-моему этот случай можно в FAQ заносить.
pps. Интересно, в Borland Developer Studio 2006 перевод на другие языки по тем же принципам работает или нет...