2013-08-30 2 views
3

У нас есть большое приложение VCL с базой данных с базой данных, которое состоит из более чем 300 различных форм. Мы хотели бы предоставить базу данных практики (манекена) вместе с нашим программным обеспечением, которое устанавливается вместе с их производственной базой данных - с возможностью переключения между ними (для обучения/практики и т. Д.).Как я могу добавить границу для каждой формы в моем приложении без изменения кода каждой формы?

Проблема в том, что, когда пользователи используют режим практики, мы должны сделать что-то очень ясное, чтобы выделиться среди них, чтобы они знали, что они работают в режиме практики. Наиболее идеальным решением было бы поставить красную границу вокруг внутреннего края каждой отдельной формы. Но существует так много форм, что я не хочу изменять каждый из них.

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

Я не могу использовать стили VCL, иначе я бы реализовал его оттуда. Я ищу что-то на глобальном уровне, который может перебирать каждую форму и рисовать эту границу. Но это также означает ловить сообщения об изменении размера каждой формы и перерисовывать эту границу.

Самый простой способ, который я вижу, - создать базовую форму, которая имеет эту функциональность, и наследовать каждую форму через систему из этой базовой формы. Но это все равно означает, что каждая форма основывается на этом. У нас были другие проблемы в прошлом, модифицирующие базовые формы существующих форм (другой предмет), поэтому я хотел бы избежать этого решения, если есть еще одно более легкое решение.

+3

Ваши формы не основаны на собственном базовом классе? – bummi

+1

Если бы я разрабатывал эту систему с нуля, я бы определенно сделал базовую форму. Проблема в том, что программное обеспечение около 20 лет и огромно. Много разных форм уже наследуют много раз. –

+1

Итак, вставьте базовую форму. Что тебя останавливает? –

ответ

4

Есть способы подключиться к системе потоковой передачи формы, например, переопределяя TComponent.ReadState для вашей формы, чтобы добавить обработчик событий в TReader, обрабатывающий потоковое видео, но они требуют фактического изменения кода в классе формы. Кажется, что нет никакого способа глобально изменить поведение TReader во всей программе. Таким образом, без фактического базового класса формы для всех форм в вашем приложении нет простого способа сделать это.

В попытке установить исправление TComponent.ReadState в памяти было бы очень трудно сделать правильно, потому что это виртуальный метод, и для TCustomForm нет переопределения, поэтому любые сделанные вами изменения могут повлиять на все компоненты, а не только на формы.

Честно говоря, лучший способ справиться с этим - это, вероятно, просто укусить пулю и запустить глобальный поиск по вашей кодовой базе для class(TForm и изменить их все как подкласс какого-то нестандартного класса форм, который демонстрирует поведение, которое вы ищете для. Вероятно, есть теоретически другие способы его достижения, но для них потребуются очень волосатые трюки, которые могут иметь непредсказуемые побочные эффекты.

+0

Вы знаете, что, Оба ответа здесь включали окончательное решение, которое мне нужно, но этот был немного более подробно. Я продвигаюсь вперед и внедряю базовую форму, которая автоматически определяет, работает ли она в режиме производства или режиме тренировки. «Укусить пулю» - вот что мне нужно делать здесь. –

+1

@JerryDodge Я признаю, что это все еще поражает меня каждый раз, когда я вижу * «Я собираюсь» * взорвался в трехструнном сжатии. Это должна быть какая-то запись. –

+0

@J ... Это то, что мне нравится в английском языке: D –

4

Вам необходимо установить базовый класс. TMyBorderForm наследует от TForm и имеет поведение границы. Затем сделайте все ваши формы наследуемыми от TMyBorderForm, а не напрямую из TForm.

+4

Я не спускал вниз (просто увидел этот вопрос), но это, вероятно, потому, что вопрос конкретно требует решения, которое не требует изменения каждой формы, и этот ответ на 100% не соответствует части «не требует». Поэтому это не ответ на вопрос, заданный любыми средствами, и его нельзя размещать как один. (См. Существующие комментарии, которые предлагают это решение соответствующим образом - отправив его как комментарий вместо этого.) –

+0

Это то, что я сделал, просто принял другой ответ из-за большего объяснения. –

0

Существует ответ на ответ Криса, предполагая, что у вас есть ваши DFM, сохраненные как текст.

  1. Определите форму, из которой все формы наследуются.
  2. Вы загружаете все PAS файлы в текстовом редакторе и замените класс (TFORM) с классом (TMyBaseForm)
  3. IIRC вы также должны редактировать все файлы DFM - есть строка «объект», чтобы перейти в «наследуется ». Попробуйте это сначала с тестовым приложением, потому что я пишу это на основании того, что я делал в прошлом, и я не уверен, что этот ответ на 100% завершен.
  4. Вы добавляете функциональные границы (вкл/выкл) для TMyBaseForm

Строго говоря, это требует, чтобы «пройти через все формы», но «Открыть выбранные файлы» и «Заменить во всех открытых файлов» на самом деле не очень много ;-)

Единственным недостатком является то, что у вас еще нет ваших DFM, сохраненных в виде текста, вам придется сначала изменить это.

[Унаследовать от вашей собственной «базовой формы» часто бывает хорошо для крупных проектов. Мы используем это, например. для сторонних компонентов, которые не имеют свойств по умолчанию, которые мы хотим - если разработчики забывают изменить свойство по умолчанию, код времени выполнения в базовой форме обновит его].

+0

DFMs? Вы имеете в виду форму PAS-файлов? DFM не содержит этот код. –

+0

К сожалению, должны быть оба DFM и PAS. Ред. –

+0

Нет, DFM содержит имя уже измененного имени формы, а не 'TForm' –

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