
Положение, размеры и оформление компонентов
Положение и размеры компонента определяются четырьмя его свойствами (в пикселях):
property Height: Integer; // Высота
property Left: Integer; // Положение левой кромки
property Top: Integer; // Положение верхней кромки
property Width: Integer; // Ширина
Для всех компонентов, кроме форм, эти свойства задаются в координатах клиентской части родительского компонента. Для формы - в координатах экрана. Клиентская часть компонента - это внутренняя его область за исключением заголовка, рамки и меню. Свойства обычно определяются на стадии конструирования формы, но они доступны также и на этапе прогона программы. Изменение любого из них приводит к немедленному изменению положения или размера компонента как на этапе конструирования, так и при прогоне программы. Все четыре числовые величины содержатся также в единственном свойстве
property BoundsRect: TRect;
type TPoint = record
X: Longlnt;
Y: Longlnt;
end;
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Integer) ;
1: (TopLeft, BottomRight: TPoint);
end;
В некоторых случаях бывает необходимо пересчитать относительные координаты точки внутри клиентской части в абсолютные координаты экрана и наоборот. Эта задача решается двумя методами TControl:
function ClientToScreen(const Point: TPoint): TPoint;
function ScreenToClient (const Point: TPoint): TPoint;
Важную роль играет свойство Align, определяющее выравнивание положения компонента относительно границ своего родителя:
type TAlign = (alNone, alTop, alBottom,
alLeft, alRight, alClient) ;
property Align: TAlign;
Любой видимый компонент можно спрятать или показать с помощью свойства Visible или методами Hide и Show:
property Visible: Boolean; // True - показывает
procedure Hide; // Прячет компонент
procedure Show; // Показывает компонент
Спрятанный компонент не реагирует на события от мыши или клавиатуры, он не участвует в дележе клиентской области родителя, ему нельзя передать фокус ввода клавишей Tab.
Если компонент частично или полностью перекрывается другими компонентами, его можно расположить над всеми компонентами и убрать обратно с помощью методов
procedure BringToFront; // Сделать верхним procedure SendToBack; // Сделать нижним
Свойство
property Enabled: Boolean;
определяет возможность активизации компонента. Если оно имеет значение False, компонент запрещен для выбора. Такие компоненты (точнее, надписи на них) обычно отображаются серым цветом.
Некоторые компоненты имеют плоское изображение (например, метка TLabel), другие - всегда объемное (например, кнопкаTButton), Для остальных элементов объемность изображения регулируется свойством
property Ctl3D: Boolean;
С каждым управляющим компонентом связывается текстовая строка, которая становится доступна либо через свойство Caption, либо через свойство Text (альтернативой свойству Text, которое имеет тип String, является свойство TCon-trol.WindowsText типа PChar).
Если эта строка прорисовывается в компоненте, используется шрифт, задаваемый свойством Font:
property Font: TFont;
В этом случае свойство
type TAlignment = (taLeftJustify, taRightJustify, taCenter); property Alignment: TAlignment;
регулирует расположение текста относительно границ компонента: taLeftJustify -прижать к левой границе; taRightJustify - прижать к правой границе; taCenter -расположить по центру. С помощью придания свойству
property DesktopFont: Boolean;
значения True можно потребовать от компонента, чтобы он выводил текст системным шрифтом Windows.
Видимая часть элемента заливается цветом Color:
property Color: TColor;
ВОПР 8
Невидимые компоненты Не каждый компонент виден на форме во время запуска программы. Например, размещение на форме компонента MainMenu приводит к появлению в разрабатываемом приложении меню, но соответствующая пиктограмма во время запуска программы не отображается. Компоненты, представляющие диалоговые окна общего назначения, вообше никак не визуализируются во время работы программы. Размеры невидимого компонента в процессе разработки не изменяются — он всегда отображается в виде пиктограммы.
Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями. Во-первых, их размер может динамически меняться в ходе работы программы, фактически ограничиваясь лишь доступной памятью. Во-вторых, в списках могут храниться элементы разных типов.
Технически списки представляют собой массивы нетипизированных указателей на размещенные в динамической памяти элементы. Эти массивы размещаются в куче -отсюда возможность динамического изменения размеров списков; с другой стороны, входящие в списки нетипизированные указатели позволяют ссылаться на произвольные элементы.
Свойства класса:
property Capacity : Integer;
|
Содержит количество элементов массива указателей списка. Всегда больше Count. Если при добавлении очередного элемента Count стало равно Capacity, происходит автоматическое расширение списка на 16 элементов
|
property Count: Integer;
|
Количество элементов списка. Это свойство изменяется при добавлении или удалении элемента
|
property Items (Index: Integer) : Pointer;
|
Возвращает указатель на элемент списка по его индексу. Самый первый элемент списка имеет индекс 0
|
property List: pPointerList;
|
Возвращает указатель на массив элементов списка
|
TStrings
Абстрактный класс TStrings инкапсулирует поля и методы для работы с наборами строк. От него порождены многочисленные специализированные потомки, обслуживающие наборы строк в таких компонентах, как TComboBox, TListBox, TRichEdit и др. Эти классы (TComboBoxStrings, TListBoxStrings, TRichEditStrings и др.)
объявляются в разделах implementation соответствующих модулей (stdCtrls, ComCtrls и др.) и поэтому скрыты от браузера Delphi и не включены в Help-службу. Единственным доступным наследником TStrings является TStringList - полнофункциональный класс общего назначения.
Замечательной особенностью TStrings и его потомков является то обстоятельство, что элементами наборов служат пары строка-объект, в которых строка - собственно строка символов, а объект - объект любого класса Delphi, Такая двойственность позволяет сохранять в TStrings объекты с текстовыми примечаниями, сортировать объекты, отыскивать нужный объект по его описанию и т. д. Кроме того, в качестве объекта может использоваться потомок от TStrings, что позволяет создавать многомерные наборы строк.
Свойства класса:
property Capacity: Integer;
|
Текущая емкость набора строк
|
property CommaText: String;
|
Служит для установки или получения всего набора строк в виде единой строки с кавычками и запятыми (см. ниже пояснения)
|
property Count: Integer;
|
Текущее количество строк в наборе
|
property Names [Index: Integer] : String;
|
Для строки с индексом Index возвращает часть Name, если это строка вида Name=Value, в противном случае возвращает пустую строку
|
property Objects [Index: Integer] : TObject;
|
Открывает доступ к объекту, связанному со строкой с индексом Index
|
property Strings [Index: Integer] : String;
|
Открывает доступ к строке с индексом Index
|
property StringsAdapter: TStrings Adapter;
|
Это свойство используется только при разработке компонентов, отвечающих стандарту ActiveX
|
property Text: String;
|
Интерпретирует набор строк в виде одной длинной строки с разделителями EOLN между отдельными строками набора
|
property Values [const Name: String] : String;
|
По части Name отыскивает в наборе и возвращает часть Value для строк вида Name=Value
|
TStringList
TStringList представляет собой полнофункциональный класс общего назначения и является прямым потомкам TStrings. Помимо перекрытых абстрактных методов своего родителя класс включает в себя такие дополнительные методы и свойства:
property Duplicates: IDupli-cates;
|
Свойство, позволяющее управлять возможностью размещения в наборе двух и более идентичных строк
|
property Sorted: Boolean;
|
Признак необходимости сортировки строк в алфавитном порядке
|
property OnChange: TNoti-fyEvent;
|
Определяет реакцию на изменение набора строк. Возникает после последнего изменения
|
property OnChanging: TNoti-fyEvent;
|
Определяет реакцию на изменение набора строк. Возникает до очередного изменения
|
function Find (const S: String; var Index: Integer): Boolean;
|
Ищет в наборе строку S и в случае успеха в параметре Index возвращает ее индекс
|
КОМПОНЕНТЫ СТРАНИЦЫ DIALOGS
В состав Windows входит ряд типовых диалоговых окон, таких как окно выбора загружаемого файла, окно выбора шрифта, окно для настройки принтера и т. д. В Delphi реализованы классы, объекты которых дают программисту удобные способы создания и использования таких окон.
Работа со стандартными диалоговыми окнами осуществляется в три этапа.
Вначале на форму помещается соответствующий компонент и осуществляется настройка его свойств (следует заметить, что собственно компонент-диалог не виден в момент работы программы, видно лишь создаваемое им стандартное окно). Настройка свойств может проходить как на этапе конструирования, так и в ходе прогона программы. Как и для любых других компонентов, программист не должен заботиться о вызове конструктора и деструктора диалога - эти вызовы реализуются автоматически в момент старта и завершения программы.
На втором этапе осуществляется вызов стандартного для диалогов метода Execute, который создает и показывает на экране диалоговое окно. Вызов этого метода обычно располагается внутри обработчика какого-либо события. Например, обработчик выбора опции меню Открыть файл может вызвать метод Execute диалога TOpenDialog, обработчик нажатия инструментальной кнопки Сохранить может вызвать такой же метод у компонента TSaveDialog и т. д. Только после обращения к Execute на экране появляется соответствующее диалоговое окно. Окно диалога является модальным окном, поэтому сразу после обращения к Execute дальнейшее выполнение программы приостанавлиаается до тех пор, пока пользователь не закроет окно. Поскольку Execute - логическая функция, она возвращает в программу True, если результат диалога с пользователем был успешным.
Проанализировав результат Execute, программа может выполнить третий этап - использование введенных с помощью диалогового окна данных - имени файла, настроек принтера, выбранного шрифта и т. д.
OLE обозначает присоединенные и встроенные объекты. Данные, разделяемые между приложениями называются OLE объектом. Приложение, которое может содержать OLE объекты, называют OLE контейнером (OLE Container). Приложение, данные из которого можно включить в OLE контейнер в виде OLE объекта, называют OLE сервером. Как следует из названия, OLE объекты можно либо присоединить к OLE контейнеру, либо включить в него. В первом случае данные будут храниться в файле на диске, любое приложение будет иметь доступ к этим данным и сможет вносить изменения. Во втором случае данные включаются в OLE контейнер и только он сможет просматривать и модифицировать эти данные. OLE является дальнейшим развитием идеи разделяемых между приложениями данных. Если с помощью DDE можно было работать с текстом, то OLE позволяет легко встроить в приложение обработку любых типов данных. Каждый раз, когда в программе-клиенте пользователь обращается к OLE объекту с целью просмотра или редактирования данных (обычно двойной щелчок мышкой на объекте), запускается приложение-сервер, в котором и происходит работа с данными. В природе существует несколько видов OLE, отличающихся по способу активации OLE сервера. OLE версии 1 запускает сервер в отдельном окне. OLE 2 реализует то, что называется in-place activation and editing. В данном случае сервер запускается “внутри” приложения-клиента, модифицирует вид системного меню, линейки инструментов и др. Развитие идеи OLE привело к появлению OLE automation - приложение-клиент может выполнить часть кода сервера. Тип OLE объекта, помещенного в программу-клиент, определяется тем, какую версию OLE поддерживает сервер.
Объект TOLEContainer
Объект TOLEContainer находится на странице System Палитры Компонент и нужен для создания приложений OLE-контейнеров. TOLEContainer скрывает все сложности, связанные с внутренней организацией OLE и предоставляет программисту достаточно простой интерфейс. Построим простейшее приложение с использованием OLE объекта. Создайте новый проект и поместите на форму TOLEContainer, в Инспекторе Объектов дважды щелкните мышкой на свойство ObjClass или ObjDoc - появится стандартный диалог Windows “Insert Object”.
В этом диалоге есть список всех зарегистрированных в системе OLE-серверов (регистрация происходит при инсталляции программы). Тип OLE-объекта определяется как раз тем сервером, который Вы укажете. Если Вы создаете новый объект (Create New), то при нажатии кнопки OK запустится программа OLE-сервер, в которой и формируется новый объект. После выхода из программы-сервера новый OLE объект включается (embedded object) в программу. OLE объект можно создать используя уже имеющийся файл в формате одного из OLE-серверов. Выбранный объект можно как включить в приложение, так и присоединить, отметив пункт Link. Итак, давайте при создании нашего проекта создадим новый объект, выбрав для этого, Microsoft Word Document. Нажмите OK и после того, как запустится MS Word, наберите там любой текст (“Это OLE-объект Microsoft Word document”). Для завершения работы в меню есть специальный пункт “File|Close and Return to Form1” (Win’95+MS Word 7.0). Щелкните дважды мышкой на OLE-контейнер - запустится MS Word с документом из OLE-объекта, который можно редактировать, при этом все изменения сохраняются в OLE-объекте.
TOLEContainer позволяет отображать в программе объект в его непосредственном виде (с различной степенью увеличения или уменьшения - свойство Zoom) или в виде пиктограммы, определяемой в диалоге на рис.1 (Display as Icon). Выбор OLE-объекта может происходить не только во время дизайна, но и во время выполнения программы (об этом чуть ниже). Результаты работы с этим объектом можно сохранить в виде файла и в следующий раз восстановить его оттуда, для этого TOLEContainer имеет два метода SaveToFile и LoadFromFile. Пример OLE приложения. Среди демонстрационных примеров, входящих в Delphi есть два, относящихся к работе с OLE-объектами (в директориях X:\DELPHI\DEMOS\OLE2 и X:\DELPHI\DEMOS\DOC\OLE2). Более полным является второй, который, кроме всего прочего является примером построения MDI приложения. Данная программа демонстрирует все основные возможности TOLEContainer и позволяет:
- создавать новый OLE контейнер во время выполнения программы;
- инициализировать OLE объект либо в стандартном диалоге Windows “Insert Object”, либо с помощью Clipboard, либо с помощью техники “перенести и бросить” (drag-and-drop);
- сохранить OLE объект в файле и восстановить его оттуда;
Пример MDI приложения, содержащий два дочерних окна с OLE объектами. Для создания нового OLE объекта нужно выбрать пункт меню File|New и далее Edit|Insert Object. Появится стандартный диалог Windows для инициализации OLE объекта. Если приложение OLE-сервер имеет возможность сохранять информацию об OLE объекте в Clipboard, то проинициализировать объект можно с помощью пункта меню Edit|Paste Special. Достаточно интересной является возможность применения техники drag-and-drop в применении к OLE объектам. Запустите MS Word (разместите его окно так, чтобы было видно и OLE приложение), наберите какой-нибудь текст, выделите его и с помощью мышки перетащите и бросьте на главное MDI окно приложения. Появится новое дочернее окно с OLE контейнером, содержащим этот текст. Программирование данной возможности достаточно сложно.
ВОПР 3
TObject - является самым верхним классом в иерархии классов. Он является прародителем всех остальных классов используемых в DELPHI. Это означает, что все последующие классы, сохранят все свойства и методы присущие этому классу, а также к ним могут добавиться некоторые новые, уникальные, свойства и методы соответствующие этому классу. Рассмотрим наиболее используемые классы и их свойства и методы при работе с базами данных.
TObject имеет следующие необходимые нам методы:
• ClassName - возвращает имя класса в строковом виде.
• Create - используется для создания класса и его инициализации до того как он будет использован.
• Destroy - используется для удаления класса, кроме, когда он ноль (NIL).
• Free - также используется для удаления объекта даже в том случае, когда он ноль(NIL). Более безопасный способ удаления.
Примером класса TObject является TList (список). Прямым наследником этого класса является TPersistent.
TPersistent – обладает потоковыми свойствами. Заключает в себе фундаментальные действия всех объектов, которые могут быть направлены на другие объекты.
TPersistent имеет следующее уникальное свойство: