Страница 1 из 2

Embedded-обновление данных

Добавлено: 24 ноя 2006, 17:56
evchic
Такой вопрос:

На фейсе есть Tree
чуть ниже tabbedSheet
в нем встроен фейс

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

Embedded scINFOS1 'Предопределенные данные' interface qwe;
end;
В нем браузер.

Нужно при переходе по дереву обновлять данные в interface qwe(в Браузере)

Добавлено: 26 ноя 2006, 17:29
dp
если на вскидку (так как не видно всего текста)

и у дерева и у скрина можно прописать атрибут table.

если одна и таже таблица - то будет само отрисовываться,
если разные и то перерисовывайте какими либо путями - ReDrawPanel, ReScanPanel и т.п. по событиям смены позиции в дереве

Добавлено: 20 июн 2008, 10:39
Алексей
evchic Вам удалось добиться? у меня аналогичная ситуация, поле обновляю во встроенном фейсе (он дочерняя табличка основной) а вверху обновляется только когда меняешь закладку.

Добавлено: 20 июн 2008, 11:46
evchic
несовсем сделал по другому

Добавлено: 20 июн 2008, 12:05
Алексей
evchic :) Как?

Добавлено: 20 июн 2008, 12:06
edward_K
вставте в главный фейс
cmIdle:
{ rescanpanel(tnваша_табла)
}
это поможет 100%.
Другой путь - отправить Notify в cmUpdateRecord дочернего фейса
(но она в доке не описана).
можно еще конечно в cmUpdateRecord попробовать вызвать PutCommand(cmValue30) а в главном по этой команде сделать rescan

Добавлено: 20 июн 2008, 12:31
Алексей
1. рескан конечно хорошо, но в айдл - не будет грузить систему? что-то не хочется так..
2. с нотифай есть примерчики?
3. во встроенном пут отрабатывает а в родном не ловится....

Добавлено: 20 июн 2008, 12:41
Алексей
хм. через
notify(cmValue30,0) передалось и поймалось. Только вот ни ресканпанел ни реридрекорд не меняют данные на экране... только мышкой ткнешься - меняется...

Добавлено: 20 июн 2008, 12:46
Алексей
Упс... edward_K спасибо. Не ту таблицу ресканил. Всё отработало.

Добавлено: 20 июн 2008, 13:14
edward_K
По стандарту конечно bindevent надо и возможно какой то промежуточный объектный фейс.
насчет грузить заведите переменную и блокируйте по ней повторное обновление. само собой переменную надо в дочке и обновлять функцией в главном.

Добавлено: 09 июл 2008, 11:37
Алексей
А как во встроенный интерфейс передать нрек, чтобы внутри него произошло позиционирование по нужной записи?

Добавлено: 09 июл 2008, 11:48
Алексей
Видимо надо процедуру позиционирования написать и в ней позиционироваться.
И вызывать её перед вызовом окна, где используется этот встроенный интерфейс...

Добавлено: 08 авг 2008, 11:38
Den_Is
Алексей писал(а):хм. через
notify(cmValue30,0) передалось и поймалось. Только вот ни ресканпанел ни реридрекорд не меняют данные на экране... только мышкой ткнешься - меняется...
1. Чему равен cmValue30?

2. Где и как описать функцию Notify?

Добавлено: 08 авг 2008, 15:58
edward_K
1. распакуйте все архивы в папочке frm и там поиском пройдитесь. Использовать явно я бы не советовал - в следующей версии могет поменяться.
2. Нигде. Эта функция специально разрабатывалась для зарплаты и кадров и кроме как там не используется..

Добавлено: 09 авг 2008, 02:39
Screw
1. Классический метод синхронизации - использование объектных интерфейсов (либо со стороны встроенного интерфейса, либо со стороны контейнера) для управления содержимым друг друга.

Типа этого (управляем встроенным интерфейсом):
objinterface IDriven;
procedure MoveTo(RecordNumber: comp);
...
end;

Понятно, что втроенный интерфейс должен реализовывать IDriven. Контейнер в нужный момент дёргает метод MoveTo, передавая в него номер текущей записи. Встроенный меняет позицию и перерисовывается ({Redraw|Rescan}Panel - в зависимости от того, отображаются данные в скрине или в браузе). Впрочем, перерисовку лучше вынести в отдельный метод. Логично предусмотреть метод для жесткого передергивания записи (ReReadRecord). Синхронизацию лучше выполнять в cmIdle контейнера.

2. Notify рассылает широковещательное сообщение всем вставленным в десктоп интерфейсам (не уверен насчет тех, которые загружены в память, но в деск не вставлены). Кроме кода сообщения, в функцию передаётся дополнительный параметр InfoPtr: longint. Notify возвращает значение, отличное от 0, если какой-либо из интерфейсов, вызывал в обработчике события метод Stop. Значение дополнительного параметра можно получить в обработчике события с помощью функции GetNotificationInfoPtr: longint;