OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 12:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Тонкости механизмов Sql
СообщениеДобавлено: Понедельник, 27 Февраль, 2006 14:34 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Всем привет!

Три вопроса.

У меня такая проблема - не обновляется контрол SqlControls.Table.
Он прилинкован к интерактору

Код:
tb* : SqlDB.Table;


а код примерно такой:

Код:
tb := db.NewTable();
tb.Exec("SELECT * FROM people LIMIT 5");
Dialog.Update(tb);

И ничего не происходит.
Далее начинается интересное. Если контрол отлинковать от интерактора, а затем прилинковать снова, то отображение обновится.

Более того, если сделать
Код:
tb := NIL;
Kernel.Cleanup;

то, как я понял доку, сборщик мусора должен уничтожить таблицу.
Но отображение даже после отработки сборщика мусора продолжает хранить старые данные.

Другой вопрос - в доке сказано, что при закрытии окна с якорем и не-NIL таблицей возможно запросить юзера - закрывать или нет.
Какой disabled надо устанавливать в TRUE, чтобы это произошло?

Третий вопрос - как обработать закрытие окна, когда юзер нажал на крестик? В этом случае хотелось бы проделать какие-то дополнительные действия. Есть подозрение, что это запросто можно реализовать с помощью того же якоря, но единственный ли это способ?

С уважением.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 27 Февраль, 2006 15:46 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
1. Обновлять надо через
Код:
Dialog.UpdateList(tb)


2.
Цитата:
Какой disabled надо устанавливать в TRUE, чтобы это произошло?

Код:
PROCEDURE AnchorGuard* (VAR par: Dialog.Par)
BEGIN   
   par.disabled := TRUE
END AnchorGuard;

3. Это самый простой способ
Код:
PROCEDURE AnchorNotifier*;
BEGIN
 какие-то дополнительные действия.
END AnchorNotifier;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Всё получилось!
СообщениеДобавлено: Понедельник, 27 Февраль, 2006 22:58 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Ура, всё заработало!
Причина была в том, что я держал форму в режиме LayOut. В результате табличный контрол ссылался на старые данные.
Как только инициализация NewTable была размещена перед открытием формы - таблица обновилась как надо.

Коллеги, спасибо за помощь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Про свойства контролов
СообщениеДобавлено: Воскресенье, 05 Март, 2006 00:53 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Такая ситуация: размещаю на форме табличный контрол (SQL, Insert Table).
Теперь хочется поменять свойства этого отображения.
Надо делать собственную процедуру Deposit (что влечёт ручное создание контрола) или можно как-то отыскать уже созданный контрол в регистре отображений?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 05 Март, 2006 01:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Конечно, можно.

Код:
VAR v: FormViews.View;
  m: FormModels.Model;
  subv: Views.View;
  rd: TextModels.Reader;
...
StdCmds.OpenToolDialog(...);
v := formViews.Focus();
IF v # NIL THEN
  m := v.ThisModel();
  rd := m.NewReader(NIL);
  rd.ReadView(subv);
  WHILE (sub # NIL) & ~(subv IS SqlControls.Table) DO
    rd.ReadView
  END;
  IF subv # NIL THEN
    ... здесь мучаем таблицу ....
  END
END;


Вот написал код и понял, что компилироваться он не будет.
И все было бы замечательно, если бы не одно но: тип SqlControls.Table не экспортирован. Поэтому проверить subv IS ... мы не можем. Менять стандартную подсистему мы не будем. Надо, чтобы под руками был экземпляр таблицы - пусть это anyTable. Тогда можно проверить одинаковость тега типа у считанного subv и anyTable. Это можно сделать тремя способами:

1) Kernel.TypeOf(subv) = Kernel.TypeOf(anyTable) - но Kernel без нужды лучше никогда не импортировать..
2) SYSTEM.TYP(subv) = SYSTEM.TYP(anyTable) - генерирует вызов предыдущей функции, но IMPORT SYSTEM все же правильней, чем IMPORT Kernel
3) Вот нашел функцию верхнего уровня: Services.SameType(subv, anyTable) - этот вариант лучше всего и использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 05 Март, 2006 03:51 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Как будто гладим кошку против шерсти...
Получается, что использование закрытого модуля SqlControls совместно с некоторой автоматизацией размещения в режиме дизайна приводит к недоступности контрола. И его придётся "выковыривать" из внутренностей каркаса BB полухакерскими способами :) Взять отображение по фокусу, потом поднять модель отображения, потом ридера (Курьера), дальше бежать по совокупным отображениям...

Всё-таки дешевле будет создать свой контрол, тем более что хочется раскрашивать строки/поля, рисовать иконки на строчках и прочая...
Думаю, было бы лучше открыть SqlControls.Table для расширения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 05 Март, 2006 15:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Взять отображение по фокусу, потом поднять модель отображения, потом ридера (Курьера), дальше бежать по совокупным отображениям...

Это как раз не хакерский, а штатный способ работы - при обработке текстов и т.п.

Хакерское НО здесь только в том, что доступа к типу таблицы-то нет! Ну, у нее и не предусмотрена возможность настройки. Хотите настраивать - нужно написать свой вариант. Хотя я обычно копировал готовое и только изменял под себя - с нуля гораздо больше возни.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 05 Март, 2006 15:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Думаю, было бы лучше открыть SqlControls.Table для расширения.


Открыть - да, для расширения - нет. Расширение от неабстрактного типа порождает опасные проблемы - уже обсуждали и по тому же поводу:
http://blackbox.metasystems.ru/forum/vi ... .php?t=107


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 05 Март, 2006 19:04 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Цитата:
штатный способ работы - при обработке текстов и т.п.


Я хотел сказать, что если параметры уже известны, то логичнее настроить контрол до того, как он появится на экране, а не наоборот.
А то, что BB предоставляет средства для получения информации о сущностях в рантайме - несомненный плюс инструмента.

Цитата:
Расширение от неабстрактного типа порождает опасные проблемы.


Жаль, конечно, что нельзя в данном случае просто расширить уже имеющиеся абстракции. Вопрос, почему типы SqlControls сделаны нерасширяемыми, относится к разработчикам. Ну, наверное, были на то причины.
Да и ладно, хорошо что есть исходники :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB