Последняя версия DataExpress 3 beta от 9 октября 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

TListWindow

Вопросы о применении того или иного класса или функции.
drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Ср май 17, 2017 7:07 pm

admin писал(а):Не обращайтесь к Self в обработчиках. Обращаться к Self можно ТОЛЬКО в самой функции выражения. Узнать форму можно через свойство Owner компонента, который сгенерировал событие.
это я обращаюсь в самой функции, чтобы передать параметр (в данном случае имя поля для фильтра). Т.к. функция может вызываться неоднократно, то и параметр перезаписывается каждый раз. Как его сделать уникальным для каждого случая вызова. Вот в чем вопрос.
Переделал функцию по Вашему совету, убрал глобальные, добавил проверку панели (по имени добавленного компонента)- все классно. Остался вот вопрос с уникальностью. Блин.

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

Re: TListWindow

Сообщение admin » Ср май 17, 2017 7:34 pm

Ну можно привязываться к имени компонента + какой-нибудь префикс/постфикс.

drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Ср май 17, 2017 7:38 pm

Я так и делаю при проверке уникальности. А из tlistwindow можно как-то получить вызвавший его комбобокс?

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

Re: TListWindow

Сообщение admin » Ср май 17, 2017 7:47 pm

drts писал(а):Я так и делаю при проверке уникальности. А из tlistwindow можно как-то получить вызвавший его комбобокс?

В обработчике OnCreateListWindow Sender это и есть комбобокс. Его можно сохранить в параметрах aWindow.

drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Ср май 17, 2017 10:45 pm

А, ну да. Просто мне его надо передать в обработчик onchenge edit'a, вот в чем затык. Ладно я пока отступлюсь, но потом вернусь на свежую голову. )))

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

Re: TListWindow

Сообщение admin » Ср май 17, 2017 10:55 pm

drts писал(а):А, ну да. Просто мне его надо передать в обработчик onchenge edit'a, вот в чем затык. Ладно я пока отступлюсь, но потом вернусь на свежую голову. )))


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

procedure EditChange(Sender: TObject);
var
   Edit: TEdit;
   ListWnd: TListWindow;
   Cbx: TdxLookupComboBox;
begin
   Edit := TEdit(Sender);
   ListWnd := TListWindow(Edit.Owner);
   Cbx := TdxLookupComboBox(ListWnd.Params.Objects['combobox']);
end;

drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Ср май 17, 2017 11:40 pm

Спасибо. Хороший вариант. Направление понятно.

drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Пт май 19, 2017 11:18 pm

Добрый день!.
Все-таки домучал передачу параметра из одной формы в окно списка соответственно другой формы.
Но я вижу, что решение явно неоптимальное. Может, в порядке передачи опыта, покритикуете подход? Мне кажется, что получилась стрельба из пушки по воробьям.
Итак: требуется передать некий строковый параметр из функции выражения в обработчик изменения созданного на ToolBar окна списка компонента TEdit (т.е. из одной формы в какую-то другую)
Для начала я сохраняю строку в параметр главной формы, чтобы его можно было достать отовсюду:

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

MainWindow.params.values['dr_fldFilter'+(objCombo.name)]:=fldName;

При этом создаю постфикс по имени комбобокса, вызывающего окно списка.
далее в обработчике OnCreateListWindow комбобокса считываю параметр из mainwindow в параметр TListWindow.

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

lw.Params.Values['dr_fldFilter']:=MainWindow.params.values['dr_fldFilter'+(objCombo.name)];

И в обработчике текстового поля, я сначала получаю объект родительского окна списка и считываю параметр окна списка:

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

s:=lw.Params.Values['dr_fldFilter'];

Итого ТРИ шага, чтобы передать ОДНУ переменную. Просто передать её глобальной переменной нельзя, т.к. если функции выражения используются многократно (для разных объектов), то сохраняется параметр из последней записанной функции.
Вопрос: а можно как-то короче? как можно получить в обработчике текстбокса что-нибудь уникальное, что будет и в функции выражения (или точнее в форме, на которой функция вызывается)? Я попробывал всё, но сразу, в один шаг у меня не получается. Спасибо

neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Re: TListWindow

Сообщение neitri » Сб май 20, 2017 6:52 am

Я что то не пойму что вы пытаетесь между формами передать?
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

drts
Опытный
Сообщения: 264
Зарегистрирован: Сб окт 29, 2016 11:35 pm
Откуда: Новороссийск

Re: TListWindow

Сообщение drts » Сб май 20, 2017 7:48 am

Из функции выражения (она срабатывает на какой-то форме) нужно передать строковую переменную в обработчик компонента, созданного в панели окна списка другой формы. Вот смотрите. У меня объект (комбобокс) лежит на форме. (Даже не один-несколько). Там же на форме надпись с выражением, в котором имеется функция. drFilterPanel. Она добавляет в окно списка для объекта возможность фильтровать данные при вводе в поле поиска. (Посмотрите мой модуль drts в соотв. теме). При одновременном использовании функции для нескольких объектов возникла необходимость передавать параметр функции независимо для каждого вызова. Я решил этот вопрос путем записи в params. Значения с именем, включающим индивидуальный постфикс. Такой признак я нашел один- имя комбобокса. Но оно недоступно из обработчика текстового поля, размещенного на окне списка. Ибо родитель его- другая форма. Приходится делать, как я описал выше. Все работает без замечаний. Я тестирую- пока норм. Но зуд не даёт мне успокоиться и найти более оптимальный способ передачи параметра. )))


Вернуться в «Вопросы по API DataExpress.»