Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Как автоматизировать замену значений свойств в формах ?   Найти похожие ветки 

 
Игорь Шевченко ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.04 c
1-1170303300
APiC
2007-02-01 07:15
2007.04.15
реестр


3-1169454228
Егоров А.Н.
2007-01-22 11:23
2007.04.15
Выражение CASE в операторе SELECT


2-1173550329
Washington
2007-03-10 21:12
2007.04.15
CheckBox


2-1175002596
Tor
2007-03-27 17:36
2007.04.15
Grid или DBGrid


2-1174946193
Fluxay
2007-03-27 01:56
2007.04.15
как вычленить названия методов и классов