Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
15-1173574666
WME
2007-03-11 03:57
2007.04.15
Японы дети переходят с Windows ME на Линукс


2-1174917088
Sergionio
2007-03-26 17:51
2007.04.15
combobox и список таблиц


2-1175127004
Lavrenty
2007-03-29 04:10
2007.04.15
Курсор в TMemo


11-1155806234
F1
2006-08-17 13:17
2007.04.15
class window in kol


15-1174119405
Vlad Oshin
2007-03-17 11:16
2007.04.15
Мысли про детей женского пола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский