Текущее время: 28 мар 2024, 23:34

Калининград & ХОББИ

Занятие любимым хобби - это путь к счастливой жизни!

Delphi

Все о языках программирования, примеры программ, функций, процедур, классов, синтаксис, скрипты , на любых языках программирования
Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

Delphi

Сообщение -=dp=- » 14 апр 2013, 07:23

Язык Delphi (краткий справочник)


Зарезервированные слова и директивы


Зарезервированные слова:



and

File

not

then


array

For

object

to


asm

function

of

type


begin

Goto

or

unit


case

If

packed

until


const

implementation

procedure

uses


constructor

In

program

var


destructor

inherited

record

while


div

inline

repeat

with


do

intenface

set

xor


downto

Label

shl




else

Mod

shr




end

Nil

string






Директивы:



absolute

assembler

external

Far

forward

interrupt

near

private

public

virtual






Структура модуля


Модуль состоит из последовательности разделов. Каждый раздел начинается ключевым словом и продолжается до начала следующего раздела.


unit ИмяМодуля;


interface // раздел интерфейса


{ Здесь находятся описания процедур и функций модуля, коч-орые могут использоваться другими модулями. )


const // раздел объявления констант


{ Здесь находятся объявления глобальных констант модуля, которые могут использоваться процедурами и функциями модуля.}


type // раздел объявления типов


{ Здесь находятся объявления глобальных типов модуля,


которые могут использоваться процедурами и функциями модуля }


var // раздел объявления переменных


{ Здесь находятся объявления глобальных переменных модуля, которые могут использоваться процедурами и функциями модуля }


implementation // раздел реализации


{ Здесь находятся описания (текст) процедур и функций модуля)

end.


Основные типы данных


К основным типам данных языка Delphi относятся: П целые числа (integer); П дробные числа (real); П символы (char);


строки (string);

логический тип (boolean).

Целые числа и числа с плавающей точкой могут быть представлены в различных форматах (табл. П1.1 и П2.2).


Таблица П1.1. Целые числа



Формат

Диапазон


Shortint

-128.. 127


Integer

-32 768.. 32 767


Longint

-2 147 483 648.. 2 147 483 647


Byte

0..255


Word

0..65535




Таблица П1.2. Числа с плавающей точкой



Формат

Диапазон

Кол-во значащих цифр


Real

2,9e-39.. 1,7e38

11-12


Single

1,5e-45.. 3,4e38

7-8


Double

5,0e-324.. 1,7e308

15-16


Extended

3,4e-4932.. 1,1e4932

19-20






Строки


Объявление переменной-строки длиной 255 символов:

Имя:string;


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

Имя:string [ ДлинаСтроки ].


Массив


Объявление одномерного массива:

ИмяМассива: array [НижнийИндекс...ВерхнийИндекс] of ТипЭлементов;


Объявление двумерного массива:

ИмяМассива: array [НижнийИндекс1..ВерхнийИндекс1,


НижнийИндекс2..ВерхнийИкдекс2] of ТипЭлементов;


Запись


Вариант 1. Объявление записи в разделе переменных: Запись: record Поле1:Тип1; Поле2: Тип2;


ПолеJ: TиnJ; end;


Вариант 2. Сначала объявляется тип-запись, затем — переменная-запись:


type


ТипЗапись = record Поле1: Тип1; Поле 2:Тип2;


ПолеК: ТипК; end;


var


За пись: ТипЗапись;


Инструкции выбора

Инструкция if


Вариант 1: if-then-else. if Условие then


begin


{ Инструкции, которые выполняются, ) { если условие истинно. } end else


begin


{ Инструкции, которые выполняются, } { если условие ложно } end ;


Вариант 2. if-then.


if Условие then


begin


{ Инструкции, которые выполняются, } { если условие истинно. } end;


Примечание


Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.


Инструкция case


Вариант 1:


case Выражение of


Список1_Констант: begin


. { инструкции } end; Список2_Констант: begin


{ инструкции } end;


СписокJ_Констант: begin


{ инструкции } end; end;


Вариант 2.


case Выражение of


Список1_Констант: begin


{ инструкции } end;


Список2_Констант: begin


{ инструкции } end; СписокJ_Констант: begin


{ инструкции J} end; else


begin


{ инструкции } end; end;


Инструкции между begin и end выполняются, если значение выражения, записанного после case, совпадает с константой из соответствующего списка. Если это не так, то выполняются инструкции, находящиеся после else, между begin И end.


Примечание


Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.


Циклы

Инструкция for


Вариант 1 (с увеличением счетчика):


for Счетчик:=НачальноеЗначение to КонечноеЗначение do begin


{ здесь инструкции } end;


Инструкции между begin и end выполняется (КонечноеЗначение - НачальноеЗначение) + 1 раз.


ЕСЛИ НачальноеЗначение > КонечноеЗначение, ТО инструкции между begin И


end не выполняются.


Примечание


Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.


Вариант 2 (с уменьшением счетчика)'.


for Счетчик:=НачальноеЗначение downto КонечноеЗначение do begin


{ здесь инструкции } end;


Инструкции между begin и end выполняется (НачальноеЗначение - КонечноеЗначение) + 1 раз.


Если НачальноеЗначение < КонечноеЗначение, то инструкции между begin и end не выполняются.


Примечание


Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.


Инструкция repeat


repeat


{ инструкции } until Условие;


Сначала выполняются инструкции цикла, которые расположены между repeat и until. Затем вычисляется значение выражения Условие, и если оно равно False, то инструкции цикла выполняются еще раз. И так до тех пор, пока значение выражения Условие не станет равным True.


Инструкция while


while Условие do begin


{ инструкции ) end;


Сначала проверяется Условие, если оно истинно, то выполняются инструкции между begin и end. Затем снова проверяется Условие. Если оно выполняется, то инструкции цикла выполняются еще раз. И так до тех пор, пока Условие не станет ложным.


Примечание


Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.


Безусловный переход

Инструкция GoTo


GoTo Метка;


Инструкция осуществляет переход к инструкции, перед которой стоит метка. Метка должна быть объявлена в разделе label.


Объявление функции


function ИмяФункции(var Параметр1: Тип 1; var Параметр2: Тип2;


var ПараметрJ: TиnJ ) : Тип; const


{ описание констант } var


/ описание переменных } begin


{ инструкции функции }


Result:=Значение; end;


Примечание


Слово var ставится перед именем параметра в том случае, если параметр используется для возврата значения из функции в вызвавшую ее программу.


Объявление процедуры


procedure ИмяПроцедуры(var Параметр1: Тип1;


var Параметр2: Тип2;


var ПараметрJ: TипJ } ; const


{ описание констант }


var


{ описание переменных } begin


{ инструкции процедуры } end;


Примечание


Слово var ставится перед именем параметра в том случае, если параметр используется для возврата значения из функции в вызвавшую ее программу.


Стандартные функции и процедуры


При описании функций и процедур приняты следующие обозначения:

имена функций и процедур выделены полужирным;

формальные параметры изображены курсивом. В качестве параметра могут использоваться константы, переменные или выражения соответствующего типа. Если параметром обязательно должна быть переменная, то перед ним поставлено слово var. После параметра через двоеточие указывается его тип;

после списка параметров функций через двоеточие указан тип результата, возвращаемого функцией.

В табл. П1.3 приведены описания математических функций языка Delphi.


Таблица П1.3. Математические функции



Функция

Описание


Abs (Выражение)

Абсолютное значение аргумента (целый или вещественный тип)


Sqr (Выражение)

Квадрат аргумента (целый или вещественный тип)


Sqrt( Выражение: real) :real

Квадратный корень аргумента


Sin (Выражение: real) : real

Синус


Cos (Выражение: real) : real

Косинус


Arctant Выражение: real) : real

Арктангенс


Exp( Выражение: real) :real

Экспонента


Ln ( Выражение : real ) : real

Натуральный логарифм




