2008-11-06 1 views
2

Итак, у меня есть форма в VB, которая видна, кроме случаев, когда программа запускается беззвучно, и в этом случае форма все еще загружается, но взаимодействия выполняются программно. Однако в крошечном числе случаев я хочу, чтобы формы, созданные в невидимой форме, были видимыми. Каков наилучший способ достичь этого, в идеале, без создания новых форм. Некоторые идеи, которые я придумал, но на самом деле не нравится:VB6: Взаимодействие с невидимой формой

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

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

Edit: В некоторой степени я mistated мою проблему: Вопрос заключается в том, что я хочу, чтобы переработать часть моего существующего пользовательского интерфейса, но не все. Таким образом, делая части, я не хочу, чтобы пользователь видел невидимым, но создавал видимые меню. Разделение отдельных компонентов пользовательского интерфейса, вероятно, в конечном итоге добавит дополнительную сложность в программу.

ответ

1

последний вариант предпочтительнее; после рефакторинга не должно быть избыточного кода

fiddling with invisible forms - довольно хороший признак необходимости рефакторинга!

+0

Последний optiojn определенно лучше, но это также, вероятно, плохая идея. Серьезный рефакторинг - это не то, что я считаю хорошей идеей прямо перед выпуском продукта. – Brian

+0

@Brian: ваш звонок на этот; лично я бы, по крайней мере, попробовал, скорее всего, реорганизованный код будет лучше, чем то, что вы получили от его звука! [и не забудьте тщательно протестировать] –

+0

Часть вопроса заключается в том, что соответствующий код GUI вызывается с помощью событий, которые не работают, когда выполняются внутри модуля. – Brian

0

Я также рекомендую последний вариант. То, что я сделал бы, чтобы безопасно реализовать с наименьшим количеством изменений, выглядит следующим образом.

Сделайте резервную копию или проверьте все в своем источнике управления и создайте ветку.

Создайте новый проект DLL ActiveX. Я бы назвал его некоторым вариантом UI_Controller

Примечание: Новый проект заставит вас идентифицировать скрытые зависимости в EXE.

Имейте ссылку на все, что есть в EXE прямо сейчас.

Имейте проект проекта EXE в UI_Controller.

Сделайте класс для каждой основной формы приложения.

Скопируйте малые диалоги в DLL UI_Controller.

Для каждой формы сделать класс интерфейса в UI_Controller DLL (форма будет реализации этого)

Пример, если у вас есть шесть основных форм вы затем шесть форм интерфейсов и шесть контроллеров классов

Go через форму для каждой процедуры и события КОПИРОВАТЬ процедуру, относящуюся к классу контроллера пользовательского интерфейса, и сделать ее общедоступной.

Убедитесь, что каждый класс контроллера имеет процедуру Init.

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

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

Изменение любых прямых ссылок на форму на вызов по интерфейсу.

Имейте основные формы для реализации каждого интерфейса. Сделайте класс GlobalMultiUse в вашей DLL-контроллере UI, который позволяет EXE регистрировать каждую форму с помощью своего контроллера. Подпрограммы реестра должны принимать только объект интерфейса формы. В вашей инициализации приложения передайте каждую основную форму правильной функции регистрации, прежде чем делать что-либо еще.

Запустите проект и исправьте ошибки. Обратите внимание, что фактическая функция вашего программного обеспечения должна оставаться такой же, как вы должны были только копировать и осуществлять.

Когда программное обеспечение работает без ошибок. Проверьте его в исходном элементе управления или сделайте резервную копию.

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

Когда вы закончите, убедитесь, что инициализация формы контроллера вызвана в разделе инициализации вашего приложения. Для этого вам нужно переключиться на использование Sub Main.

Когда это работает правильно, работайте в другой форме. Продолжайте делать это до тех пор, пока все формы не будут преобразованы.

Очистить все, что не используется.

Тестирование, и если оно пройдет, все готово.

У вас есть приложение, в котором вы можете разорвать текущий пользовательский интерфейс и заменить на все, что реализует интерфейсы формы. Таким образом, вы можете иметь невидимый EXE, единичный тест EXE и ваш обычный EXE.

Вам нужно будет решить, что лучше всего подходит для вас в зависимости от сложности вашего приложения. Вы можете иметь частичное преобразование, в котором вы предоставляете только один или два типа класса контроллера.