Последняя версия DataExpress 3 beta от 4 апреля 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Песочница
ИзображениеИзображениеИзображение

Обращение к формам из Main

Все о том как сделать что-то с помощью скриптов.
kok80
Эксперт
Сообщения: 327
Зарегистрирован: Пн июл 02, 2018 9:45 pm
Благодарил (а): 2 раза
Поблагодарили: 23 раза

Обращение к формам из Main

Сообщение kok80 » Вт авг 14, 2018 3:14 pm

В DataBase_Open делаю кнопку на MainWindow.Toolbar, например для реализации своего механизма команды "дублировать". При нажатии"Дублировать" для каждой формы должна вызываться своя функция (разные названия, кол-во полей и тд). В модуле Main могу повесить на onClick функцию, находящуюся также в Main. В модуле каждой формы могу повесить свой обработчик на onClick.
Вопрос: как отследить смену текущей формы? В Main повесил обработчик MainWindow.pages.OnChange:=@OnChange, отслеживает смену вкладок форм (TPageControl), но как TPageControl привязать к форме ?

Или правильно из Main обращаться к формам по имени компонента формы ? В мануале написано:
"Обращение к форме
Обратиться к форме можно по имени компонента формы, например Form1. Но лучше обращаться к форме через специальную переменную Self, которая всегда указывает на текущую форму в модуле."

Но как это сделать, я чего-то не понял. При попытке вызова из Main: debug(form1.classname) получаю ошибку "List index (15) out of bounds". При открытии формы база еще не знает про существование form1 ?

jurist23rus
Эксперт
Сообщения: 2684
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 18 раз

Re: Обращение к формам из Main

Сообщение jurist23rus » Вт авг 14, 2018 4:35 pm

kok80 писал(а):как TPageControl привязать к форме ?

TdxPageControl.ActivePage.Caption - это свойство содержит человекочитаемое название формы. То же самое есть у формы TdxForm.FormCaption

Обращение к компонентам другой формы может быть только через FindComponent.

Но как это сделать, я чего-то не понял. При попытке вызова из Main: debug(form1.classname) получаю ошибку "List index (15) out of bounds". При открытии формы база еще не знает про существование form1 ?

Вообще, для нормального разговора лучше бы вам выложить код скрипта. Так как слишком много вопросов. Чтобы обратиться к форме из Main её придётся создать. Вы Form1 создали?
Destiny is a very convenient word for those who never take decisions.

kok80
Эксперт
Сообщения: 327
Зарегистрирован: Пн июл 02, 2018 9:45 pm
Благодарил (а): 2 раза
Поблагодарили: 23 раза

Re: Обращение к формам из Main

Сообщение kok80 » Вт авг 14, 2018 8:30 pm

теперь понятно, что для открытия формы в main ее нужно создать. Теперь вопрос - как получить в main Recid текущей записи формы, те той, что выделена в форме на экране?
Первая мысль - на событие при смене текущей записи Recid писать в глобальную переменную, из которой в main ее можно прочитать.
Вложения
test1.zip
(45.47 КБ) 41 скачивание

Аватара пользователя
admin
Разработчик
Сообщения: 4756
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 24 раза
Поблагодарили: 207 раз

Re: Обращение к формам из Main

Сообщение admin » Вт авг 14, 2018 9:27 pm

У главного окна есть свойство FormViews для доступа к формам. К текущей форме можно так обратиться:

Код: Выделить всё

Fm := MainWindow.FormViews[MainWindow.Pages.ActivePageIndex].Form;

kok80
Эксперт
Сообщения: 327
Зарегистрирован: Пн июл 02, 2018 9:45 pm
Благодарил (а): 2 раза
Поблагодарили: 23 раза

Re: Обращение к формам из Main

Сообщение kok80 » Вт авг 14, 2018 11:30 pm

Спасибо, как обратиться к форме понятно. Следующий вопрос: как при создании нового элемента формы из main присвоить ему значение ?

Этот код не работает (т. е. V получает строку, форма открывается, но dxEdit1 пустой):

Код: Выделить всё

v:=tdxedit(fm.FindComponent('dxEdit1')).text;
fm.append;
tdxedit(fm.FindComponent('dxEdit1')).text:=v;
if fm.EditWindow.ShowModal = mrOk then fm.Post else fm.Cancel;


при этом код из формы работает (в базе добавил вторую кнопку, на нее обработчик в модуле формы1)

Код: Выделить всё

  v:=self.ass['поле1'];
  self.append;
  self['поле1']:=v;
  if self.EditWindow.ShowModal = mrOk then self.Post else self.Cancel;
Вложения
test1.zip
(46.54 КБ) 46 скачиваний
Последний раз редактировалось admin Вт авг 14, 2018 11:30 pm, всего редактировалось 2 раза.
Причина: Код должен быть в теге code! Ставьте точки в "те"!

jurist23rus
Эксперт
Сообщения: 2684
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 18 раз

Re: Обращение к формам из Main

Сообщение jurist23rus » Ср авг 15, 2018 8:34 am

В первом случае вы записываете значение не в поле формы, а в компонент, поэтому оно не сохраняется.
Нужно так

Код: Выделить всё

Fm['поле'] := 'значение'
Destiny is a very convenient word for those who never take decisions.

kok80
Эксперт
Сообщения: 327
Зарегистрирован: Пн июл 02, 2018 9:45 pm
Благодарил (а): 2 раза
Поблагодарили: 23 раза

Re: Обращение к формам из Main

Сообщение kok80 » Ср авг 15, 2018 6:42 pm

Спасибо, с этим тоже разобрался. Следующий вопрос: 1) как вызвать программно "дублировать" из main?
fm.grid.popupmenu.items[MI_FORM_DUPLICATE].onclick; - не работает
debug(fm.grid.popupmenu.items[MI_FORM_DUPLICATE].caption); - пишет "дублировать"

2) Почему без grid (fm.popupmenu.items[MI_FORM_DUPLICATE].onclick) выдает ошибку ? TdxForm наследует у Tcontrol PopupMenu.

ps действие при нажатии правого крестика на второй форме
Вложения
test1.zip
(46.74 КБ) 49 скачиваний

Аватара пользователя
admin
Разработчик
Сообщения: 4756
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 24 раза
Поблагодарили: 207 раз

Re: Обращение к формам из Main

Сообщение admin » Ср авг 15, 2018 9:36 pm

1. Так будет работать:

Код: Выделить всё

fm.grid.popupmenu.items[MI_FORM_DUPLICATE].onclick( fm.grid.popupmenu.items[MI_FORM_DUPLICATE] );
// или так
fm.grid.popupmenu.items[MI_FORM_DUPLICATE].click;
2. Потому что контекстное меню привязывается к определенному контролу. В данном случае меню привязано к контролу TdxGrid, который связан с формой. К форме меню не привязано.

kok80
Эксперт
Сообщения: 327
Зарегистрирован: Пн июл 02, 2018 9:45 pm
Благодарил (а): 2 раза
Поблагодарили: 23 раза

Re: Обращение к формам из Main

Сообщение kok80 » Ср авг 15, 2018 10:52 pm

Спасибо, все заработало.