Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
65
Добавлен:
10.12.2013
Размер:
166.21 Кб
Скачать

Положение, размеры и оформление компонентов

Положение и размеры компонента определяются четырьмя его свойствами (в пик­селях):

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: Inte­ger) : 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: Inte­ger] : TObject;

Открывает доступ к объекту, связанному со строкой с индексом Index

property Strings [Index: Inte­ger] : 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 реализованы классы, объекты которых дают программисту удобные способы создания и использования таких окон.

Работа со стандартными диалоговыми окнами осуществляется в три этапа.

Вначале на форму помещается соответствующий компонент и осуществляется на­стройка его свойств (следует заметить, что собственно компонент-диалог не виден в момент работы программы, видно лишь создаваемое им стандартное окно). Настройка свойств может проходить как на этапе конструирования, так и в ходе прогона про­граммы. Как и для любых других компонентов, программист не должен заботиться о вызове конструктора и деструктора диалога - эти вызовы реализуются автоматически в момент старта и завершения программы.

На втором этапе осуществляется вызов стандартного для диалогов метода Exe­cute, который создает и показывает на экране диалоговое окно. Вызов этого метода обычно располагается внутри обработчика какого-либо события. Например, обработчик выбора опции меню Открыть файл может вызвать метод 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 поддерживает сервер.

      1. Объект 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 имеет следующее уникальное свойство:

Соседние файлы в папке Экзамен