Вверх ↑
Этот топик читают: Гость
Ответов: 53
Рейтинг: 1
#1: 2013-05-09 20:49:50 ЛС | профиль | цитата
Нужно реализовать чтобы при запуске дочерней формы все компоненты в ней обнулились (поля, таймеры и т.д.) тоесть чтобы дочерняя форма как-бы стартовала все время заново. Соответственно и при закрытии дочерней формы все процессы в ней (таймеры, циклы и т.д.) убивались.

Как вариант пробовал ChildFormEx в режиме Mode=OnlyOnce с показом как модальной (doShowModal) - все хорошо и запускается по новой и убивает все после закрытия, но одна беда - в главной родительской форме стоит асинхронный COM-порт и он передает данные в дочернюю форму и дочерняя форма отправляет данные назад. Данные передаются в дочернюю форму нормально, а при попытке что-то отправить в порт - программа вываливается с ошибкой, причем непонятно какой, каждый раз по разному или с зависанием или с закрытием программы... Я так понимаю - это из-за модальности так-как процессы основной формы заморожены и чегото туда сувать в это время некоректно?

Можно как-то сделать по другому? Или всетаки придется мостить кучу линков на сбросы и остановки компонентов в дочерней форме?
------------ Дoбавленo в 20.49:
PS Походу это таки связано с работой асинхронного порта в главной форме (именно выдаче данных для дочерней формы). Я так понимаю - это тупик, так как работа в основной форме должна быть остановлена, а асинхронный порт там что-то делает, что и вызывает неадекватную реакцию... да и порт асинхронный, как а понимаю, не совсем стандартный компонент... Жалко (
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#2: 2013-05-10 08:11:15 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-17 15:02:06
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#3: 2013-05-10 11:00:43 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-17 15:02:06
карма: 0

0
Ответов: 9906
Рейтинг: 351
#4: 2013-05-10 11:11:27 ЛС | профиль | цитата
Задрало уже это OnlyOnce...

Вот захотелось кому-то дать умное слово. Неизвестно зачем.
Единственное использование св-ва Mode в кодах:


#pas
procedure THIMultiElementEx.SetCreateProc;
begin
FOnCreate := Value;
if _prop_Mode<>0 then exit; // Все, больше это св-во нигде на используется
FChild := CreateInstance;
FList.Add(FChild);
end;

Что означает, что даже Standart отличается от Dynamic - ТОЛЬКО стартовым созданием одного экземпляра схемы.
И все.
карма: 9

0
Ответов: 53
Рейтинг: 1
#5: 2013-05-10 19:43:12 ЛС | профиль | цитата
Ошибка выдается следующая


Такая ошибка вываливается в момент когда с асинхронного порта приходит сообщение в МТ-потоке(зачастую сообщение об ошибке бесконечно множится, иногда просто прога закрывается со звуком ошибки и без сообщения) Это если ChildFormEx в режиме Mode=OnlyOnce с показом как модальной (doShowModal). Как только Mode=Standard - ошибка не выскакивает при том-же модальном показе.

Собрал небольшую схемку с дной ChildFormEx и асинхронным портом и не смог повторить ошибку - все работает и в Mode=OnlyOnce и в Mode=Standard. Очевидно - это комплексная проблема, гдето запрятаная в переплетении схемы, и до момента пока не начну приводить схему в порядок будет проблематично ее диагностировать...
Буду всетаки делать повторные инициализации при показе формы и сбросы при ее закрытии.

Или есть способ как в дочерней форме все сбросить без Mode=OnlyOnce в момент ее закрытия?
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#6: 2013-05-10 21:10:25 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-17 15:02:06
карма: 0

0
Ответов: 53
Рейтинг: 1
#7: 2013-05-11 00:24:41 ЛС | профиль | цитата
Тут именно форма нужна.
Суть такая: программа-настройщик постоянно висит в UART-сети, тоесть COM-порт открыт в главной форме (и его нельзя закрыть и открыть еще гдето, так как постоянно передаются пакеты информации). Какие либо действия (посылка настроек в сетевое устройство или еще чего) выполняются в открываемых дочерних формах (так как физически это невозможно уместить на одном поле главной формы). С каждой формы мало того, что шлются пакеты информации в КОМ порт (тот что в главной форме), так еще и принимаются ответы от устройства о доставке пакета. И кстати, по пути следования пакета к дочерней форме, он пересекает еще пару панелей...
Вот так выглядит дочерняя форма сохранения настроек кнопок пульта



------------ Дoбавленo в 00.24:
PS.
net-2-40-100-232.cust.dsl писал(а):
Есть же динамические контейнеры с точками ##... отработала схема и уничтожайте экземпляр
Это-же есть и в формах! Чего-то я про это не подумал.

В справке написано:
"Динамический - основной режим работы всех динамических элементов контейнеров. В этом режиме внутренняя схема не создается в программе до тех пор, пока не будет вызван метод ##Add(подробнее об этом читайте в справке по компоненту) и соответственно живет и работает все время до её принудительного уничтожения методом ##Delete или ##Clear."
В справках на компоненты описания точек ## нет. Где можно о них почитать подробней?
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#8: 2013-05-11 01:50:35 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-17 15:02:06
карма: 0

0
Ответов: 53
Рейтинг: 1
#9: 2013-05-11 02:07:54 ЛС | профиль | цитата
Как точки поставить я знаю.
И про контейнеры документ читал. Но где более детально описание лежит? Хотябы какие точки вообще есть (перечень).
Вроде как работает на элементарной схеме:
code_30976.txt

Буду пробовать в реальной программе...
карма: 0

0
файлы: 1code_30976.txt [3.2KB] [101]
Гость
Ответов: 17029
Рейтинг: 0
#10: 2013-05-11 02:21:08 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-17 15:02:06
карма: 0

0
Ответов: 3851
Рейтинг: 159
#11: 2013-05-11 04:21:03 ЛС | профиль | цитата

%HiAsm%TutorialMultiElementEx.sha
карма: 0
начавший
0
Ответов: 53
Рейтинг: 1
#12: 2013-05-11 23:16:14 ЛС | профиль | цитата
Andrey писал(а):
%HiAsm%TutorialMultiElementEx.sha

Спасибо - это то что нужно.

Andrey писал(а):
А вот этого я чет не понял. Перечень каких точек имеется ввиду?

Вот перечень точек, из документа выше:
##add - добавляет в массив новую копию схемы и устанавливает её текущей.
##select - устанавливает текущей схему, индекс которой указан в потоке
##delete - удаляет из массива схему, индекс которой указан в потоке. при этом текущая схема не устанавливается.
##hselect - устанавливает текущей схему, индентификатор которой указан в потоке
##clear - удаляет все схемы из элемента
##hdelete - удаляет из массива схему, идентификатор которой указан в потоке. при этом текущая схема не устанавливается.
##count - содержит количество элементов в массиве
##index - содержит индекс текущей схемы в массиве
##handle - содержит идентификатор текущей схемы

карма: 0

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)