2014-08-26 2 views
-2

Я хотел бы иметь возможность прочитать исходный текст свойства компонента (опубликованного) во время выполнения после его (потенциально) изменения.Как получить исходный текст свойства визуального компонента?

Контекст заключается в том, что я пишу расширение библиотеки переводов, которое мы использовали в нашем приложении. Эта библиотека устарела и больше не поддерживается поставщиком, поэтому я самостоятельно, чтобы она работала.

К сожалению, способ кодирования библиотеки делает невозможным использование из ISAPI Dll (например, в приложении Intraweb). Часть словаря работает, но компонент автоматического перевода не работает (в основном потому, что он пытается перезаписать часть кода в памяти). Поэтому я пытаюсь спасти части, которые работают (формируют инструменты перевода и хранилище словарей), переписывая ту часть, которая этого не делает (ну, только те элементы, которые меня интересуют).

Я, однако, остановился на том, что, как только свойство текста компонента было переведено, оно больше не будет соответствовать исходному тексту и не будет найдено в словаре.

Этот код должен работать в Delphi 7, хотя я планирую перенести его на XE5, как только у меня будет достаточно времени для этого.

+0

Проверьте этот образец http://docwiki.embarcadero.com/CodeExamples/XE3/en/VCL.RichEdit_Sample –

+0

Это не имеет никакого отношения к заданному вопросу. – Stephane

ответ

1

«Когда текст текста компонента был переведен, он не будет соответствовать оригинального текста и не будет найден в словаре».

Можете ли вы оставить отдельную карту поиска самостоятельно, переведенного контента на оригинал? Добавьте к этому в любое время, когда строка будет заменена переведенным контентом. Таким образом, вы можете идти вперед и назад между оригиналом и переведенным по своему усмотрению.

В XE5 самым простым способом было бы использовать TDictionary. В D7 вам, возможно, придется сворачивать свой собственный контейнер.

+0

Оба решения очень похожи, но, честно говоря, это чувствует себя как неудачное обходное решение. Если я не смогу найти что-нибудь получше, я бы это выполнил. – Stephane

+0

В какой библиотеке вы используете? (Это, вероятно, стоит добавить к вопросу, кстати.) Если он старый и неподдерживаемый, считаете ли вы, что переходите к другому полностью, вместо того, чтобы спасать небольшие кусочки и использовать хаки/уродливый код, как это? –

+0

Не совсем: это мертвый продукт. Они перешли от исходного перевода к переводу ресурсов и оставили своих клиентов в пыли. Я должен был исправить тон проблемы с их кодом на протяжении многих лет, поэтому конечный результат на самом деле не похож на оригинал. – Stephane

1

Вы можете создать процедуру, которая сохраняет исходные значения в списке или в каком-либо массиве, а затем вызвать эту процедуру в методе Load Load (вы должны переопределить ее) и не забудьте вызвать унаследованное в конце этого .) Затем выполните поиск записи каталога в этом списке. Метод Load Loaded вызывается после того, как все компоненты загружаются из DFM, но до FormCreate. Здесь вы можете найти все исходные свойства.

1

Из того, что я понимаю, вы хотите вернуть значение свойств строки, поскольку они хранятся в DFM во время компиляции.

Итак, я думаю, что самый надежный способ сделать это будет из самого DFM. Насколько мне известно, DFM всегда хранятся внутри двоичных файлов в качестве ресурсов (хотя могут быть и исключения). Некоторое время назад я занимался чем-то подобным. Я не смог заставить его работать, как R & время D выбежала (у меня было только несколько часов), но если вы хотите, чтобы смотреть на это, я хотел бы начать с

TCustomForm.Create 
    InitInheritedComponent 
    InternalReadComponentRes 
     TStream.ReadComponent 
     TReader.ReadRootComponent 

Может кто-то может подтвердите, может ли этот подход работать или нет, и что такое оговорка, но до тех пор я думаю, что это правильное направление исследований для вас.

Смежные вопросы