В табл. П1.4 приведены описания преобразований языка Delphi.


Таблица П1.4. Преобразования



Преобразование

Описание


Int( Выражение: real) :real

Целая часть


Trunc (Выражение: real) : longint

Целая часть


Round (Выражение: real) : longint

Округление к ближайшему целому


IntToStr (Выражение)




Преобразование числового выражения цело-

го типа в строку



FloatToStr (Выражение)

Преобразование вещественного числа в его изображение


FloatToStrF ( Выражение, Формат, Точность, КоличествоЦифр)

Преобразование вещественного числа в его изображение с возможностью выбора способа изображения


StxToInt ( Строка : string)

Преобразование строки, изображающей целое или вещественное число, в число


StrToFloat ( Строка : string)

Преобразование строки, изображающей вещественное число, в число




В табл. 1.5 приведены описания функций работы со строками и символами.


Таблица П1.7. Работа со строками и символами



Строковая функция

Описание


Concat( Строка1: string, ... , Строкам: string) : string


Copy ( Строка : string , НомерСимвола : integer, Длина: integer) : string


Delete (var Строка :srting, НомерСимвола : integer, Сколько : integer)


Length (Строка: string) : integer Pos (Строка: string, Подстрока: string) :byte Chr ( КодСимвола : byte )

Объединение нескольких строк в одну


Выделение подстроки



Удаление части строки


Длина строки Позиция подстроки в строке Символ с указанным кодом



Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

Элементы управления Delphi

Сообщение -=dp=- » 14 апр 2013, 07:25

Элементы управления Windows XP


Пользовательский интерфейс Windows XP
Манифест Windows XP
Компонент TXPManifest
Включение манифеста Windows XP в ресурсы приложения
Визуальные стили и темы оформления
Визуальные стили в Delphi
Theme API
Компоненты настройки цветовой палитры
Резюме


В Delphi 7 впервые появилась возможность настраивать пользовательский интерфейс приложений для использования в Windows XP. Для этого в состав ресурсов приложения должен включаться манифест Windows XP. Это дополнение призвано обеспечить корректное взаимодействие элементов управления приложения с системной библиотекой ComCtl32.dll версии 6, используемой в Windows XP. Собственно все особенности работы приложений под управлением Windows XP вызваны именно появлением новой версии этой библиотеки. Впрочем, об этом подробно рассказывается ниже.

В этой главе рассматриваются следующие вопросы:

динамическая библиотека ComCtl32.dll v.6 и особенности пользовательского интерфейса Windows XP;
что такое манифест Windows XP;
компонент TXPManifest;
как включить манифест Windows XP в ресурсы приложения;
стили приложения и компоненты настройки цветовой палитры.

Пользовательский интерфейс Windows XP

При первом знакомств с Windows XP сразу же оораг -ешь внимание на существенные изменения в оформлении пользовательскою интерфейса этой операционной системы. Все нововведения основаны на использовании нового способа отрисовки элементов управления, который реализован в системной динамической библиотеке ComCtl32.dll версии 6. Эта библиотека входит в состав операционной системы Windows XP.

Примечание

Обратите внимание, что все более ранние операционные системы фирмы Microsoft используют ComCtl32.dll версии 5 с традиционным стилем оформления элементов управления. И, конечно, нельзя заставить Windows 2000 выглядеть как Windows XP простой заменой версии ComCtl32.dll. Операционная система должна уметь использовать новые возможности.

Теперь элементы управления в стиле Windows XP могут иметь собственную цветовую палитру, текстуры, стили заполнения и, самое главное, различные методы отрисовки своих составных частей. Например, элемент управления может рисовать собственное поле ввода данных обычным способом, а рамку—с использованием маски XOR.

Совокупность правил и методов поведения, оформления и отрисовки элементов управления называется визуальным стилем (visual style). Совместно с Windows XP поставляется один готовый стиль.

Если разработчик хочет, чтобы его приложение могло использовать новые возможности Windows XP, он должен включить в состав проекта специальный ресурс — манифест (manifest). Манифест представляет собой документ XML, содержащий необходимую для библиотеки ComCtl32.dll версии 6 информацию.

Такое приложение будет чувствовать себя комфортно в среде Windows XP. Но и при запуске в старых операционных системах оно просто будет использовать стандартный набор возможностей ComCtl32.dll версии 5 и выглядеть, как и любое другое приложение.

Кроме этого, Windows XP также имеет библиотеку ComCtl32.dll версии 5 и именно она используется по умолчанию.


Манифест Windows XP

Итак, начнем с манифеста. Он представляет собой документ в формате XML, содержащий всю информацию, необходимую для взаимодействия приложения и библиотеки ComCtl32.dll версии 6.

Примечание

Следует отметить, что манифесты широко используются во многих продуктах и технологиях, работающих в операционных системах Microsoft. С полной схемой XML манифеста вы можете ознакомиться в документации Microsoft MSDN.

Пример манифеста представлен в листинге 6.1.

Листинг 6.1. Манифест Windows XP

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.vl" manifestVersion="l.0">

<assemblyIdentity

version="l.0.0.0"

processorArchitecture="X86"

name="CompanyName.ProductName.YourApp"

type="win32"

/>

<description>Your application description here.</description>

<dependency>

<dependentAs s embly>

<assemblyIdentity

type="win32"

name="Microsoft.Windows.Common-Controls"

version="6.0.0.0"

processorArchitecture="X86"

publicKeyToken="6595b64144ccfldf"

language="*"

/>

</dependentAss embly>

</dependency>

</assembly>

Обратите внимание, что в элементе

<dependency>

<dependentAss emblу>

<assemblyldentity>

описывается версия системной библиотеки, используемой приложением для отрисовки элементов управления.

При загрузке приложения операционная система Windows XP считывает манифест (если он есть) и получает информацию о том, что для выполнения приложения потребуется библиотека ComCtl32.dll версии 6.

Помимо этой информации манифест может содержать и другие необходимые сведения о приложении и условиях его работы. Например, общая информация о приложении и его версии представлены элементом

<AssemblyIdentity>.

Вы можете добавить манифест в ваше приложение двумя способами:

использовать компонент TxpManifest;
добавить манифест в ресурсы приложения вручную. Рассмотрим их.

Компонент TXPManifest

На странице Win32 Палитры компонентов Delphi 7 имеется компонент TXPManifest. Будучи добавленным в проект, он обеспечивает компиляцию манифеста Windows XP в исполняемый файл приложения. В качестве основы используется стандартный манифест Delphi для Windows XP, содержащийся в файле ресурсов Delphi7\Lib\WindowsXP.res (листинг 6.2).

Листинг 6.2. Манифест Delphi для Windows XP

<assembly xmlns="urn:schemas-microsoft-com:asm.vl" manifestVersion="l.0">

<assemblyIdentity

type="win32"

name="DelphiApplication"

version="3.2.0.0"

processorArchitecture="*"/>

<dependency>

<dependentAssembly>

Ossemblyldentity type="win32"

name="Microsoft.Windows.Common-Controls"

version="6.0.0.0"

publicKeyToken="6595b64144ccfldf

" language="*"

processorArchitecture="*"/>

</dependentAs sembly>

</dependency>

</assembly>

К сожалению, версия профаммного продукта (ProductVersion), а также любая другая информация о версии, содержащаяся в проекте (файлы DOF и RES) и настраиваемая в диалоге Project Options среды разработки Delphi, никак не влияет на содержимое манифеста. Поэтому при настройке манифеста в соответствии с потребностями приложения вам придется предварительно отредактировать файл WindowsXP.res или поправить манифест прямо в исполняемом файле. (Ввиду частых перекомпиляций проекта второй вариант представляется довольно обременительным.)


Включение манифеста Windows XP в ресурсы приложения

Так как использование стандартного компонента TXPManifest требует настройки исходного манифеста Delphi для каждого проекта, было бы неплохо изыскать более удобный способ. В качестве альтернативы вы можете подключить манифест к файлу вашего проекта и по мере надобности редактировать его, не опасаясь, что ваша забывчивость может отразиться на версиях в манифестах других приложений.

Для начала необходимо создать исходный файл ресурса RC, включающий единственную строку:

1 24 "ХР.manifest"

где 1 — номер ресурса версии библиотеки ComCtl32.dll, а 24 — номер ресурса манифеста (нумерация соответствует заголовочным файлам, распространяемых Microsoft); "ХР.manifest" — имя файла с документом XML, содержащим манифест. Естественно, манифест нужно настроить в соответствии с потребностями вашего проекта.

Теперь нужно откомпилировать файл ресурса при помощи строчного компилятора-ресурсов \Delphi7\Bin\brcc32.exe и разместить его в папке проекта.

И последняя операция — добавьте в исходный код файла проекта директиву подключения ресурса манифеста:

{$R xpmanifest.res}

В результате при компиляции проекта манифест из ресурса будет добавлен в исполняемый файл приложения.

Пример ресурсов манифеста имеется на дискете, прилагаемой к этой книге.


Визуальные стили и темы оформления

Теперь давайте более подробно разберемся с визуальными стилями и их влиянием на пользовательский интерфейс приложений.

Начиная с операционной системы Widows 95 пользователям был доступен пакет обновления Microsoft Plus!, который позволял использовать темы оформления рабочего стола Windows. Темой называется совокупность настроек цветов, шрифтов, курсоров и прочих ресурсов, необходимых для создания унифицированного пользовательского интерфейса.

Все параметры одной темы сохраняются в файле с расширением theme в виде секций и значений, подобно файлам INI. Существующие темы доступны для выбора в системном диалоге Display Options.

Визуальные стили, интегрированные в Windows ХР, управляют внешним видом и поведением элементов управления. При этом визуальный стиль использует настройки параметров пользовательского интерфейса, заданные текущей темой. Для управления темами визуального стиля операционная система использует менеджер тем.

Визуальный стиль позволяет настраивать внешний вид элементов управления в целом и его составных частей. Правила и методы отрисовки сохраняются в файле с расширением mst, который входит в состав визуального стиля.

Совместно с Windows XP поставляется только один визуальный стиль, и он составляет приятное и свежее впечатление о пользовательском интерфейсе операционной системы.


Визуальные стили в Delphi

В гл. 8 мы детально поговорим о роли действий при разработке пользовательского интерфейса приложения и специальном компоненте для управления действиями — TActionManager. Немного забегая вперед скажем, что этот компонент является своего рода "командным пунктом", из которого должны управляться элементы управления приложения. Сейчас же нас интересует только одно свойство этого компонента

property Style: TActionBarStyle;

По умолчанию среда разработки Delphi предлагает к использованию два стиля:

standard — приложение использует системную библиотеку ComCtl32.dll версии 5;
windows XP — приложение использует системную библиотеку ComCtl32.dll
версии 6 и единственный стандартный визуальный стиль Windows XP.

Эти стили применимы только к элементам управления, размещенным на панелях инструментов (TActionToolBar), созданных в компоненте

TActionManager.

Однако не торопитесь возмущаться явной ограниченностью выбора. Вы можете создать собственный стиль самостоятельно. Правда, это потребует очень много усилий — ведь на основе базовых классов элементов управления вам потребуется создать собственные классы с нужным вам поведением и внешним видом.

Для этого необходимо создать класс нового визуального стиля на основе класса TActionBarstyieEx. Затем новый стиль регистрируется при помощи процедуры

procedure RegisterActnBarStyle(AStyle: TActionBarStyleEx);

После этого ваш стиль становится доступным для свойства style компонента TActionManager. Чтобы отменить стиль, используйте процедуру

procedure UnRegisterActnBarStyle(AStyle: TActionBarStyleEx);

Например, обе эти операции удобно выполнить при инициализации и деинициализации модуля, описывающего класс стиля:

Листинг 6.3. Вариант регистрации и отмены собственного визуального стиля

var MyStyle: TMyStyleActionBars;

...

initialization

MyStyle := TMyStyleActionBars.Create;

RegisterActnBarStyle(MyStyle);

finalization

UnregisterActnBarStyle(MyStyle);

MyStyle.Free;

end.

Для смены стиля приложения можно использовать глобальную переменную нового стиля (см. листинг 6.3). Ее достаточно присвоить свойству style:

ActionManagerl.Style := MyStyle;

При смене стиля все элементы управления, расположенные на панелях компонента ActionManagerl, будут уничтожены и созданы заново с использованием настроек нового стиля.

Класс TActionBarstyieEx имеет всего несколько методов, которые необходимо перекрыть при создании собственного стиля. Все они возвращают классы объектов, используемых при создании пользовательского интерфейса. Рассмотрим их.

Функция

function GetStyleName: string;

возвращает имя стиля.

Функция

function GetColorMapClass(ActionBar: TCustomActionBar): TCustomColorMapClass;

позволяет получить ссылку на класс компонента настройки цветовой палитры (см. разд. "Компоненты настройки цветовой палитры" далее в этой главе), используемый панелью инструментов.

Следующие три метода дают информацию о классах различных типов элементов управления, используемых при проектировании пользовательского интерфейса с помощью компонента TActionManager.

Для того чтобы получить доступ к элементам управления, связанным со стилем, предназначен метод

function GetControlClass(ActionBar: TCustomActionBar; AnItem:

TActionClientltem): TCustomActionControlClass;

Он возвращает класс элемента управления из панели ActionBar, связанного с элементом управления Anitem. Именно эта функция вызывается при создании элементов управления в панелях инструментов компонента

TAct ionManager.

Как уже говорилось выше, при присвоении свойству style компонента TActionManager нового значения (экземпляра класса разработанного вами визуального стиля) уничтожаются все существующие элементы управления и затем создаются новые. И в процессе создания каждого визуального компонента вызывается функция Getcontrolciass нового стиля, а возвращенное ею значение используется для вызова конструктора соответствующего класса.

Аналогично, для получения класса, используемого в панели меню, применяется метод

function GetPopupClass(ActionBar: TCustorrActionBar) : TGetPopupClass;

и для классов кнопок панели инструментов применяется функция

function GetScrollBtnClass: TCustomToolScrollBtnClass;

А класс самой панели инструментов возвращает функция

function GetAddRemoveltemClass(ActionBar: TCustomActionBar): TCustomAddRemoveltemClass;

Итак, после разработки и отладки собственных классов элементов управления с заданными свойствами вам потребуется создать потомка от класса TActionBarstyieEx и перекрыть все перечисленные выше функции так, чтобы они возвращали нужные классы для используемых типов элементов управления.



Theme API

Помимо описанного способа создания и управления визуальными стилями разработчик может использовать функции Theme API, разработанные Microsoft для этих целей.

Для того чтобы использовать Theme API, можно стандартным способом подключить к проекту динамическую библиотеку Theme.dll:

var ThemeDLL: HINST;

...

begin

ThemeDLL := LoadLibrary('theme.dll');

if ThemeDLL <> 0 then

begin

...

end;

end;

Затем можно использовать возможности этого программного интерфейса напрямую. С деталями его реализации вы можете ознакомиться в документации Microsoft MSDN.

Однако можно поступить проще. В составе Delphi 7 имеется модуль Ux-Theme.pas, в котором как раз и реализованы возможности Theme API. Кроме этого, модуль Themes.pas содержит классы для основных элементов управления, которые могут использоваться при создании визуальных стилей, а также класс менеджера тем TThemeServices.

Так как детальное обсуждение возможностей Theme API выходит за рамки этой книги, в листинге 6.4 представлен схематичный пример использования функций этого программного интерфейса. Кроме того, как и все остальные API, работающие с GUI (Graphic User Interface) операционной системы, реальный код с использованием Theme API всегда перегружен многочисленными и ужасными на вид (а на самом деле вполне безобидными) функциями, рассчитывающими области вывода, неклиентские зоны оконных элементов и т. д.

Поэтому наш пример лишь показывает, как загрузить динамическую библиотеку theme.dll и получить ссылку на тему визуального стиля для текущего окна и кнопочного элемента управления.

Листинг 6.4. Пример использования функций Theme API в Delphi

var DC: HOC;

CurrentThemeData: HTHEME;

begin

if UseThemes and InitThemeLibrary then

try

DC := GetWindowDC(Handle) ;

try CurrentThemeData := OpenThemeData(0, 'button');

CloseThemeData(CurrentThemeData);

finally

ReleaseDC(Handle, DC);

end finally

FreeThemeLibrary;

end else

ShowMessage('Приложение или операционная система не поддерживают использование Theme API');

end;

Функция

function UseThemes: Boolean;

проверяет способность операционной системы и приложения использовать Theme API.

Методы

function InitThemeLibrary: Boolean;

procedure FreeThemeLibrary;

соответственно инициализируют и выгружают библиотеку theme.dll.

Графический контекст ос наверняка понадобится при отрисовке элементов управления (см. гл. 10).

Функция

OpenThemeData: function(hwnd: HWND;

pszClassList: LPCWSTR): HTHEME; stdcall;

возвращает дескриптор темы для текущего визуального стиля и класса, имя которого представлено параметром pszdassList.

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

При завершении работы не забудьте освободить занятые дескрипторы графического контекста и темы. Для темы используйте функцию

CloseThemeData: function(hTheme: HTHEME): HRESULT; stdcall;

Заинтересованный читатель найдет подробное описание нужных функций Theme API в Microsoft MSDN или же может полюбопытствовать содержимым модулей UxTheme.pas и Themes.pas.


Компоненты настройки цветовой палитры

Помимо создания собственных визуальных стилей, что является делом довольно трудоемким и хлопотным, вы можете изменить внешний вид пользовательского интерфейса приложения более легким способом. Впервые в составе Палитры компонентов Delphi 7 появились специализированные компоненты, позволяющие настраивать цветовую палитру всех возможных деталей пользовательского интерфейса одновременно. Эти компоненты расположены на странице Additional:

TstandardColorMap — по умолчанию настроен на стандартную цветовую палитру Windows;
TXPColorMap — по умолчанию настроен на стандартную цветовую палитру Windows XP;
TTwilightColorMap — по умолчанию настроен на стандартную полутоновую (черно-белую) палитру Windows.
Все они представляют собой контейнер, содержащий цвета для раскраски различных деталей элементов управления. Разработчику необходимо лишь настроить эту цветовую палитру и по мере необходимости подключать к пользовательскому интерфейсу приложения. Для этого снова используется компонент TActionManager.

Все панели инструментов (класс TActionToolBar), созданные в этом компоненте (см. гл. 8), имеют свойство

property ColorMap: TCustomActionBarColorMap;

в котором и задается необходимый компонент цветовой палитры. Сразу после подключения все элементы управления на такой панели инструментов перерисовываются в соответствии с цветами новой палитры.

Обратите внимание, что в компоненте TToolBar, перенесенном из Палитры компонентов на форму вручную, это свойство отсутствует.

Все компоненты настройки цветовой палитры имеют один метод-обработчик

property OnColorChange: TnotifyEvent;

который вызывается при изменении любого цвета палитры.


Резюме

В оформлении пользовательского интерфейса операционной системы Windows ХР появилось новшество — визуальные стили, которые позволяют настраивать не только внешний вид элементов управления, но и их поведение, и даже управлять отрисовкой отдельных частей элементов управления. Это стало возможным благодаря системной библиотеке ComCtl32.dll версии 6.

Любое приложение может использовать возможности этой библиотеки по созданию "продвинутых" пользовательских интерфейсов. Для этого оно должно содержать манифест — документ XML, описывающий, какую версию ComCtl32.dll используют его элементы управления.

Для отрисовки частей элементов управления приложение может использовать функции Theme API, разработанные Microsoft. Кроме этого, данный программный интерфейс позволяет управлять менеджером тем, который сменяет текущие темы для визуального стиля. Темы хорошо известны пользователям, начиная с Windows 95.

Разработчики могут создавать в Delphi 7 собственные визуальные стили, разрабатывая их на основе класса TActionBarStyleEx.



Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

Действия в Delphi

Сообщение -=dp=- » 14 апр 2013, 07:27

Действия (Actions) и связанные с ними компоненты


Действия. Компонент TActionList
События, связанные с действиями
Свойства, распространяемые на клиентов действия
Прочие свойства
Стандартные действия
Категория Edit
Категория Search
Категория Help
Категория File
Категория Dialog
Категория Window
Категория Tab
Категория List
Категория Internet
Категория Format
Категория Dataset
Категория Tools
Компонент TActionManager
Изменение и настройка внешнего вида панелей
Ручное редактирование коллекций панелей и действий
Резюме

С давних пор повелось, что стандарты на пользовательский интерфейс Windows-приложений Microsoft задает "явочным порядком". Первая громкая история на эту тему связана с появлением в 1994 г. Excel 2.0 for Windows, когда разработчики из Редмонда впервые применили интерфейс со многими документами (впоследствии широко известный как MDI) и даже не подумали задокументировать и опубликовать его. После справедливого возмущения широких кругов программистской общественности Microsoft исправился и теперь новые возможности интерфейса публикуются если не до выхода продукта, то, по крайней мере, ненамного позже. Вспомним, с Internet Explorer появилась панель CoolBar и кнопки, картинки, которые подсвечивались при прохождении над ними курсора мыши. Большинство же новинок связано с флагманским продуктом Microsoft — Office. Одна из них — весьма, кстати, полезная — это система настраиваемых пользователем меню и панелей инструментов.

В Delphi 7 разработчику предоставляется доступ к аналогичным возможностям. Правда, для работы с ними придется забыть "старый" интерфейс — компоненты TMainMenu, TToolBar — и полностью переучиться. Теперь "продвинутый" интерфейс состоит из новых компонентов TActionManager, TActionMainMenuBar, TActionToolBar и примкнувшего к ним TCustomizeDlg (страница Палитры компонентов Additional). Для читателя уже знакомого с действиями (Actions) названия этих компонентов покажутся знакомыми. Действительно, это — гибриды прежнего TActionList и панелей инструментов, плюс новые свойства и методы, плюс большое число полезных стандартных действий.

Данная глава посвящена рассмотрению принципов их использования. Сначала поговорим о понятии действия (Action) и рассмотрим компонент TActionList, который является кроссплатформенным (работает как в Delphi 7, так и в Kylix). Далее рассмотрим обширный набор стандартных действий.

И в заключение читатель узнает о Windows-потомке TActionList под названием TActionManager и о связанных с ним компонентах.


Действия. Компонент TActionList

Пользовательский интерфейс современных приложений весьма многообразен, и зачастую один и тот же результат можно получить разными способами — щелчком на кнопке на панели инструментов, выбором пункта меню, нажатием комбинации клавиш и т. п. Можно решить проблему "в лоб" и повторить один и тот же код два, три раза и т. д. Недостатки такого подхода, очевидно, не обязательно комментировать. Можно воспользоваться Инспектором объектов и назначить пункту меню тот же обработчик события, что и кнопке, благо событие onclick имеет везде одинаковый синтаксис. Этот способ неплох, но при большом количестве взаимных ссылок легко запутаться.

Наконец, современный способ — это воспользоваться компонентом TActionList и разом решить эти проблемы. Как следует из названия, это — централизованное хранилище, где воздействия со стороны пользователя связываются с реакциями на них.

Действием (Action) будем именовать операцию, которую пользователь хочет произвести, воздействуя на элементы интерфейса. Тот компонент, на который он хочет воздействовать, называется целью действия (Action target). Компонент, посредством которого действие инициировано (кнопка, пункт меню), — клиент действия (Action client). Таким образом, в иерархии классов Delphi действие TAction — это невизуальный компонент, который играет роль "черного ящика", получающего сигнал от одного или нескольких клиентов, выполняющих действия над одной (или разными) целями.

Примечание

Действия могут работать только будучи объединенными в список компонентов TActionList или TActionManager. Вне этих компонентов применение действий невозможно.

Спроектировав на бумаге пользовательский интерфейс, начните работу с помещения на форму компонента TActionList. Он находится в Палитре компонентов на первой странице Standard (вот видите какое ему уделяется внимание!). После этого следует запустить редактор списка действий двойным щелчком мышью на компоненте или с помощью контекстного меню (рис. 8.1).

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


Рис. 8.1. Внешний вид редактора действий компонента TActionList


Рис. 8.2. Опубликованные свойства объекта TAction

Помимо них можно вставить и обычное действие, которое получит имя Action1. Итак, что же из себя представляет действие? Его опубликованные свойства показаны на рис. 8.2. Рассмотрим их по группам.


События, связанные с действиями

Компонент TAction реагирует на три события: OnExecute, OnUpdate И OnHint.

Первое — и самое главное — должно быть как раз реакцией на данное действие. Это событие возникает в момент нажатия кнопки, пункта меню — короче, при поступлении сигнала от клиента действия. Здесь — как правило—и пишется обработчик. Почему "как правило"? Потому что схема обработки сигнала 4-этапная:

1. Сначала вызывается обработчик события OnExecute списка действий

TActionList:

property OnExecute: TActionEvent; TActionEvent = procedure (Action: TBasicAction; var Handled: Boolean)

of object;

Если обработчик этого события вами не предусмотрен, или в параметре Handled он вернул значение False, происходит генерация следующего события — шаг 2.

2. Вызывается обработчик события onActionExecute глобального объекта Application (тип события тот же — TActionEvent). Если и оно не обработало сигнал действия, переходим к следующему шагу.

3. Вызывается обработчик события onExecute самого действия (объекта типа TAction или его потомка).

4. Если первые три шага не обработали ситуацию (вернули False), то, вероятно, это было связано с неправильной целью (Target) действия. В качестве "последнего шанса" приложению посылается сообщение CM_ACTIONEXECUTE. В этом случае происходит поиск другой цели для данного действия (об алгоритме поиска цели см. ниже).

Первые две возможности в этом списке используются относительно редко. Тем не менее они полезны, если вам нужно глобально добавлять/удалять/разрешать/запрещать действия.

Введение события onupdate является очень хорошей находкой, о нем напишем подробно. И автор этих строк, и, возможно, вы потратили немало времени, чтобы в разрабатываемых программах элементы управления находились в актуальном состоянии. Если, скажем, вашей программой открыт первый файл, то нужно активировать ряд кнопок и пунктов меню (Save, Save as, Print и т. п.); как только закрыт последний — отключить их. Если в буфере обмена есть что-то подходящее, необходимо активизировать пункт меню и кнопку Paste, если нет — отключить. В результате код, отслеживающий это, у неопытных программистов "размазывается" по всему приложению. А ведь можно поступить проще. Событие TAction.onUpdate возникает в моменты простоя приложения, т. е. тогда, когда оно не занято обработкой сообщений (цикл содержится в методе idle объекта Application). Это гарантирует, что оно возникнет ДО ТОГО, как пользователь щелкнет мышью и увидит выпадающие пункты меню; поэтому можно успеть обновить их состояние. Пример использования события onupdate:

procedure TForml.PasteActionUpdate(Sender: TObject); begin

TAction(Sender).Checked := Clipboard.HasFormat(CFJTEXT);

end;

Примечание

Перед вызовом события onupdate также происходит 4-этапная последовательность действий, точно такая же, как при OnExecute.

Третье событие имеет такой тип:

THintEvent = procedure (var HintStr: string; var CanShow: Boolean) of object;

Оно вызывается тогда, когда от элемента управления требуется показать подсказку, связанную с данным действием. В обработчике события можно указать, будет ли что-нибудь показываться (параметр CanShow) и, если да, то что именно (параметр Hintstr).

Это были события, относящиеся к компоненту TAction. Сам компонент TActionList также имеет три события: OnExecute, OnUpdate И OnChange. О первых двух мы уже сказали; третье происходит в момент изменения списка (добавления или удаления действий).


Свойства, распространяемые на клиентов действия

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

Таблица 8.1. Свойства компонента TAction, автоматически распространяемые на всех его клиентов

Свойство
Назначение

property Caption: string;
Заголовок, связанный с действием

property Hint: string;
Подсказка к действию

property Enabled: Boolean;
Устанавливает, разрешено/запрещено ли действие

property Checked: Boolean;
Устанавливает, отмечено ли действие

property Grouplndex: Integer;
Индекс группы, в которую входит действие. Объекты TAction с одним значением этого свойства (причем большим нуля) имеют зависимое переключение. Если свойство Checked любого объекта из группы устанавливается в True, у остальных оно сбрасывается в False

property AutoCheck: boolean;
Установка в True автоматически меняет значение свойства checked на противоположное после каждого выполнения действия

property Imagelndex: Integer;
Индекс картинки в общем наборе картинок (набор указывается в свойствах родительского TActionList)

property HelpType: THelpType;
Указывает на тип значения, связывающего действие с разделом системы помощи

(htKeyword/htContext)

property HelpContext: THelpContext;
Если свойство HelpType установлено в htContext, это свойство содержит ID раздела системы помощи

property HelpKeyword: string;
Если свойство HelpType установлено в htKeyword, то свойство содержит ключевое слово (термин), по которому происходит открытие соответствующего раздела системы помощи


Вы привыкли к программам с картинками в меню и на панелях инструментов? Действие также можно снабдить картинкой. Компонент TActionList связывается со списком картинок TimageList, а действие TAction — с конкретной картинкой через свойство imageindex. Таким образом, все элементы управления, связанные с действием, — кнопки и пункты меню — будут иметь одну и ту же картинку, как показано на рис. 8.3. Впрочем, это относится ко всем остальным свойствам из табл. 8.1.


Рис. 8.3. Меню и панель инструментов используют один список действий



Прочие свойства

Чтобы связать с действием комбинацию "горячих" клавиш, выберите одну из возможных комбинаций в редакторе свойства shortcut. Более того, в Delphi 7 существует возможность добавлять не одну, а множество комбинаций "горячих" клавиш. Вторая и последующие должны быть заданы в свойстве secondaryshortcuts. Когда вызывается редактор этого свойства, пользователь видит обычный редактор набора строк. И вводить комбинации нужно по принципу "как слышится, так и пишется": например <Ctrl>+<F12>, <Shift>+<Alt>+<0> и т. п., по одной комбинации на каждой строке.

Для упорядочивания все действия разбиты на категории:

property Category: string;

Это свойство содержит условное название категории, к которой относится действие, например, File, Edit, Help и т. п. Роль категории сводится к тому, чтобы объединить сходные действия при показе в ActionList или ActionManager. Названия категорий вы видите на панели меню на самом верхнем уровне.

Иногда программисту все-таки необходимо знать, какой конкретно клиент — меню, кнопка — привел к выполнению действия. Узнать это можно, воспользовавшись значением свойства компонента TAction:

property ActionComponent: TComponent;

Перед вызовом onExecute это свойство содержит указатель на клиента, инициировавшего действие. После вызова значение свойства очищается.

После того как определены действия и написан код, реагирующий на них, осталось поставить завершающую точку и связать их с пользовательским интерфейсом. У большого числа элементов управления (например, всех кнопок и пунктов меню) есть опубликованное свойство Action. Если действия к этому моменту описаны, то на панели инструментов из выпадающего списка среди возможных значений этого свойства достаточно выбрать нужное действие.


Стандартные действия

Те, кто собирается пропустить этот раздел, считая, что в нем описаны очевидные вещи, сильно ошибаются. Как раз в применении стандартных действий разработчики Borland продвинулись очень сильно. Кто хочет в этом убедиться, может открыть пример WordPad, поставляемый с Delphi 7. Полнофункциональный текстовый редактор, построенный полностью на стандартных действиях, содержит всего две строчки кода.

Шаблоны и заготовки для типовых меню и кнопок появились еще в самой первой версии Delphi. Но в шестой версии действия действительно стали действиями. Это значит, что раньше заготовка содержала только подходящий заголовок. Теперь они содержат в себе все субкомпоненты, весь программный код и делают всю необходимую работу сами.

Возьмем, например, действие TFlieOpen. Оно уже содержит внутри компонент типа TOpenDialog, показывающий список открываемых файлов. Вместо ручного программирования процедуры задания имени файла теперь нужно написать обработчик события TFiieOpen.onAccept (если пользователь ввел в диалоге кнопку ОК) или OnCancel (если отказался от открытия файла). Вот так выглядит весь программный код приложения WordPad:

procedure TForml.FileOpenlAccept(Sender: TObject);

begin

RichEditl.Lines.LoadFromFile

(FileOpenl.Dialog.FileName);

end;

procedure TForml.FileSaveAslAccept(Sender: TObject);

begin

RichEditl.Lines.SaveToFile

(FileSaveAsl.Dialog.FileName);

end;


Рис. 8.4. Окно выбора стандартных действий

С точки зрения программирования стандартное действие — это класс-потомок TCustomAction. Классы действий описаны в трех модулях: более распространенные в stdActns, менее — в ExtActns, действия с наборами данных содержатся в DBActns. Наконец, два действия, работающие со списками, — TStaticListAction И TVirtualLitAction — описаны в отдельном модуле ListActns.

Для выполнения ряда стандартных действий нужно определить понятие "цели" действия (Action Target). Под целью понимается компонент, в отношении которого будет совершаться данное действие. Так, операции редактирования могут выполняться, когда на форме активен текстовый элемент управления (TEdit, TMemo И Т. П.). У любого действия потомка TBasicAction) есть три метода:

function HandlesTarget(Target: TObject): Boolean; virtual;

procedure UpdateTarget(Target: TObject); virtual;

procedure ExecuteTarget(Target: TObject); virtual;

Метод HandiesTarget проверяет, применимо ли действие к цели Target. Если да, то действие производится вызовом метода ExecuteTarget. Если нет, поиск подходящей цели продолжается.

Цель в Delphi 7 определяется по следующему правилу:

первым кандидатом является активный элемент управления на форме (свойство ActiveControl);
если такового нет или он не является подходящим (метод HandiesTarget вернул значение False), целью становится текущая форма, получившая сигнал о действии;
если и она не подходит, происходит рекурсивный перебор всех компонентов на форме в поисках первого подходящего.
В ряде случаев вы можете произвести действие над желаемым компонентом, вызвав метод ExecuteTarget и передав в него в качестве параметра этот компонент.

Примечание

Стандартные действия редактирования, чьи имена начинаются с TEdit, и поиска (TSearch...) применимы только к потомкам компонента TCustomEdit. Стандартные действия расширенного редактирования, имена которых начинаются с TRichEdit, применимы только к потомкам TCustomRichEdit. Оконные стандартные действия (упорядочивание, смена, закрытие дочерних окон; имена начинаются с TWindow) применимы только к формам многодокументного интерфейса, чье свойство FormStyle установлено в fsMDiForm (рис. 8.4).

Многие классы стандартных действий не требуют элемента управления — цели. Так устроены все действия, вызывающие стандартные диалоговые окна (выбор файла, цвета, шрифта, настройка принтера и т. п.). Чтобы отреагировать на такое действие, нужно написать обработчики следующих событий:

property BeforeExecute: TNotifyEvent;

property OnAccept: TNotifyEvent;

property OnCancel: TNotifyEvent;

Первое возникает до показа диалога, второе — после нажатия пользователем кнопки ОК, третье — после нажатия Cancel.

Примечание

Поскольку диалоги входят в действия в качестве дочерних компонентов, вы можете реагировать и на все "дочерние" события, которые происходят в соответствующем диалоге (OnShow, OnCanClose, OnClose и т. п.)

Поместив на форму стандартные действия, вы заметите, что все они имеют предопределенное значение свойства imageindex. Если так, то где изображение, на которое эти индексы указывают? Вы можете раздобыть его, открыв демонстрационный проект WordPad (папка Demos\ActionBands в поставке Delphi 7). Откройте редактор компонента imageList1 и экспортируйте весь список в виде одного большого файла формата BMP.


Категория Edit

В эту категорию входят компоненты, которые работают с редактируемыми элементами — потомками TCustomEdit. Это, к примеру, TEdit, TMemo, TMaskedEdit, TRichEdit, новый компонент TLabeledEdit И др. Причем целью может являться не любой редактируемый элемент, а только тот, что имеет фокус ввода. К Категории относятся: TEditCut, TEditCopy, TEditPaste, TEditSelectAll, TEditDelete, TEditUndo.


Категория Search

Действия поиска и замены тоже производятся только над потомками TCustomEdit. И это не прихоть разработчиков Borland: это сделано для вашего же удобства. Раньше для поиска приходилось самому программировать события OnFind и OnReplace соответствующих диалогов, а сейчас требуемый код уже содержится внутри действий.

К Компонентам этой категории относятся: TSearchFind, TSearchFindFirst, TSearchFindNext, TSearchReplace.


Категория Help

С помощью этих действий (табл. 8.2) вы можете вызвать справочную систему вашего приложения.

Таблица 8.2. Стандартные действия категории Help

Компонент
Назначение

THelpContents
Показывает оглавление системы справки

THelpOnHelp
Показывает подсказку по использованию системы справки

THelpContext
Показывает справку по контексту активного элемента управления (причем он должен быть ненулевым)

THelpTopi cSearch
Показывает окно поиска системы справки




Категория File

Эти действия скорее всего будут наиболее востребованы разработчиками. И они же являются довольно простыми в использовании. TFiieOpen, TFileSaveAs, TFilePrintSetup — это оболочки над соответствующими диалогами. О том, как работать с такими действиями, описано выше. Действие TFlieExit вообще не требует комментариев — оно просто завершает приложение, закрывая его главную форму.

Особняком стоит только TFileRun!!!


Категория Dialog

Эта категория примыкает к предыдущей, в ней содержатся остальные пять типовых действий-диалогов: TPrintoig, TCoiorSeiect, TFontEdit (из модуля StdActns), TOpenPicture, TSavePicture (модуль ExtActns).



Категория Window

Эти действия стоит включать в интерфейс, только если вы используете многодокументный интерфейс (MDI). Названия компонентов говорят сами за себя: TWindowClose, TWindowCascade, TWindowTileHorizontal, TWindowTileVertical, TWindowMinimizeAll, TWindowArrange.


Категория Tab

Здесь всего два компонента — TNextTab и TPreviousTab. Если цель действия — набор страниц (TPageControl), они переключат его на следующую и предыдущую страницу соответственно.


Категория List

В этой категории выделяются две группы действий. Первые пять из них (табл. 8.3) автоматизируют работу с выделенными элементами списков. Оставшиеся два — TStaticListAction И TVirtualListAction — требуют отдельного рассмотрения.

Таблица 8.3. Действия по работе с выделенными элементами списков

Действие
Назначение

TListControlSelectAll
Выделяет все элементы списка. Активно, только если у списка свойство MultiSelect установлено в значение True

TListControlClearSelection
Отменяет выделение элементов в списке

TListControlDeleteSelection
Удаляет выделенные элементы

TListControlCopySelection
Копирует выделенные элементы списка в список Destination

TListControlMoveSelection
Переносит выделенные элементы списка в список Destination


Действия работают с компонентом TListBox, а в среде Kylix — еще и с TListview (не путать с одноименным компонентом для Windows — он не годится для данной категории). Подходит также и TCоmbовох.

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

Особняком стоят два действия — TStaticListAction И TVirtualListAction

По замыслу разработчиков они являются централизованными хранилищами элементов для многих списков. Причем элементы списка могут храниться сразу с заданными картинками (т. е. свойствами imageindex) и указателями на сопутствующие данные.

Дальнейшее просто — разработчик выбирает нужные компоненты TListBox, TComboBox и т. п. и в их свойстве Action указывает на действие — хранилище. Опубликовано свойство Action у компонента TCоmbовохЕх (впервые появившегося в Delphi 6). У остальных потомков TControl это свойство относится к группе видимости public, поэтому вы можете сделать присвоение при запуске приложения (в методе onCreate главной формы).

Если действие и компонент-список связаны, то должны происходить две вещи:

при изменении текущего элемента в любом из компонентов происходит синхронное изменение во всех остальных;
когда пользователь выбирает один из элементов списка, выполняется действие, связанное с этим списком, и вызывается метод-обработчик
type TItemSelectedEvent = procedure(Sender: TCustomListAction;

Control: TControi) of object;

property OnltemSelected: TItemSelectedEvent;


Категория Internet

Здесь всего три — типовых для пользователя Сети — действия.

Действие TBrowseURL открывает URL, заданный в одноименном свойстве. Поскольку это происходит при помощи функции shellExecute, для просмотра открывается браузер, зарегистрированный в системе по умолчанию.

Действие TSendMail запускает программу — почтового клиента для отправки письма (с помощью интерфейса MAPI). Текст письма вы можете задать в свойстве Text. Но! Ни получателя, ни тему, ни вложений задать нельзя — это придется делать вручную в почтовой программе. При желании полностью автоматизировать процесс отправки вам придется породить дочерний компонент от действия TSendMail, где и перекрыть метод ExecuteTarget.

Исходные тексты — в модуле ExtActns.

Наконец, самый сложный компонент TDownloadURL. Он позволяет загрузить содержимое с адреса URL и сохранить его на локальной машине под именем FileName.

Поскольку загрузка — процесс долгий, в то время, пока она происходит, периодически возникает событие

property OnDownloadProgress: TDowriloadProgressEvent;

TDownloadProgressEvent = procedure(Sender: TDownLoadURL;

Progress,

ProgressMax: Cardinal; StatusCode: TURLDownloadStatus;

StatusText: String;

var Cancel: Boolean) of object;

Параметры обработчика этого события следующие.

Progress и ProgressMax — текущее и максимальное значение показателя хода скачивания. Во-первых, не все HTTP-серверы правильно сообщают о размере ответа; во-вторых, для некоторых типов файлов (например, HTML) эти параметры вычисляются не всегда верно (вы можете это видеть в Internet Explorer); в-третьих, из-за маршрутизации пакетов ожидать ритмичного изменения параметра Progress не следует. Поэтому пользователю надо показывать соотношение progress/ProgressMax.
Примечание

Значение ProgressMax может быть равно нулю. В этом случае о ходе загрузки численно судить нельзя. Информацию несут другие параметры события.

StatusCode и StatusText — код, описывающий текущее состояние операции и соответствующий ему текст. Список возможных кодов содержит около 30 значений. Для тех, кто знает протокол HTTP и хочет разобраться в этом глубже, следует обратиться к описанию интерфейса IBindstatusCallback в MSDN. Если же вам достаточно показать пользователю текст, то он содержится во втором параметре. По содержанию он представляет примерно то же, что вы видите при загрузке файлов с помощью Internet Explorer.
Cancel — этот параметр одинаков для всех долго продолжающихся операций. Установив его в значение True, вы можете прервать выполнение загрузки.

Категория Format

Действия этой категории представляют собой расширенные операции редактирования для "продвинутого" редактора TRichEdit. Эти операции должны быть знакомы вам по программе WordPad из состава Windows. В крайнем случае откройте демонстрационный пример Delphi с тем же названием — там присутствуют действия настоящей категории и подавляющее большинство остальных в списке присутствуют TRichEditBold, TRichEditltalic, TRichEditUnderline, TRichEditStrikeout (установка стиля шрифта), TRichEditBullets (значки абзацев), TRichEditAlignLeft, TRichEditAlignRight, TRichEditAiignCenter (выравнивание текста).


Категория Dataset

Эти действия можно увидеть, например, в качестве кнопок на любом компоненте TDBNavigator: TDataSetFirst, TDataSetPrior, TDataSetNext, TDataSetLast, TDataSetDelete, TDataSetlnsert, TDataSetEdit, TDataSetPost, TDataSetCancel, TDataSetRef resh. Читатель задаст вопрос: а как действие связывается с набором данных? Очень просто: через дополнительное (для данной категории) свойство DataSource. Если источник данных существует и связан с имеющимся набором данных (свойство DataSource.Dataset), то действие выполняется над ним.


Категория Tools

Здесь содержится один-единственный член: TCustomizeActionBars. Будучи вызванным, это действие вызывает диалог настройки панелей действий, относящихся к компоненту TActionManager, о котором, собственно, сейчас и пойдет речь.


Компонент TActionManager

Если вы не думаете о переносе своего приложения в среду Linux, то имеются все основания воспользоваться потомком TActionList — компонентом TActionManager (далее в тексте — менеджер действий). Более современный и "продвинутый" он обеспечит вас многими дополнительными возможностями. Итак, обо всем по порядку.

Будучи применен сам по себе, компонент TActionManager ничем не отличается от предшественника. Отличия проявляются, если действия из этого компонента разместить на специальных панелях — TActionMainMenuBar (будем называть его панелью главного меню) и TActionToolBar (далее — панель действий).

На первой странице редактора TActionManager (вызывается двойным щелчком или командой Customize из контекстного меню; показан на рис. 8.5) как раз и содержится список всех панелей, связанных с данным менеджером действий. Вы можете добавить новый или убрать компонент TActionToolBar нажатием кнопок New и Delete соответственно. С компонентом TActionMainMenuBar так по понятным причинам поступить нельзя — меню полагается иметь одно.


Рис. 8.5. Первая страница редактора свойств компонента TActionManager

Самый простой и рекомендованный Borland способ для связи действий с одной стороны и панелей меню и инструментов с другой — это перетаскивание (Drag-and-Drop). На второй странице редактора содержится список всех действий по категориям. И отдельное действие, и целую категорию можно брать и тащить мышью на нужную панель (рис. 8.6).

Когда вы перетаскиваете действие на панель, на нем появляется специальный компонент, похожий на пункт меню или кнопку. Его роль — служить клиентом данного действия. Поэтому, естественно, он сразу и автоматически получает нужные Caption, imageindex, Hint и прочие общие для всех клиентов свойства, о которых говорилось выше. Класс этого клиента — TActionclientitem; будем называть их псевдокнопками или псевдоэлементами.

При перетаскивании нет особых сложностей, но надо иметь в виду следующие аспекты:

при перетаскивании всей категории на панель главного меню она появляется в виде пункта меню верхнего уровня и содержит при этом все свои дочерние действия;
при перетаскивании всей категории на панель действий создаются псевдокнопки для всех дочерних действий в категории. Логично поступить по принципу "одна категория — одна панель действий", это будет полезно для настройки интерфейса пользователем;
если вы ошиблись при перетаскивании, не нажимайте кнопку Delete — при этом удалится не только псевдокнопка, но и само действие. Перетяните ненужный псевдоэлемент за пределы панелей действий, тогда он будет удален;
если вы уже перетянули категорию на панель главного меню, а потом решили добавить к ней действия, то вам придется убрать соответствующий ей псевдоэлемент и перетянуть всю категорию заново. Либо воспользоваться ручным способом, который описывается ниже.

Рис. 8.6. Страница действий редактора свойств компонента TActionManager


Изменение и настройка внешнего вида панелей

