Delphi 3.Библиотека программиста


Применение иерархических данных в запросах


Поиск записей
Мы узнали, как определить объект, выбранный пользователем. Но этого недостаточно — необходимо научиться искать объекты на программном уровне. В зависимости от типа элемента вам, возможно, придется...
Применение иерархических данных в запросах
Возможности иерархических и реляционных моделей по части запросов сильно расходятся. Реляционная модель хорошо подходит для поиска записей по атрибутам (полям) или объединения таблиц по общим знач...
Листинг 13 5 Использование SQL для поиска среди потомков
procedure TForm1.FindColoredBoxes (ColorName : String; StartingID : Integer); var DescendantString : String; begin DescendantString := HierarchyObject.GetDescendants(StartingID); with Query1 do b...
Целостность структуры
и циклические ссылкиПо иронии судьбы рекурсивная иерархия в одной таблице заметно упрощает обеспечение целостности структуры : одно поле таблицы ссылается на другое, принадлежащее этой же таблице....
Использование SQL
Если ваша иерархия слишком велика и ее не удается полностью загрузить в память, подумайте о решении, основанном на SQL. Если количество уровней рекурсии известно заранее, для установления связи ме...
Листинг 13 6 Использование SQL
SELECT * FROM Items T1 WHERE T1.Parent_ID IN (SELECT T2.Item_ID FROM Items T2 WHERE T2.Parent_ID IN (SELECT T3.Item_ID FROM Items T3 WHERE T3.Parent_ID = 'Fred'))В этом SQL-запросе участвуют ровн...
Проблема произвольной вложенности
При произвольной глубине вложенности и неизвестном количестве поколений потомства начинаются трудности. В SQL нет условных операторов; подзапрос либо находит записи, либо нет. Джо Селко (Joe Celko...
Использование сохраненных процедур
Сохраненные процедуры (stored procedures) напоминают SQL с добавлением условных операторов и циклов. На языке InterBase можно написать так называемые процедуры выборки (select procedures), которые...
Листинг 13 7 Процедуры выборки в InterBase
1. CREATE PROCEDURE GETCHILDREN (STARTING_ITEM_ID SMALLINT, THISLEVEL SMALLINT) 2. RETURNS(ITEM_ID SMALLINT, DESCRIPTION CHAR(30), ITEMLEVEL SMALLINT) AS 3. BEGIN 4. FOR 5. SELECT T1.ITEM_IDM T1....
Компоненты TreeData
Я написал компоненты TreeData, чтобы облегчить просмотр иерархических данных, перемещение и управление ими. Информация отображается в виде графического дерева, каждый уровень которого обозначается...
Работа со свойствами элементов TreeData
Некоторые свойства чрезвычайно важны для работы элементов TreeData. Все элементы этого семейства получают информацию из следующих свойств режима конструирования: LookupDatabaseName, LookupTableNam...
Свойства компонентов TreeData
Существует и другой вариант — элементы TreeData также обладают свойством LookupDataSource, с помощью которого можно получить данные через открытый ранее источник. Это позволяет фильтровать и отбир...
Внутреннее строение компонентов TreeData
Все компоненты семейства TreeData используют базовый модуль TREEUTIL.PAS, в котором содержатся определения всех внутренних классов, управляющих данными. В TREEUTIL.PAS определен класс TTreeDataIte...
TreeDataComboBox
С помощью этого элемента можно запомнить объект, выбранный пользова телем. Он сохраняет единственное значение в свойстве LookupIDField. В раскрывающейся части содержится список объектов, причем ур...
TreeDataListBox
Этот элемент состоит из TTreeDataComboBox (сверху) и связанного с источником данных элемента TListBox (снизу), как показано на Рисунок 13.6. Вместо одной текущей записи TListBox работает со всеми...
TreeDataOutline и TreeDataUpdate
TreeDataOutline отображает иерархию в виде графической структуры, напоминающей интерфейс программы Windows Explorer. Как и в других элементах этого семейства, вы можете получить идентификатор и оп...
Главный секрет иерархий
При работе с иерархиями используется «семейная» терминология (родители, внуки, предки, потомки), поскольку семья является самым распространенным примером объектов (в данном случае — людей), объеди...
Пропавший оракул
Дон ТейлорЭйс Брейкпойнт вернулся… но его дневник пропал, скорее всего — был похищен. Эйс начинает охоту за Таинственным незнакомцем, который в свою очередь охотится за тайнами Delphi. Интрига зак...
Вечером в конторе
Я зашел в контору и так хлопнул дверью, что за стеной послышался глухой стук упавшей таблички. Дождь шел целый день, а сейчас, казалось, он лил еще сильнее. За несколько последних дней дождь превр...
Мольба о помощи
Я подошел к телевизору, включил коммерческий канал (немного шума не повредит), взял свой последний Дневник и стал записывать события дня. Я успел записать всего два абзаца, когда зазвонил телефон....
Пропажа
В 22:57 я вернулся на стоянку возле конторы. Грязь стала настолько густой, что машина скользила по ней, будто слон на коньках. Она остановилась лишь тогда, когда колеса уперлись в поребрик рядом с...
На другом краю города
А в это время в убогой гостинице на другом краю города неприметная фигура скользнула из коридора в недавно снятый номер и заперла за собой дверь. Мелкими шагами пробираясь сквозь темноту, фигура д...
Классическое перетаскивание
Дневник №16, 19 марта. То, что выглядит самым простым, порой оказывается очень сложным. С другой стороны, иногда бывает и наоборот. По крайней мере это справедливо для внутренних 1 операций перета...
Перетаскивание как это делается
Прежде всего потребовалось выбрать компонент для календаря. Хотя вместе с Delphi поставляется неплохой календарь, в нем трудно связать дату с координатами внутри календаря. Поскольку этот компонен...
Эксперимент с перетаскиванием
Я начал с шага 1. Было бы вполне логично перехватывать сообщения о нажатии кнопки мыши, поступающие от текстового поля. Идея оказалась удачной — но лишь в определенной степени. Перетаскивание из т...
Листинг 14 1 Обработчик события
procedure TDDDemoForm.EditBoxMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (EditBox.Text <> "") and not (ssD...
Листинг 14 2 Проверка допустимости сбрасывания
procedure TDDDemoForm.CalendarDragOver (Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := True; end;...
Сброс груза
Я перешел к шагу 3. Задача заключалась в том, чтобы определить номера столбца и строки для первого дня месяца и для положения курсора. С помощью несложных вычислений я получаю разность между двумя...
Листинг 14 3 Вычисление даты по положению курсора
function DatePointedTo : TOvcDate; var Idx : Longint; DOW : Integer; Day1 : TOvcDate; begin { Вычисляем первый день как Row = 1, Col = день недели, затем вычисляем смещение для даты под курсором...
Листинг 14 4 Демонстрационная программа для перетаскивания
{——————————} {Перетаскивание (демонстрационная программа)} {DRAGMAIN.PAS : Главный модуль } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } { Приложение, демонстрирующее } осн...
Упаковка таблиц Paradox и dBASE
Дневник №16, 20 марта. В детстве мама все время заставляла меня убирать разнообразный хлам, не используемый в проектах, над которыми я тогда работал. Фразу: «Убирай за собой!» мне приходилось слыш...
Листинг 14 5
Модуль для упаковки таблиц Paradox и dBASE {——————————————————————————————————————————————————————} { Упаковка таблиц (демонстрационная программа) } { PAKTABLE.PAS : Главный модуль } { Автор: Эйс...
Демонстрационная программа
Мне потребовалась простая программа, которая бы демонстрировала возможности модуля PakTable. На Рисунок 14.2 показано, как она выглядит при работе. Исходный текст программы приведен в листинге 14....
Листинг 14 6 Демонстрационная программа для упаковки
{————————} { Упаковка таблиц (демонстрационная программа) } { PackMain.PAS : Главная форма } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Программа, демонстрирующая при...
Снова в конторе Эйса
Эйс был настолько поглощен пропажей Дневника, что даже не заметил, как сквозь жалюзи начал пробиваться утренний свет. Расхаживая по маленькой комнате, Эйс едва не протер в ковре дыру, но так и не...
Смысловые оттенки
А где-то на другом конце города в разбитое окно убогой комнаты занесло выхлопные газы последнего автобуса, отъезжающего в Бэйпорт. Не обращая внимания на уличный шум, загадочная фигура потянулась...
Листинг 14 7 Главная форма демонстрационной
{——————————} {Замена символов (демонстрационная программа)} {KSMAIN.PAS : Главная форма } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } { Приложение, демонстрирующее возможн...
Листинг 14 8 Вспомогательная форма
для замены символов {—————————} {Замена символов (демонстрационная программа) } {KSFORM2.PAS : Вспомогательная форма } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } {Приложен...
Листинг 14 9 Исходный текст метода
function TApplication.ProcessMessage: Boolean; var Handled: Boolean; Msg: TMsg; begin Result := False; if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin Result := True; if Msg.Message <>WM...
Воспроизведение WAVфайла
Зловещая фигура отвела взгляд от Дневника и затряслась. Из перекошенного рта вырвался пронзительный смех, а усы сотрясались в такт губам: «Теперь я могу поглотить все материалы Дневника — такая ин...
Звук в приложении
Дневник №16, 22 марта. Сегодня я научился воспроизводить WAV-файлы в приложениях, написанных на Delphi. Это оказалось вовсе не сложно. Я подумал, как бы здорово было, если при нажатии на кнопку вд...
Листинг 14 10 Демонстрационная
{—————————} {Воспроизведение WAV-файла (демонстрационная программа)} {PLAYMAIN.PAS : Главный модуль } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } {Приложение, демонстрирую...
Упущение
Мститель закрыл Дневник и откинулся на спинку стула, припоминая события последних часов. Ночь была длинной, а операция — рискованной. Однако наживка идеально сработала. Как и ожидалось, Брейкпойнт...
Улика найденная в грязи
Дон ТейлорПока Эйс идет по следу, бесчестный Дельфийский Мститель поглощает его опыт, нажитый тяжелым трудом, в самых разных областях: от экранов-заставок до вытесняющей мультизадачности.В контору...
Масштабирование форм
Мститель открыл новый пакет чипсов и набил рот. Он решил не возвращаться в контору Брейкпойнта. Это было рискованно, но скорее всего, ничего страшного не произойдет. Шансы на то, что бывший сыщик...
Форма для демонстрации масштабирования
С помощью сообщения WM_GETMINMAXINFO приложение узнает о том, что система проверяет размер окна, и имеет возможность изменить параметры,принятые по умолчанию. Среди этих параметров — значения, опр...
Листинг 15 1 Исходный текст программы
{——————————} {Масштабирование формы (демонстрационная программа) } RS.PAS : Главная форма } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } {Приложение показывает, как с помощ...
Создание заставок
Таинственная фигура закрыла дневник и потянулась к телефону. Аппарат с готовностью проглотил семь набранных цифр, а затем выдал серию гудков. Где-то на другом конце линии зазвонил телефон. Раздалс...
Листинг 15 2 Тестовое приложение для проверки TSplashDialog
{——————————} {Компонент-заставка } {SPLSHMN.PAS : Главная форма } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } {Простейшая программа, демонстрирующая } использование } {ком...
Листинг 15 3 Исходный текст компонента TSplashDialog
{——————————} { Компонент-заставка } { SPLSHDLG.PAS : Модуль компонента } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Модуль описывает специализированный компонент, } {...
Эйс получает ответ
— Алло, Хелен? Да, детка, это я. Просто хочу сказать, что никаких новостей нет. Глухая стена. Я уже сотню раз перебрал все возможные варианты, но не сдвинулся ни на шаг. Никаких улик, я абсолютно...
Глобальный доступ к даннымв приложении
Тем временем Мститель снова погрузился в чтение похищенного Дневника.Дневник №16 (27 марта). В Delphi 1.0 совместное использование таблиц несколькими формами было крайне хлопотным делом. Хотя возм...
Модуль данных в режиме конструирования
Сначала я создал (для последующего использования в свойстве DatabaseName) псевдоним с именем Pizza, определяющий каталог с таблицей. Затем создал новый модуль данных и присвоил ему имя PizzaData....
Листинг 15 4 Исходный текст модуля данных
{——————————} {Демонстрация работы с модулями данных } {PIZADAT.PAS : Модуль данных } {Автор: Эйс Брейкпойнт, N.T.P. } {При содействии Дона Тейлора } { } { Модуль данных содержит простейшую комбин...
Листинг 15 5 Исходный текст главной формы
{——————————————————————————————————————————————————————} { Демонстрация работы с модулями данных } { PIZAMAIN.PAS : Главная форма } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора...
Листинг 15 6 Исходный текст вспомогательной формы
{——————————————————————————————————————————————————————} { Демонстрация работы с модулями данных } { PIZAFRM2.PAS : Вспомогательная форма } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона...
Потрясающее открытие
Эйс Брейкпойнт набрал рабочий номер Хелен. Она подняла трубку после второго гудка.— Алло, чем могу помочь?— Хелен — у меня есть потрясающие новости. Хочу, чтобы ты узнала их первой».— Отлично, мил...
Прогулка по Win95
Эйс проглотил последний кусок гамбургера и глубоко задумался, без всякого выражения уставившись на соседку по столу. Хорошо понимая, что в ближайшее время он не способен вести светскую беседу, Хел...
Внимание сейчас вылетит птичка…
Сначала я был удивлен различиями между 16- и 32-разрядной версиями ToolHelp. Некоторые процедуры (в том числе и TaskFirst с TaskNext) в 32-разрядной версии отсутствовали. Что это, просчет со сторо...
Модуль WalkStuf
После нескольких часов «зависаний» и множества фальстартов я написал модуль, приведенный в листинге 15.7. Он содержит несколько процедур общего назначения, заметно упрощающих составление списков м...
Листинг 15 7 Исходный текст модуля WalkStuf
{——————————————————————————————————————————————————————} { Демонстрационная программа для сбора информации } { о системе } { WALKSTUF.PAS : Служебный модуль } { Автор: Эйс Брейкпойнт, N.T.P. } {...
Итоги
Говорят, когда дела становятся совсем плохи, главное — вовремя приготовить кофе. Я заварил целый кофейник и занялся программой, демонстрирующей работу с функциями модуля WalkStuf. На Рисунок 15.8...
Листинг 15 8 Исходный текст главного
{——————————} {Демонстрационная программа для сбора информации} { о системе } { WALKAMIN.PAS : Главный модуль } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Программа де...
Возвращение оракула
Дон ТейлорПока Дельфийский Мститель узнает, как научить приложения Delphi обнаруживать присутствие самих себя и среды Delphi (а заодно получает плавающую панель инструментов), Эйс обнаруживает оче...
Совместное использование обработчиков событий
Зловещая фигура склонилась над книгой и продолжала читать.Дневник №16, 29 марта. В сегодняшней почте среди счетов я нашел приглашение на свадьбу наших старых друзей — пары, с которой мы с Хелен по...
Первая попытка
Общий сценарий выглядит так: я выбираю нужную вкладку и перетаскиваю строку с описанием задачи на сетку. Для всех трех страниц при этом выполняются практически одинаковые операции. Единственное от...
Листинг 16 1 Общие обработчики
{ Общий обработчик для события OnDragOver всех сеток. }procedure TShareEventDemoForm.GridDragOver(Sender, Source: TObject;X, Y: Integer; State: TDragState; var Accept: Boolean);begin{ Принимается...
Тернистый путь познания
Но мне показалось, что все слишком просто. Не знаю, в чем тут дело — то ли в каких-то личных качествах, то ли я просто «нерд» по натуре. Я решил пойти дальше и сделать так, чтобы строку из текстов...
Листинг 16 2 Полный исходный текст
{——————————————————————————————————————————————————————} { Применение общих обработчиков событий } { (демонстрационная программа) } { SHARMAIN.PAS : Главный модуль } { Автор: Эйс Брейкпойнт, N.T....
И последнее замечание…
В листинге 16.2 реализована еще одна дополнительная возможность, перед которой я не смог устоять. Объект можно перетащить из сетки и скопировать /переместить его в другую сетку, сбрасывая на нужно...
Использование файлов в памяти
Дневник №16 (1 апреля): Один из самых частых вопросов о Delphi — как написать приложение, существование которого в системе ограничивается одним экземпляром. За последний год я обнаружил несколько...
Листинг 16 3 Простейшая программа
{——————————————————————————————————————————————————————} { Демонстрационная программа, } { запускаемая лишь в одном экземпляре. } { INSTMAIN.PAS : Главная форма } { Автор: Эйс Брейкпойнт, N.T.P....
Перед началом
Похоже, многие программисты даже не знают, что в файл проекта можно поместить код, который будет выполняться еще до инициализации приложения. Именно это и происходит в данном случае. Файл проекта...
Листинг 16 4 Файл проекта для программы запускаемой лишь
в одном экземпляре {——————————————————————————————————————————————————————} { Демонстрационная программа, } { запускаемая лишь в одном экземпляре. } { ONEINST.DPR : Файл проекта } { Автор: Эйс Бре...
Запрет выполнения программы
Дневник №16, 2 апреля. Итак, я узнал, как предотвратить выполнение программы при наличии предыдущего экземпляра. Но что-то продолжало беспокоить меня. А что если приложение должно работать лишь в...
Листинг 16 5 Исходный текст главной формы приложения
обнаруживающего присутствие Delphi {——————————————————————————————————————————————————————} { Демонстрационная программа, } { обнаруживающая присутствие Delphi. } { NRUNMAIN.PAS : Главная форма }...
Листинг 16 6 Файл проекта для приложения обнаруживающего
присутствие Delphi {——————————————————————————————————————————————————————} { Демонстрационная программа, } { обнаруживающая присутствие Delphi. } { NORUN.DPR : Главная форма } { Автор: Эйс Брейкп...
Плавающие панели инструментов
Дневник №16 (3 апреля): Я всегда любил программы с панелями инструментов, свободно перемещаемыми по экрану. Такие панели особенно удобныв графических редакторах и программах компьютерной верстки,...
Листинг 16 7 Исходный текст программы
{——————————————————————————————————————————————————————} { Демонстрационная программа } { для работы с плавающими панелями инструментов. } { TOOLMAIN.PAS : Главная форма } { Автор: Эйс Брейкпойнт...
Эйс выходит победителем
Дельфийский Мститель оторвался от Дневника. Вокруг явно творилось что-то непонятное. Температура воздуха упала, комната подернулась дымкой, а по полу стелился толстый слой плотного тумана. Яркий б...
Эпилог
Дневник №17, 13 апреля. За последние 24 часа произошло множество событий. Я пережил приключение, которое ни за что не хотел бы повторить.Хелен ожидала моего возвращения. По крайней мере отчасти он...


Начало