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/ |