Форум: "Компоненты";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
ВнизКак автоматизировать замену значений свойств в формах ? Найти похожие ветки
← →
Игорь Шевченко © (2006-01-19 14:54) [0]Ситуация следующая: Имеется класс-предок формы, от которого наследуется множество других форм. У наследников есть ряд свойств, значения которых в некоторый момент времени надо заменить (раз и навсегда). Хотелось бы реализовать следующий вариант: создание класса-наследника с чтением dfm-файла его формы, обход свойств, поиск нужных и замена значений, сохранение dfm-файла. И так для всех форм-наследников. Также хотелось, для создания таблицы замен, вывести все прочитанные свойства определенного типа в общую таблицу.
При попытке решения задачи в лоб (TStream.ReadComponent), выявились следующие грабли - все формы имеют событие OnCreate, выполнение которого в данной ситуации является недопустимым (да и невозможным). Читать вручную текстовые файлы и разбирать их на свойства представляется крайне скучной задачей, делать которую можно только в том случае, если больше найдется никаких путей решения.
Отсюда вопрос: можно ли как-то стандартными средствами создать класс, заполнив его свойства из dfm (не вызывая никаких методов этого класса, в крайнем случае, не вызывая обработчиков событий) и второй вопрос - как записать только те свойства, которые были изначально в исходном dfm-файле.
Если вопрос не по теме конференции, извиняйте, перекину в Основную.
← →
Игорь Шевченко © (2006-01-19 15:05) [1]Забыл добавить: замена свойств должна производиться не столько в самих наследниках, сколько в компонентах, размещенных на этих наследниках. Причем, одноименные свойства должны заменяться не всегда, а в зависимости от компонента, которому они принадлежат (просто поиск по текстовым фалам не сработает).
← →
jack128 © (2006-01-19 15:13) [2]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);
?
← →
jack128 © (2006-01-19 15:15) [3]Но вообще говоря, сильно сомниваюсь, что одним OnCreate траблы ограничатся..
← →
Игорь Шевченко © (2006-01-19 15:18) [4]jack128 © (19.01.06 15:13) [2]
1. Исходные классы менять не хочется.
2. Кто будет вызывать конструктор с установкой свойства ?
3. Хотелось бы иметь механизм, которому можно будет задать перечень классов для такой операции по замене свойств, и пусть он все остальное сам сделает. Классов (наследников) много.
← →
jack128 © (2006-01-19 15:43) [5]Игорь Шевченко © (19.01.06 15:18) [4]
1. Исходные классы менять не хочется.
тогда при чтении на TReader.OnFindMethod навесить процедурку, которая бы на "OnCreate" возвращала бы nil
Игорь Шевченко © (19.01.06 15:18) [4]
3. Хотелось бы иметь механизм, которому можно будет задать перечень классов для такой операции по замене свойств, и пусть он все остальное сам сделает. Классов (наследников) много.
а как этот общий механизм будет узнавать какие свойства и как изменять?
← →
Игорь Шевченко © (2006-01-19 15:55) [6]jack128 © (19.01.06 15:43) [5]
> а как этот общий механизм будет узнавать какие свойства
> и как изменять?
таблица вида:
имя_компонента.имя_свойства.старое_значение=новое_значение
← →
jack128 © (2006-01-19 16:05) [7]а..а в чем тогда проблема? ищи в тексовом представлении dfm строку "object имя_компонента" или "inline имя_компонента" или "inherited имя_компонента" и дописывай эту строку. ну еще нужно кой какие проверки из-за наследования сделать, но в любом случае - алгоритм достаточно простой, ИМХО
← →
Игорь Шевченко © (2006-01-19 16:11) [8]jack128 © (19.01.06 16:05) [7]
> Читать вручную текстовые файлы и разбирать их на свойства
> представляется крайне скучной задачей, делать которую можно
> только в том случае, если больше найдется никаких путей
> решения.
← →
Юрий Зотов © (2006-01-19 17:16) [9]Игорь, есть парсер DFM, специально под такую задачу когда-то написанный. Выполнен в виде компонента, который читает DFM (хоть текстовый, хоть бинарный) и по ходу пьесы генерит события: начался объект (любой - хоть компонент, хоть некомпонентский объект), встретилось свойство, объект закончился и т.д. В обработчиках этих событий можно приказать ему удалить текущий объект, изменить его класс, изменить значение любого свойства и т.д. При возникновении ошибки генерит исключение, передает в него нужную информацию и DFM не меняет.
Делаем маленькую утилитку, в ней кладем на форму этот парсер и пишем обработчики его событий - получаем возможность произвольного апдейта файлов форм. В самой утилите организуем пакетную обработку любого количества файлов и запись протокола.
Тестировался на нескольких тысячах файлов, глюков обнаружено не было. Могу его скинуть, если надо - позвони.
← →
Джо © (2006-01-19 17:22) [10]> [9] Юрий Зотов © (19.01.06 17:16)
А двоичные DFM от какой версии парсит? Или там различия несущественные?
Сорри, если оффтоп, просто интересно.
← →
Игорь Шевченко © (2006-01-19 17:25) [11]Юрий Зотов © (19.01.06 17:16) [9]
Юра, спасибо, буду очень признателен, если сбросишь на hs_siw[гав]mail[точка]ru
По телефону адрес диктовать неудобно :)
← →
Юрий Зотов © (2006-01-19 17:27) [12]> Джо © (19.01.06 17:22) [10]
Двоичный DFM имеет формат ресурса Windows, от версии Delphi он не зависит.
← →
Джо © (2006-01-19 17:33) [13]> [12] Юрий Зотов © (19.01.06 17:27)
Спасибо за разъяснение. Думал, что представление внутренних структур различается. Ведь старые версии Делфи не берут новые dfm, по крайней мере, это было, кажется на 3 Делфи.
← →
jack128 © (2006-01-19 17:59) [14]Джо © (19.01.06 17:33) [13]
это связано с тем, что в старших версиях дельфи строки сохраняются в UTF-8 (вроде. в общем в каком таком формате) а раньше в анси..
← →
Юрий Зотов © (2006-01-19 18:14) [15]> Игорь Шевченко © (19.01.06 17:25) [11]
Игорь, скину, но смогу только завтра, сегодня у меня его просто нет под рукой.
← →
Джо © (2006-01-19 18:29) [16]> [14] jack128 © (19.01.06 17:59)
Да, спасибо, это, похоже, именно поэтому. Плюс добавленные в новых версиях новые свойства, но это мелочи :)
← →
Юрий Зотов © (2006-01-19 19:32) [17]Игорь, таки нашел и отправил, лови почту.
← →
TUser © (2006-01-23 09:58) [18]Извините, что влезаю в беседу. В jedi (уж извините :) есть компонент, который свойства сохраняет/загружает в реестр или ini-файл. Я бы подсунул ему свой MemoryIni.
← →
Юрий Зотов © (2006-01-23 14:23) [19]> TUser © (23.01.06 09:58) [18]
Вряд ли речь в сабже идет об этом. Насколько я понял, требуется автоматизированная переделка DFM-файлов.
← →
Трубников Олег (2006-06-27 22:39) [20]
> Игорь, есть парсер DFM, специально под такую задачу когда-
> то написанный. Выполнен в виде компонента, который читает
> DFM (хоть текстовый, хоть бинарный) и по ходу пьесы генерит
> события: начался объект (любой - хоть компонент, хоть некомпонентский
> объект), встретилось свойство, объект закончился и т.д.
> В обработчиках этих событий можно приказать ему удалить
> текущий объект, изменить его класс, изменить значение любого
> свойства и т.д. При возникновении ошибки генерит исключение,
> передает в него нужную информацию и DFM не меняет.
>
> Делаем маленькую утилитку, в ней кладем на форму этот парсер
> и пишем обработчики его событий - получаем возможность произвольного
> апдейта файлов форм. В самой утилите организуем пакетную
> обработку любого количества файлов и запись протокола.
>
> Тестировался на нескольких тысячах файлов, глюков обнаружено
> не было. Могу его скинуть, если надо - позвони.
Уважаемый Юрий Зотов!
А скиньте мне тоже этот парсер DFM. Очень нужно.
trubnikov.oleg@rostokinolada.com Трубников Олег.
← →
Юрий Зотов © (2006-06-28 00:45) [21]Выслал в компилированном виде (D7)
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.101 c