Мы подошли к совсем новому свойству панелей — TActionMainMenuBar. Теперь — как в Microsoft Office — возможно прятать редко используемые пункты меню. В самом деле, интерфейс программ подчас настолько сложен, что используют его на 100% минимальное количество пользователей. Поэтому элементы интерфейса, которые пользователь не задействовал в каком-то числе предыдущих запусков, автоматически прячутся.

Что и когда прятать, определяется свойством

property PrioritySchedule: TStringList;

значение которого по умолчанию приведено в табл. 8.4. В левой колонке содержится общее количество запусков приложения, в течение которых пользователь применял данное действие; в правой колонке — число запусков, прошедших со времени последнего его использования. По истечении этого числа запусков клиенты действия маскируются. Например, в меню они доступны не сразу, а после нажатия специального пункта с двумя стрелочками, обращенными вниз.

Естественно, чем чаще пользователь обращался к действию, тем дольше оно удержится на виду. Впрочем, если у вас другие взгляды на интерфейс, вы можете изменить значение priorityScedule.

Таблица 8.4. Условия скрытия элементов панелей действий

Количество запусков приложения с обращением к действию
Количество запусков приложения после последнего обращения

0, 1
3

2
6

3
9

4,5
12

6-8
17

9-13
23

14-24
29

Более 25
31


Для подсчета величин, указанных в этой таблице, введены такие свойства:

у объекта TActionBars (дочерний объект TActionManager) есть свойство
property SessionCount: Integer;

которое представляет собой глобальный счетчик запусков приложения;

у каждого объекта TActionclientitem есть два свойства:
property LastSession: Integer;
в этом свойстве хранится номер последнего запуска приложения, в течение которого использовался данный элемент (нумерация совпадает сSessionCount);

property UsageCount: Integer;
счетчик использования элемента.

Но для того, чтобы оперировать данными о количестве запусков, их надо где-то хранить. Организована система хранения следующим образом. У самого менеджера действий есть свойство

property FileName: TFileName;

которое указывает на файл, содержащий все настройки панелей, связанных с данным менеджером. Он имеет формат двоичной формы и считывается/записывается при запуске и выходе из приложения. Впрочем, можно это сделать и в любой момент при помощи методов LoadFormFile и SaveToFile.

Все эти величины меняются автоматически, и их описание приведено для понимания сути происходящего. Сбросить же счетчик статистики запусков можно следующим образом: на этапе разработки на странице Options редактора свойств менеджера действий есть кнопка Reset Usage Count. На этапе выполнения точно такая кнопка есть в диалоге TCustomizeDlg.

Помимо данных для подсчета запусков в этом файле хранится и вся прочая информация о настройках. Последний из не упоминавшихся нами компонентов — диалог настройки TCustomizeDlg. Он представляет собой точную копию редактора свойств TActionManager, но позволяет делать все операции с действиями в режиме выполнения. Вызвать его просто — вызовом метода show. А можно поступить еще проще — есть стандартное действие Customize (категория Tools), которое и подразумевает вызов этого диалога.


Ручное редактирование коллекций панелей и действий

Перетаскивание имеет много достоинств, однако оно не всегда удобно. Поэтому было бы странно, если бы не было предусмотрено другого способа. Хоть он напрямую и не рекомендован в документации, но в ряде случаев более эффективен.

Рассмотрим работу с дочерними объектами менеджера действий, которые упакованы один в другой, как матрешки.

Итак, щелкнем на свойстве ActionManager на форме и посмотрим на содержимое Инспектора объектов. Внутри него мы обнаружим сразу две "матрешки" — свойство ActionBars содержит коллекцию ссылок на дочерние панели, свойство LinkedActionList может содержать дополнительный список действий, отданных "в управление" данному менеджеру — например, для централизованной установки общих свойств.

Щелкнем на свойстве ActionBars. Появится редактор панелей (рис. 8.7), а в Инспекторе объектов обратим внимание на следующее свойство объекта ActionBars:

property Customizable: Boolean;

Это свойство указывает, может ли коллекция редактироваться во время выполнения.

В коллекции содержатся не сами панели, а их "заместители" — объекты типа TActionBaritem, которые на них указывают. Надпись на рисунке "1-ActionBar -> ActionToolBarl" показывает, что первый элемент коллекции связан с панелью ActionTooiBar2. Вы можете добавлять и удалять элементы этой коллекции, по мере необходимости связывая их через свойство ActionBar с уже существующей панелью.


Рис. 8.7. Редактор коллекции панелей компонента TActionManager

Через Инспектор объектов вы можете изменять внешний вид объектов типа TActionBaritem и соответствующих им панелей.

Свойство

property Color: TColor;

отвечает за фоновый цвет панели. Если вам изменения цвета недостаточно, в качестве фона выберите картинку

property Background: TPicture;

которая будет расположена на панели в соответствии со значением свойства

property BackgroundLayout: TBackgroundLayout;

TBackgroundLayout = (blNormal, blStretch, blTile, blLeftBanner, blRightBanner);

Помимо внешнего вида можно разрешить/запретить перетаскивание панелей и их дочерних элементов. Обратимся к свойству

property ChangesAllowed: TChangesAllowedSet;

TChangesAllowed = (caModify, caMove, caDelete);

TChangesAllowedSet = set of TChangesAllowed;

Множество из трех возможных значений позволяет запретить те или иные нежелательные изменения для дочерних элементов панели. Если в него не включен режим caDelete, то элемент нельзя убирать (перетаскивать) с панели. Если нет режима caMove — нельзя передвигать внутри панели. Наконец, отсутствие режима caModify означает запрет на изменение визуальных свойств (заголовка и т. п.).

Внутри коллекции TActionBaritem спрятаны еще две "матрешки" — свойства items и Contextitems. Оба свойства представляют из себя коллекции объектов, указывающих на действия (класс коллекции TActionCiients, класс элемента коллекции TActiondientitem). Первое свойство указывает непосредственно на дочерние действия, второе — на действия, которые будут показаны в качестве всплывающего меню при нажатии правой кнопки мыши.

У коллекции TActionClients есть заслуживающие особого упоминания свойства.

Свойство

property CaptionOptions: TCaptionOptions;

TCaptionOptions = (coNone, coSelective, coAll);

задает показ/отсутствие заголовков дочерних действий. В случае установки в coNone они не показываются, COAII — показываются все, coSelective — показываются в соответствии со значением showCaption дочернего объекта TActiondientitem. Это свойство можно также установить на первой странице редактора менеджера действий в одноименном выпадающем списке.

Свойство

property Smalllcons: Boolean;

указывает размер значков, соответствующих действиям. По умолчанию установлено в значение True (маленькие значки). Визуально оно доступно через тот же редактор — третья страница, флажок Large Icons.

Свойство

property HideUnused: Boolean;

разрешает скрытие редко используемых действий, описанное в предыдущем разделе. Если вы не хотите пользоваться механизмом скрытия, на третьей странице редактора менеджера действий и диалога TCustomizeDig есть флажок Menu show recent items first. Сбросьте его, и свойства HideUnused у клиентов действий установятся в значение False.

И, наконец, коллекцию можно сделать нередактируемой. Для этого у нее есть свойство Customizable.

Ну вот, мы уже добрались до самой маленькой матрешки — TActiondientitem. Этот объект связывается напрямую с одним действием через свойство Action. Правда в него можно спрятать еще меньшую матрешку — у него также есть свойства items и contextitems. Эти свойства используются при организации многоуровневых меню и меню, выпадающих из кнопок (точнее, псевдокнопок — напомним, объекты TActiondientitem на панелях не являются ни кнопками, ни компонентами вообще).



Аватар пользователя
 
Сообщений: 5
Зарегистрирован: 28 мар 2013, 07:56

Re: Delphi

Сообщение Ник » 17 сен 2013, 14:40

Исходники на Delphi бы лучше выкладывали )))




Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1