OberonCore
https://forum.oberoncore.ru/

Тонкости механизмов Sql
https://forum.oberoncore.ru/viewtopic.php?f=5&t=121
Страница 1 из 1

Автор:  Иван Кузьмицкий [ Понедельник, 27 Февраль, 2006 14:34 ]
Заголовок сообщения:  Тонкости механизмов Sql

Всем привет!

Три вопроса.

У меня такая проблема - не обновляется контрол 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, чтобы это произошло?

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

С уважением.

Автор:  Trurl [ Понедельник, 27 Февраль, 2006 15:46 ]
Заголовок сообщения: 

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 ]
Заголовок сообщения:  Всё получилось!

Ура, всё заработало!
Причина была в том, что я держал форму в режиме LayOut. В результате табличный контрол ссылался на старые данные.
Как только инициализация NewTable была размещена перед открытием формы - таблица обновилась как надо.

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

Автор:  Иван Кузьмицкий [ Воскресенье, 05 Март, 2006 00:53 ]
Заголовок сообщения:  Про свойства контролов

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

Автор:  Илья Ермаков [ Воскресенье, 05 Март, 2006 01:42 ]
Заголовок сообщения: 

Конечно, можно.

Код:
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 ]
Заголовок сообщения: 

Как будто гладим кошку против шерсти...
Получается, что использование закрытого модуля SqlControls совместно с некоторой автоматизацией размещения в режиме дизайна приводит к недоступности контрола. И его придётся "выковыривать" из внутренностей каркаса BB полухакерскими способами :) Взять отображение по фокусу, потом поднять модель отображения, потом ридера (Курьера), дальше бежать по совокупным отображениям...

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

Автор:  Илья Ермаков [ Воскресенье, 05 Март, 2006 15:18 ]
Заголовок сообщения: 

Цитата:
Взять отображение по фокусу, потом поднять модель отображения, потом ридера (Курьера), дальше бежать по совокупным отображениям...

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

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

Автор:  Илья Ермаков [ Воскресенье, 05 Март, 2006 15:42 ]
Заголовок сообщения: 

Цитата:
Думаю, было бы лучше открыть SqlControls.Table для расширения.


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

Автор:  Иван Кузьмицкий [ Воскресенье, 05 Март, 2006 19:04 ]
Заголовок сообщения: 

Цитата:
штатный способ работы - при обработке текстов и т.п.


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

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


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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/