![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как автоматизировать замену значений свойств в формах ?
Игорь Шевченко © (2006-01-19 14:54:00)Ситуация следующая: Имеется класс-предок формы, от которого наследуется множество других форм. У наследников есть ряд свойств, значения которых в некоторый момент времени надо заменить (раз и навсегда). Хотелось бы реализовать следующий вариант: создание класса-наследника с чтением dfm-файла его формы, обход свойств, поиск нужных и замена значений, сохранение dfm-файла. И так для всех форм-наследников. Также хотелось, для создания таблицы замен, вывести все прочитанные свойства определенного типа в общую таблицу.
При попытке решения задачи в лоб (TStream.ReadComponent), выявились следующие грабли - все формы имеют событие OnCreate, выполнение которого в данной ситуации является недопустимым (да и невозможным). Читать вручную текстовые файлы и разбирать их на свойства представляется крайне скучной задачей, делать которую можно только в том случае, если больше найдется никаких путей решения.
Отсюда вопрос: можно ли как-то стандартными средствами создать класс, заполнив его свойства из dfm (не вызывая никаких методов этого класса, в крайнем случае, не вызывая обработчиков событий) и второй вопрос - как записать только те свойства, которые были изначально в исходном dfm-файле.
Если вопрос не по теме конференции, извиняйте, перекину в Основную.
Юрий Зотов (2006-06-28 00:45:00) [1]Выслал в компилированном виде (D7)
Трубников Олег (2006-06-27 22:39:00) [2]
> Игорь, есть парсер DFM, специально под такую задачу когда-
> то написанный. Выполнен в виде компонента, который читает
> DFM (хоть текстовый, хоть бинарный) и по ходу пьесы генерит
> события: начался объект (любой - хоть компонент, хоть некомпонентский
> объект), встретилось свойство, объект закончился и т.д.
> В обработчиках этих событий можно приказать ему удалить
> текущий объект, изменить его класс, изменить значение любого
> свойства и т.д. При возникновении ошибки генерит исключение,
> передает в него нужную информацию и DFM не меняет.
>
> Делаем маленькую утилитку, в ней кладем на форму этот парсер
> и пишем обработчики его событий - получаем возможность произвольного
> апдейта файлов форм. В самой утилите организуем пакетную
> обработку любого количества файлов и запись протокола.
>
> Тестировался на нескольких тысячах файлов, глюков обнаружено
> не было. Могу его скинуть, если надо - позвони.
Уважаемый Юрий Зотов!
А скиньте мне тоже этот парсер DFM. Очень нужно.
trubnikov.oleg@rostokinolada.com Трубников Олег.
Юрий Зотов (2006-01-23 14:23:00) [3]> TUser © (23.01.06 09:58) [18]
Вряд ли речь в сабже идет об этом. Насколько я понял, требуется автоматизированная переделка DFM-файлов.
TUser (2006-01-23 09:58:00) [4]Извините, что влезаю в беседу. В jedi (уж извините :) есть компонент, который свойства сохраняет/загружает в реестр или ini-файл. Я бы подсунул ему свой MemoryIni.
Юрий Зотов (2006-01-19 19:32:00) [5]Игорь, таки нашел и отправил, лови почту.
Джо (2006-01-19 18:29:00) [6]> [14] jack128 © (19.01.06 17:59)
Да, спасибо, это, похоже, именно поэтому. Плюс добавленные в новых версиях новые свойства, но это мелочи :)
Юрий Зотов (2006-01-19 18:14:00) [7]> Игорь Шевченко © (19.01.06 17:25) [11]
Игорь, скину, но смогу только завтра, сегодня у меня его просто нет под рукой.
jack128 (2006-01-19 17:59:00) [8]Джо © (19.01.06 17:33) [13]
это связано с тем, что в старших версиях дельфи строки сохраняются в UTF-8 (вроде. в общем в каком таком формате) а раньше в анси..
Джо (2006-01-19 17:33:00) [9]> [12] Юрий Зотов © (19.01.06 17:27)
Спасибо за разъяснение. Думал, что представление внутренних структур различается. Ведь старые версии Делфи не берут новые dfm, по крайней мере, это было, кажется на 3 Делфи.
Юрий Зотов (2006-01-19 17:27:00) [10]> Джо © (19.01.06 17:22) [10]
Двоичный DFM имеет формат ресурса Windows, от версии Delphi он не зависит.
Игорь Шевченко (2006-01-19 17:25:00) [11]Юрий Зотов © (19.01.06 17:16) [9]
Юра, спасибо, буду очень признателен, если сбросишь на hs_siw[гав]mail[точка]ru
По телефону адрес диктовать неудобно :)
Джо (2006-01-19 17:22:00) [12]> [9] Юрий Зотов © (19.01.06 17:16)
А двоичные DFM от какой версии парсит? Или там различия несущественные?
Сорри, если оффтоп, просто интересно.
Юрий Зотов (2006-01-19 17:16:00) [13]Игорь, есть парсер DFM, специально под такую задачу когда-то написанный. Выполнен в виде компонента, который читает DFM (хоть текстовый, хоть бинарный) и по ходу пьесы генерит события: начался объект (любой - хоть компонент, хоть некомпонентский объект), встретилось свойство, объект закончился и т.д. В обработчиках этих событий можно приказать ему удалить текущий объект, изменить его класс, изменить значение любого свойства и т.д. При возникновении ошибки генерит исключение, передает в него нужную информацию и DFM не меняет.
Делаем маленькую утилитку, в ней кладем на форму этот парсер и пишем обработчики его событий - получаем возможность произвольного апдейта файлов форм. В самой утилите организуем пакетную обработку любого количества файлов и запись протокола.
Тестировался на нескольких тысячах файлов, глюков обнаружено не было. Могу его скинуть, если надо - позвони.
Игорь Шевченко (2006-01-19 16:11:00) [14]jack128 © (19.01.06 16:05) [7]
> Читать вручную текстовые файлы и разбирать их на свойства
> представляется крайне скучной задачей, делать которую можно
> только в том случае, если больше найдется никаких путей
> решения.
jack128 (2006-01-19 16:05:00) [15]а..а в чем тогда проблема? ищи в тексовом представлении dfm строку 'object имя_компонента' или 'inline имя_компонента' или 'inherited имя_компонента' и дописывай эту строку. ну еще нужно кой какие проверки из-за наследования сделать, но в любом случае - алгоритм достаточно простой, ИМХО
Игорь Шевченко (2006-01-19 15:55:00) [16]jack128 © (19.01.06 15:43) [5]
> а как этот общий механизм будет узнавать какие свойства
> и как изменять?
таблица вида:
имя_компонента.имя_свойства.старое_значение=новое_значение
jack128 (2006-01-19 15:43:00) [17]Игорь Шевченко © (19.01.06 15:18) [4]
1. Исходные классы менять не хочется.
тогда при чтении на TReader.OnFindMethod навесить процедурку, которая бы на 'OnCreate' возвращала бы nil
Игорь Шевченко © (19.01.06 15:18) [4]
3. Хотелось бы иметь механизм, которому можно будет задать перечень классов для такой операции по замене свойств, и пусть он все остальное сам сделает. Классов (наследников) много.
а как этот общий механизм будет узнавать какие свойства и как изменять?
Игорь Шевченко (2006-01-19 15:18:00) [18]jack128 © (19.01.06 15:13) [2]
1. Исходные классы менять не хочется.
2. Кто будет вызывать конструктор с установкой свойства ?
3. Хотелось бы иметь механизм, которому можно будет задать перечень классов для такой операции по замене свойств, и пусть он все остальное сам сделает. Классов (наследников) много.
jack128 (2006-01-19 15:15:00) [19]Но вообще говоря, сильно сомниваюсь, что одним OnCreate траблы ограничатся..
jack128 (2006-01-19 15:13:00) [20]type
TParent = class(TForm)
private
FDontCallOnCreate: boolean;
protected
procedure DoCreate; override;
end;
procedure TParent.DoCreate; override;
begin
if not FDontCallOnCreate then
inherited;
end;
при загрузки свойств:
Form := TChild.NewInstance;
Form.FDontCallOnCreate := True;
Form.Create(nil);
?