Delphi 6 программирование

         

П1 2 5 Интеллектуальные возможности редактора



П1.2.5. Интеллектуальные возможности редактора

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

П1.2.5.1. Поиск объявлений

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

Поиск идет в следующем порядке (ниже указаны опции меню и элементы соответствующих окон, содержащие нужные каталоги):

Project | Options | Directories | Conditionals | Search path; Project | Options|Directories | ConditionalsI Debug source path; Tools | Environment Options[Library|Browsing path Tools | Environment Options | Library | Library path.

Нельзя искать объявления, если текущий программный модуль еще ни разу не был сохранен на диске.

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

П1.2.5.2. Создание стандартных заготовок для новых свойств и методов

При объявлении новых свойств класса в интерфейсной секции вы можете написать лишь имя свойства и его тип.

После нажатия Ctrl+Shift+C или щелчка правой кнопкой мыши и выбора продолжения Complete Class at Cursor редактор добавит необходимые элементы Read и Write в описание свойства и внесет другие изменения в текст программы.

Пусть, например, вы написали

type TMyButton = class(TButton) property Size: Integer;

procedure DoSomething;

end;

и нажали Ctrl+Shift+C (текстовый курсор при этом должен находиться в любом месте внутри описания класса). Редактор изменит описание класса следующим образом:



type TMyButton = class(TButton)

property Size:

Integer read FSize write SetSize;

procedure DoSomething;

private

FSize: Integer;

procedure SetSize(const Value: Integers;

end;

и добавит в исполняемую секцию описание двух методов:

{ TMyButton }

procedure TMyButton.DoSomething;

begin

end;

procedure TMyButton.SetSize(const Value: Integer);

begin

FSize := Value;

end;

Вы можете также вставить в раздел implementation новый метод класса и нажать Ctrl+Shift+C - редактор вставит прототип метода в объявление класса в секции interface.

П1.2.5.3. Навигация внутри модуля

Клавиши курсора Вверх (Up) и Вниз (Down) в сочетании с нажатыми и удерживаемыми клавишами Ctrl и Shift осуществляют переключение между секциями interface и implementation текущего модуля. Если в секции interface вас заинтересовала реализация того или иного метода, щелкните по нему мышью и нажмите Ctrl+Shift+Down - редактор отыщет реализацию и покажет ее вам. Наоборот, чтобы из секции implementation переместиться к заголовку метода в секции interface, нажмите Ctrl+Shift+Up.

П1.2.5.4. Вставка текстовых заготовок и окно Code Insight

Редактор может вставлять в текст множество текстовых заготовок, позволяющих сэкономить время ввода кода программы.

Просмотреть имеющиеся текстовые заготовки и при необходимости добавить к ним собственные можно с помощью Tools | Editor Options | Code Insight.

В средней части окна (Рисунок П1.14) с помощью списка Templates можно выбрать имя и краткое описание образца, а в окне Code увидеть и при желании отредактировать соответствующую текстовую заготовку.

С помощью кнопки Add можно добавить новый образец, с помощью Edit — изменить его имя и краткое описание, а с помощью Delete - удалить его.

При редактировании имеющейся или вставки новой заготовки учтите, что символ “|” определяет позицию текстового курсора после вставки заготовки в текст программы.

Для вставки заготовки напечатайте ее имя в окне кода и нажмите Ctrl+J - имя заменится на полный текст заготовки.

Если вы не помните всех имен заготовок, их можно выбрать из списка.

Для этого установите текстовый курсор в то место, где вы хотите вставить заготовку, и нажмите Ctrl+J - на экране появится окно с именами и краткими описаниями всех заготовок.



П1 3 1 Точки контрольного останова



П1.3.1. Точки контрольного останова

Точка контрольного останова определяет оператор в программе, перед выполнением которого программа прервет свою работу и управление будет передано среде Delphi. Точка останова задается с помощью опции view | Debug windows | Breakponts.

Окно точек останова (Рисунок П 1.16) содержит список всех установленных в проекте точек, перед выполнением которых происходит прекращение работы программы и управление получает среда Delphi.

Для добавления новой точки следует щелкнуть по окну правой кнопкой мыши и выбрать опцию Add. В этом случае появляется окно, с помощью которого можно указать положение добавляемой точки: FileName - определяет имя файла;

Line number - номер строки от начала файла (в момент появления окна оно содержит файл и строку с текстовым курсором). В строке Condition можно указать условие останова в виде логического выражения (например, MyValue = Мах-Value-12), а в строке Pass count - количество проходов программы через контрольную точку без прерывания вычислений.



П1 3 3 Принудительное прерывание работы программы



П1.3.3. Принудительное прерывание работы программы

Если программа запущена из среды Delphi, ее работу можно прервать в любой момент G помощью клавиш Ctrl+F2, кнопки, опцией Run | program pause или, наконец, установив точку контрольного останова в той части программы, которая выполняется в данный момент или будет выполнена.



П1 3 4 Трассировка программы



П1.3.4. Трассировка программы

Перед исполнением оператора, в котором установлена точка контрольного останова, работа программы будет прервана, управление получит среда Delphi, a в окне наблюдения отразится текущее значение наблюдаемых переменных и/или выражений. Теперь программист может прослеживать работу программы по шагам с помощью клавиш F7 и F8 или инструментальных кнопок. При нажатии F8 будут выполнены запрограммированные в текущей строке действия, и работа программы прервется перед выполнением следующей строки текста программы. Замечу, что контрольная точка останова выделяется по умолчанию красным цветом, а текущая прослеживаемая строка - синим. Если программа остановлена в контрольной точке, т.е. когда текущая строка совпадает со строкой останова, строка выделяется красным цветом, Признаком текущей строки является особое выделение строки в служебной зоне слева в окне редактора (см. Рисунок П1.18).



П1 3 5 Действия в точках прерывания



П1.3.5. Действия в точках прерывания

В Delphi 5 и 6 с любой точкой можно связать одно или несколько действий. Для этого нужно активизировать окно точек останова, вызвать его локальное меню (щелчок правой кнопкой) и выбрать продолжение Properties. В появившемся окне свойств щелкнуть по кнопке Advanced (Рисунок П1.19).

В нижней части окна имеется панель Actions, с помощью которой и определяются действия для точки останова, указанной в верхней части окна.

Break - простой останов перед выполнением помеченного оператора.

ignore subsequent exceptions - если переключатель установлен, игнорируются все возможные последующие исключения в текущем отладочном сеансе до очередной точки останова, в которой, возможно, это действие будет отменено.

Handle subsequent exceptions - после установки этого переключателя отменяется действие предыдущего переключателя и возобновляется обработка возможных исключений.

С помощью Log message вы можете указать произвольное сообщение, связанное с точкой останова, а с помощью Eval expression - вычислить некоторое выражение и поместить его результат в это сообщение.



П1 3 6 Группировка точек прерывания



П1.3.6. Группировка точек прерывания

В Delphi 5 и б имеется возможность объединения точек останова в группы. Для этого используется все то же окно Рисунок П1.20: в строке Group следует указать имя группы, к которой принадлежит точка, а в строках Enable Group и Disable Group соответственно разрешить или запретить действие всех точек останова, относящихся к соответствующей группе.



П1 3 7 Вычисление выражений и изменение значений



П1.3.7. Вычисление выражений и изменение значений

С помощью окна Evaluate/Modify (Рисунок П1.20) можно узнать значение любого выражения или установить в переменную другое значение. Это окно вызывается в режиме отладки после нажатия Ctrl+F7.

Рис 1.20. Окно прослеживания изменения значении

Это окно - модальное, т. е. оно прерывает отладку программы до тех пор, пока не будет закрыто. В строке Expression можно написать имя переменной или интересующее вас выражение. После щелчка по кнопке Evaluate в поле Result появится текущее значение переменной (выражения). Если в Expression содержится имя переменной, одновременно становится доступной кнопка Modify, а в строке New value повторяется текущее значение переменной. Если изменить эту строку и нажать Modify, в переменную будет помещено новое значение, которое и будет использоваться при дальнейшем прогоне программы (если определяется значение выражения, кнопка Modify и строка New value будут недоступны).

В Delphi 5 и 6 используются также дополнительные кнопки этого окна Watch и inspect. Если вы щелкните по первой из них, выражение (переменная) из окна Evaluate будет перенесено в окно наблюдений watch, щелчок по второй отображает выражение (переменную) в специальном окне Inspect.



П1 3 ОТЛАДКА ПРОГРАММ



П1.3. ОТЛАДКА ПРОГРАММ

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



Подменю File среды Delphi



Рисунок 18.5. Подменю File среды Delphi

Как видим, опции Open, open Ptoject, Save и т. д. снабжены небольшими пиктограммами. Введение пиктограмм в меню, с одной стороны, повышает наглядность меню, а с другой - способствует унификации пиктограмм в рамках механизма действий (см. п. 17.7). Если опция меню связана с каким-то действием своим свойством Action, а компонент TActionList, в котором это действие описано, в свою очередь, связан с хранилищем пиктограмм TimageList (см. 18.5.3), индекс нужной пиктограммы можно задать в свойстве ImageIndex. В этом случае пиктограмма, указанная в свойстве BitMap (если она указана в нем), игнорируется.

Тип TMenu.gif" >



При ее выборе раскрывается подменю



Приложение 1

СРЕДА РАЗРАБОТЧИКА
П 1.1. ГЛАВНОЕ МЕНЮ
П 1.1.1. Опция File
New Опция-заголовок. При ее выборе раскрывается подменю со следующими опциями
Application Создает новую программу для Windows
CLX Application Создает новую программу для Windows и Linux
Data Module Создает новый модуль данных
For.gif" >


с любой программой, поэтому объявленные



Приложение 2

ПЕРЕМЕННЫЕ, ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ SYSTEM
Модуль SYSTEM автоматически связывается с любой программой, поэтому объявленные в его интерфейсной части типы, константы, переменные и подпрограммы доступны программисту в любой момент. В этом приложении приводится (в алфавитном порядке) список всех объявлений модуля в его интерфейсной секции. Следует заметить, что большинство объявлений осталось неизменным еще со времен давнего предшественника Delphi - системы программирования Turbo Pascal. Кроме того, многие подпрограммы описаны в других разделах книги (работа с файлами, с вариантами, преобразование строк и т. п.).
function Abs(X) ; Возвращает абсолютную величину выражения x (целого или вещественного типа)
function Addr(X): Pointer; Возвращает адрес переменной или подпрограммы х
var AllocMemCount: Integer; Возвращает полное количество блоков памяти, выделенных программе
var A11 о cMemS ize: Integer; Возвращает полное количество памяти (в байтах), выделенное программе
procedure Append (var F: Text); Открывает текстовый файл f для добавления новых строк
function ArcTan(X: Extended): Extended; Возвращает Арктангенс (в радианах) x
procedure Assert (expr : Boolean [;const msg: Strings; Проверяет условное выражение ехрг. Выдает сообщение msg и останавливает программу, если выражение имеет значение False, в противном случае ничего не делает
procedure AssignFile (var F; File Name: String) ; Связывает файловую переменную F с файлом, указанным в FileName
function Assigned (var P) : Boolean; False, если указатель р связан с nil (т. е. не указывает на область памяти)
procedure BlockRead(var F: File; var Buf; Count: Integer [; var
AmtTransferred: Integer]);
Читает из файла, связанного с f, в буфер Buf не более count блоков и возвращает в AmtTransfered истинное количество прочитанных блоков
procedure BlockWrite (var f: File; var Buf; Count: Integer [; var pa Buf не более Count блоков и возвращает AmtTransferred: Integer]);procedure Break;
Записывает в файл, связанный с F, в AmtTransfered истинное количество записанных блоковНемедленно прекращает выполнение циклов for, while или repeat
procedure ChDir(S: Strings; Изменяет умалчиваемый каталог на каталог, заданный выражением s
function Chr(X: Byte): Char; Преобразует байт х в символ
procedure Close(var F) ; Закрывает файл F
procedure CloseFile(var F); Закрывает файл f
var CmdLine: PChar; Содержит параметры запуска программы
var CmdShow: Integer; Содержит статус окна, открытого API- функцией showwindow
function CompToCurrency(acomp: Comp): Currency; cdecl;
Преобразует тип Comp к типу currency
function CompToDouble(acomp: Comp): Double; cdecl;
Преобразует тип Comp к типу Double
function Concat(sl [, s2,..., sn]: String): String; Объединяет строки Si в единую строку
procedure Continue; Прекращает очередную итерацию цикла for, while или repeat
function Copy(S; Index, Count: Integer): Stringy;
function Copy(S; Index, Count:
Integer): array;
Возвращает подстроку или сегмент динамического массива
function Cos(X: Extended): Ex tended/
Возвращает косинус аргумента X, заданного в радианах
procedure CurrencyToComp (acurrency: Currency; var result:
Comp); cdecl;
Преобразует тип currency к типу Comp
var DLLProc: Pointer; Указывает точку входа в DLL-процедуру, которая выполняется в данный момент
procedure Dec(var X [ ; N: Long- Int]);
Уменьшает х на n, а если n опущено - на 1. х, n - любые порядковые типы, в том числе Int64
var Default8087CW: Word; Содержит 0, если в ПК нет арифметического сопроцессора, в противном случае разряды слова указывают некоторые технические параметры сопроцессора
procedure Delete(var S: String; Index, Count: Integer);
Удаляет из строки s count символов начи ная с символа с номером index
procedure Dispose(var P: Pointer) ;
Освобождает память, связанную с указателем p
function DoubleToComp(adouble: Double; var result: Comp); cdecl;
Преобразует тип Double к типу Comp
var EmptyParam: OleVariant; Указывает, что умалчиваемый параметр дуального интерфейса не используется
procedure EnumModules(Func: TEnumModuleFunc; Data: Pointers-
overload;
procedure EnumModules(Func:
TEnumModuleFuncLW; Data: Pointer); overload;
Реализует обратный вызов (callback) для всех модулей и всех пакетов программы
procedure EnumResourceModules(Func: TEnumModuleFunc; Data: Pointer); Реализует обратный вызов (callback) для всех ресурсных модулей программы
procedure EnumResourceMod- ules(Func: TEnumModuleFuncLW;
Data: Pointer) ;
function Eof(var F): Boolean; Возвращает True, если достигнут конец файла f (любого типа)
function Eoln [(var F: Text) ]: Boolean-
Возвращает True, если достигнут конец строки или конец текстового файла
procedure Erase(var F) ; Уничтожает файл, связанный с переменной F
var ErrorAddr: Pointer; Содержит адрес исполняемого оператора, вызвавшего ошибку при прогоне программы
var ErrorProc: Pointer; Содержит адрес входа в умалчиваемый обработчик ошибок
var ExceptProc: Pointed; Содержит адрес входа в низкоуровневый обработчик исключений
procedure Exclude(var S: set of T;I:T) ;
Исключает элемент i из множества s
procedure Exit; Завершает работу подпрограммы
var ExitCode: Integer; Возвращает код завершения программы. В современных разработках используйте для
этих целей секцию finalization
var ExitProc: Pointer; Содержит адрес входа в процедуру завер шения программы
function Exp(X: Real): Real; Возвращает х°, где е - основание натурального логарифма
var FileMode: Byte; Указывает режим файла, открытого процедурой Reset: 0 - только чтение; 1 - только запись; 2 - чтение и запись
function FilePos(var F): Longint; Возвращает текущую позицию в файле F
function FileSize(var F): Integer; Возвращает размер нетекстового файла
procedure FillChar(var X; Count: Integer; Value: Byte);
Заполняет переменную х не более Count байтами со значением value
procedure Finalize( var V [; Count: Integer] ) ;
Освобождает динамически распределенную память, связанную с F
function FindClassHIn- stance(ClassType: TClass): Long Word;
Возвращает дескриптор модуля, в котором определен экземпляр класса ClassType
function FindHInstance( Address: Pointer): LongWord;
Возвращает дескриптор модуля, в котором определен адрес Address
function FindResourceHInstance (Instance: LongHord): LongWord;
Возвращает дескриптор ресурсного файла для экземпляра instance
procedure Flush(var F: Text); Записывает буфер файла на диск
function Frac(X: Extended): Ex tended;
Возвращает дробную часть х
procedure FreeMem(var P: Pointer[; Size: Integer]);
Освобождает динамически распределенную память, связанную с P
procedure GetDir(D: Byte; var S: String) ; Возвращает имя диска по его номеру
procedure GetMem(var P: Pointer;Size: Integer); Связывает с указателем p size байт динамической памяти
procedure GetMemoryManager(var MemMgr: TMemoryManager);
Возвращает точку входа в менеджер динамической памяти
procedure Halt [ ( Exitcode: Integer) ] ; Прекращает выполнение программы с кодом завершения ExitCode
var HeapAllocFlags: Word = 2; Указывает, какую память получает менеджер динамической памяти от операционной системы (по умолчанию - gmemmoveable)
function Hi(X): Byte; Возвращает старший байт 16-разрядного числа
function High(X); Возвращает наивысшее значение диапазона порядкового типа, строки или открытого массива, к которому принадлежит х
function lOResult: Integer; Возвращает статус последней операции ввода-вывода
procedure Inc(var X [ ; N: LongInt ] ); Наращивает х на n, а если n отсутствует - на единицу
procedure Include(var S: set ofT; I:T); Включает элемент i в множество S
procedure Initialize(var V [ ; Count: Integer ] );
Инициализирует динамически распределенную переменную v, если она была создана не процедурой New
var Input: Text; Системный файл ввода
procedure Insert(Source: String; var S: String; Index: Integers;
Вставляет подстроку source в строку s начиная с символа index
function Int(X: Extended): Ex tended;
Возвращает целую часть вещественной переменной
var IsConsole: Boolean; Содержит True, если выполняется приложение консольного типа
var IsLibrary: Boolean; Содержит True, если выполняется подпрограмма из DLL
function IsMemoryManagerSet: Boolean; Возвращает True, если менеджер динамической памяти был изменен процедурой Set-MemoryManager
var IsMultiThread: Boolean; Содержит True, если в программе инициировано несколько потоков
var JITEnable: Byte; Указывает тип обработки исключения, возникающего в процессе отладки
function Length (S): Integer; Возвращает длину строки
function Ln(X: Real): Real; Возвращает натуральный логарифм х
function Lo(X): Byte; Возвращает младший байт аргумента
function Low(X); Возвращает наименьшее значение диапазона порядкового типа, строки или открытого массива, к которому принадлежит х
var Mainlnstance: LongWord; Содержит дескриптор экземпляра главного модуля программы
var MainThreadID: LongWord; Содержит дескриптор главного потока для текущего модуля
const Maxint = High(Integer); Содержит максимальное значение типа integer (2 147 483 647)
const MaxLongint = High(Longint); Содержит максимальное значение типа Longint(2 147 483 647)
procedure MkDir(S: String); Создает новый каталог
procedure Move(const Source; var Dest; Count: Integers;
Переносит не более count байт из источника Source в приемник Dest
procedure New(var P: Pointer); Создает новую динамическую переменную и связывает ее с p
var NoErrMsg: Boolean=False; Указывает, будут ли ошибки периода исполнения программы сопровождаться сообщениями (False - будут)
var Null: Variant; Используется для указания значения Null переменной вариантного типа
function Odd(X: Longint): Boolean; Возвращает True, если аргумент - нечетное число
procedure OleStrToStrVar (Source: PWideChar; var Dest: String);
Копирует “широкую” (двухбайтную) строку в обычную строку Object Pascal
function Ord(X): Longint; Возвращает порядковое значение перемен ной порядкового типа (в том числе и Int64)
var Output: Text; Файл системного вывода для консольных приложений
function ParamCount: Integer; Возвращает количество параметров запуска программы
function ParamStr(Index: Integer) : String; Возвращает параметр запуска под номером index (для index=0 - имя исполняемого файла)
function Pi: Extended; Возвращает число it=3,141592653589793
function Po3(Substr: String; S:String): Integer; Возвращает номер символа, начиная с которого в строке s располагается подстрока Substr
function Pred(X) ; Возвращает предыдущее значение для выражения х порядкового типа
function Ptr(Address: Integer): Pointer;
Преобразует Address в указатель
var RandSeed: Longint; Определяет стартовое значение для генератора псевдослучайных последовательностей
function Random [ ( Range: Integer) ] ; Возвращает очередное псевдослучайное число.
procedure Randomize; Инициирует генератор псевдослучайных последовательностей.
procedure Read(var F / VI [/ V2,...,Vn ] ); Читает из файла f заданное количество значений и помещает их в переменные vi
procedure Readin([ var F: Text; ] VI [, V2, . . ., Vn ] ) ;
Читает из файла f заданное количество строк и помещает их в переменные vi
procedure ReallocMem(var P: Pointer; Size: Integers;
Изменяет размер динамической переменной
procedure Rename(var F; Newname:String) ; procedure Rename(var F; Newname:PChar) ;
Переименовывает файл, связанный с файловой переменной f
procedure Reset(var F [: File; RecSize: Word ] ) ;
Открывает существующий файл для чтения и/или записи
procedure Rewrite(var F: File [; Recsize: Word ] ) ;
Создает новый файл и открывает его для записи
procedure RmDir(S: Strings; Удаляет пустой каталог s
function Round(X: Extended): Int64;
Округляет вещественное число до ближайшего целого
procedure RunError [ ( Errorcode: Byte ) ];
Останавливает работу программы и сообщает код ошибки
procedure Seek(var F; N: Long- Int) ;
Пропускает n байт от начала файла
function SeekEof [ (var F: Text) ]: Boolean;
Пропускает все байты до конца файла
function SeekEoln [ (var F: Text) ]: Boolean;
Пропускает все символы текстового файла до конца текущей строки
procedure Set8087CW(NewCW: Word); Временно устанавливает новый режим работы арифметического сопроцессора
procedure SetLength(var S; NewLength: Integer);
Устанавливает новую длину строки или динамического массива
procedure SetMemoryManager (const MemMgr: TMemoryManager);
Устанавливает новый менеджер динамической памяти
procedure SetString(var s: String; buffer: PChar; len: Integer) ; Копирует Len символов буфера Buffer в строку s
procedure SetTextBuf(var F: Text; var Buf [ ; Size: Integer] );
Устанавливает внешний буфер Buf длиной size символов для файловой переменной f
function Sin(X: Extended): Ex tended;
Возвращает синус аргумента (в радианах)
function SizeOf(X): Integer; Возвращает длину переменной х в байтах
function Slice(var A: array; Count: Integer): array;
Возвращает открытый массив, содержащий первые count элементов массива а
function Sqr(X: Extended): Extended; Возвращает квадрат аргумента
function Sqrt(X: Extended): Extended; Возвращает корень квадратный из аргумента
procedure Str(X [: Width [: Decimals ] ]; var S) ; Преобразует х целого или вещественного типа в строку s с учетом длины width и
количества знаков после запятой Decimals
function StringOfChar(Ch: CharCount: Integer): String; Создает строку, состоящую из Count раз повторенного символа Ch
function StringToOleStr(const Source: String): PWideChar; Копирует обычную строку в двухбайтную
function StringToWideChar(const Source: String; Dest: PWideChar;
DestSize: Integer): PWideChar;
Преобразует обычную строку в строку с символами UNICODE
function Succ(X) ; Возвращает следующее значение для порядкового аргумента х
function Swap(X) ; Меняет местами байты в 16-разрядном слове
function Trunc(X: Extended): Int64; Преобразует вещественное число к целому путем отбрасывания дробной части
procedure Truncate(var F) ; Отсекает оставшуюся часть файла до его конца
const Unassigned: Variant; Используется для указания варианта с не связанным (пустым) значением
function UpCase(Ch: Char): Char; Преобразует строчный символ Ch в заглавный
procedure Val(S: String; var V;var Code: Integer); Преобразует строковое значение в целую или вещественную величину
function VarArrayCreate(const Bounds: array of Integer; VarType: Integer): Variant;
Создает вариантный массив
function VarArrayDimCount(consfc A: Variant): Integer;
Возвращает количество измерении вариантного массива
function VarArrayHighBound (const A: Variant; Dim: Integer):
Integers;
Возвращает верхнюю границу измерения вариантного массива
function VarArrayLock(var A: Variant): Pointers;
Блокирует вариантный массив и возвращает указатель на его данные
function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;
Возвращает нижнюю границу измерения вариантного массива
procedure VarArrayRedim(var A: Variant; HighBound: Integer) ;
Перестраивает вариантный массив
function VarArrayRef(const A: Variant): Variants-
Преобразует вариантный массив к форме, необходимой при обращении к API- функциям
procedure VarArrayUnlock(var A: Variant) ;
Отменяет действие функции VarArrayLock
function VarAsType(const V: Variant; VarType: Integer): Variants; Преобразует вариант к заданному типу
procedure VarCast(var Dest: Variant; const Source: Variant; VarType: Integer); Преобразует вариант к заданному типу и сохраняет результат в Dest
procedure VarClear(var V : Variant) ; Помещает в вариант пустое значение
procedure VarCopy(var Dest: Vari ant; const Source: Variants;
Копирует вариант-источник Source в вариант-приемник Dest
function VarFromDateTime (DateTime: TDateTime): Variants;
Преобразует дату-время в значение варианта
function VarIsArray(const V: Variant): Boolean;
Возвращает True, если v - вариантный массив
function VarIsEmpty(const V: Variant): Boolean;
Возвращает True, если вариант имеет пустое значение
function VarIsNull(const V: Variant) : Boolean; Возвращает True, если вариант имеет значение Null
function VarToDateTime(const V: Variant): TDateTime) ;
Преобразует вариант в значение дата-время
function VarToStr(const V: Variant) : String; Преобразует вариант в строку.
function VarType(const V: Vari ant) : Integers;
Возвращает тип хранящегося в варианте результата
procedure WideCharLenToStrVar (Source: PWideChar; SourceLen:
Integer; var Dest: String);
Преобразует не более SourceLen символов строки UNICODE к обычной строке
function WideCharLenToString (Source: PWideChar; SourceLen:
Integer): Strings;
Преобразует не более SourceLen символов строки UNICODE к обычной строке
procedure WideCharToStrVar (Source: PWideChar; var Dest:
String);
Преобразует строку UNICODE к обычной строке




функция АгсТап модуля System не



Приложение 3

ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ MATCH
Тригонометрические подпрограммы
function ArcCos(X: Extended): Extended; Арккосинус
function ArcSin(X: Extended): Extended; Арксинус
function ArcTan2(Y, X: Extended): Ex tended; Вычисляет арктангенс Y/X и возвращает угол в правильном квадранте ( функция АгсТап модуля System не учитывает квадрант)
function Cotan(X: Extended): Extended; Котангенс
function Hypot (X, Y: Extended): Extended; Корень квадратный из (X** 2 + Y** 2)-гипотенуза прямоугольного треугольника по двум катетам
procedure SinCos (Theta: Extended; va: '"Sin, Cos: Extended); Возвращает одновременно синус и косинус угла Theta (почти в 2 раза быстрее, чем раздельное получение синуса и косинуса)
function Tan(X: Extended): Extended; Тангенс
Функции преобразования углов
function CycleToRad(Cycles: Extended) : Extended; Radians := Cycles * 2PI
function DegToRad(Degrees: Extended) Extended; Radians := Degrees * PI / 18
function GradToRad(Grads: Extended): Extended; Radians := Grads * PI / 200
function RadToDeg(Radians: Extended) Extended; Degrees := Radians * 180 / PI
function RadToGrad(Radians: Extended) : Extended; Grads := Radians * 200 / PI
function RadToCycle(Radians: Extended) : Extended; Cycles := Radians / 2PI
Гиперболические функции
function ArcCosh(X: Extended): Extended; Гиперболический арккосинус
function ArcSinh(X: Extended): Extended; Гиперболический арксинус
function ArcTanh(X: Extended): Extended; Гиперболический арктангенс
function Cosh(X: Extended): Extended; Гиперболический косинус
function Sinh(X: Extended): Extended; Гиперболический синус
function Tanh(X: Extended): Extended; Гиперболический тангенс
Логарифмические функции
Function LnXP1 (X: Extended) : Exteaded; Логарифм натуральный от (Х+1). Используется, когда Х близок к нулю
functios Extended): Extended; Десятичный логарифм
functior extended): Extended; Двоичный логарифм
function LogN(Base, X: Extended): Extended; Логарифм от X при основании Base
Экспоненциальные функции
function IntPower(Base: Extended; Expopient: Integer) : Extended; Возведение Base в целочисленную степень Exponent
function Power(Base, Exponent: Extended) : Extended; Возведение Base в вещественную степень Exponent
Подпрограммы разного назначения
function Ceil(X: Extended): Integer; Ближайшее меньшее целое
function Floor (X: Extended): Integer; Ближайшее большее целое
procedure Frexp(X: Extended; var Mantissa: Extended; var Exponent: Integer); Возвращает мантиссу и степень вещественного числа
function Ldexp(X: Extended; P: Integer) : Extended; Возвращает Х*Р*P
Статические программы
function Мах(А,В: Int64): Int64; overload;
function Мах (А, В: Integer): Integer; overloads; Возвращает максимальное из двух чисел
function Poly(X: Extended; const Coefficients: array of Double): Extended; Значение полинома A*X"+B*X" '+.. .+Z. Коэффициенты задаются в порядке возрастания степени
function Мах(А,В: Single): Single/overload;
function Max(А,В: Double): Double/overload;
function Max(А,В: Extended): Extended; overload;
function MaxIntValue(const Data: array of Integer): Integer; Возвращает максимальное из набора целых чисел
function MaxValue(const Data: array of Double): Double; Возвращает максимальное из Тнабора вещественных чисел
function Mean(const Data: array of Double): Extended;
Вычисляет арифметическое среднее для набора вещественных чисел
procedure MeanAndStdDev(const Data: array of Double; var Mean, StdDev: Extended) ; Вычисляет арифметическое среднее и стандартное отклонение для набора вещественных чисел
function Min(А/В: Integer): Integer/overload/function Min(А,В: Int64): Int64; overload; Возвращает минимальное из двух чисел
function Min(A,B: Single): Single/overload; function Min(A,B: Double): Double; overload/function Min(A,B: Extended): Extended; overload/
function MinIntValue(const Data: array of Integer): Integer; Возвращает минимальное из набора целых чисел
function MinValue(const Data: array of Double): Double; Возвращает минимальное из набора вещественных чисел
procedure MomentSkewKurtosis (const Data: array of Double; var Ml, M2, МЗ, М4, Skew, Kurtosis: Extended);
Вычисляет статистические моменты порядков с первого по четвертый, а также асимметрию Skew и эксцесс Kurtosis для набора чисел
function Norm(const Data: array of Double): Extended; Возвращает норму (квадратный корень из суммы квадратов) вещественных чисел
function PopnStdDev(const Data: array of Double): Extended; Выборочное стандартное отклонение. Отличается от обычного стандартного отклонения тем, что использует выборочное значение дисперсии (см.ниже PopnVariance)
function PopnVariance(const Data: array of Double): Extended; Выборочная дисперсия. Использует “смещенную” формулу TotalVariance/N (см. ниже TotalVariance)
function RandG(Mean, StdDev: Extended) : Extended; Генерирует нормально псевдораспределенную последовательность чисел с заданным средним значением Mean и стандартным отклонением StdDev
function StdDev(const Data: array of Double): Extended; Вычисляет среднеквадратическое отклонение для набора чисел
function Sum(const Data: array"orDouble): Extended register; Вычисляет сумму чисел
procedure SumsAndSquares(const Data: array of Double; Одновременное вычисление суммы и суммы квадратов для набора чисел
function Sumint(const Data: array of Integer): Integer register; Сумма наоора целых чисел
function SumOfSquares(const Data: array of Double): Extended; Сумма квадратов чисел
function TotalVariance(const Data: array of Double): Extended; Сумма квадратов расстояний всех величин от их среднего арифметического
function Variance(const Data: array of Double): Extended;
Выборочная дисперсия для набора чисел. Использует ^несмещенную” формулу TotalVariance/(N-1)
Финансовые функции
type TPaymentTime = (ptEndOfPeriod, ptStartOfPeriod) ;
Перечисляемый тип, используемый в финансовых функциях
function DoubleDecliningBalance (Cost, Salvage: Extended; Life, Period: Integer): Extended; Вычисление амортизации методом двойного баланса
function FutureValue(Rate: Extended; NPeriods: Integer; Payment, Pre-sentValue: Extended; PaymentTime: TPaymentTime): Extended; Будущее значение вложения
- function InterestPayment(Rate: Extended; Period, NPeriods: Integer; PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended; Вычисление процентов по ссуде
function InterestRate(NPeriods: Integer; Payment, PresentValue, Future-Value: Extended; PaymentTime: TPaymentTime) : Extended; Норма прибыли, необходимая для получения заданной суммы
function InternalRateOfReturn (Guess: Extended} const CashFlows: array of Double): Extended; Вычисление внутренней скорости оборота вложения для ряда последовательных выплат
function NetPresentValue(Rate: Extended; const CashFlows: array of Double; PaymentTime: TPaymentTime): Extended; Вычисление чистой текущей стоимости вложения для ряда последовательных выплат с учетом процентной ставки
function NumberOfPeriods(Rate, Payment, PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended/ Количество периодов, за которые вложение достигнет заданной величины
function Payment(Rate: Extended; NPeriods: Integer; PresentValue, Future-Value: Extended; PaymentTime: TPaymentTime) : Extended/ Размер периодической выплаты для погашения ссуды при заданном числе периодов, процентной ставке, а также текущем и будущем значениях ссуды
function PeriodPayment(Rate: Extended; Period, NPeriods: Integer; PresentValue, FutureValu'e: Extended; PaymentTime: TPaymentTime): Extended; Платежи по процентам за заданный период
function PresentValue(Rate: Extended; NPeriods: Integer; Payment, Future-Value: Extended; PaymentTime: TPaymentTime) : Extended; Текущее значение вложения
function SLNDepreciation (Cost, Salvage: Extended; Life: Integer): Extended; Вычисление амортизации методом постоянной нормы
function SYDDepreciation (Cost, Salvage: Extended; Life, Period: Integer) : Extended; Вычисление амортизации методом весовых коэффициентов
В отличие от функций табл. 7.5 перечисленные выше подпрограммы станут доступны программе только после ссылки на модуль Match в предложении Uses (подробнее об использовании модулей см. в главе 12).




использования компонента



Рисунок 18.30. Пример использования компонента THeaderControl для управления положением и размерами других компонентов

const

Delta = 10;// Зазор между границами заголовка и компонентами

procedure TFor.gif" >




использования компонента Tchart



Рисунок 18.18. Пример использования компонента Tchart

использования компонента ТСотbоВохЕх



Рисунок 18.34 . Пример использования компонента ТСотbоВохЕх


Специфичные свойств а компонента:

property Images: TCustomImageList; Определяет объект-хранилище изображении
property ItemsEx: TComboExItems; Определяет строки списка выбора
property MaxLength: Integer; Определяет максимальное количество символов, которые пользователь может ввести в окне редактора
type TComboBoxExStyle = (csExDropDown, csExSimple, csEx-DropDownList) ; property Style: TComboBoxExStyle; Определяет стиль компонента: csExDrop-Down с кнопкой раскрытия списка и возможностью ручного ввода текста; csExSim-ple - без кнопки (список всегда раскрыт), высота списка определяется свойством Height; csExDropDownList -с кнопкой раскрытия списка, но пользователь не может ввести текст выбора вручную

Строки ItemsEx списка выбора определяет класс TComboExItems, имеющий такие свойства:

property Comboltems[const Index: Integer]: TComboExItem; property Items[const Index: Integer] : TListControlItem; default; type TLi'stItemsSortType = (stNone, stData, stText, stBoth); property SortType: TSortType;

Класс TListControlItem имеет три специфичных свойства: caption (String), Data (Pointer) И Imagelndex (integer), с помощью которых описываются текст элемента, а также связанные с ним данные и индекс изображения. Для установки значений этих свойств используются методы SetCaption, SetData И Setlmagelndex класса TListControlItem.

Класс TComboExitem, с помощью которого описываются строки списка в целом, имеет такие свойства:

property Caption: Strings-property Data: Pointed; Текст элемента выбора Указатель на связанные с элементом данные
property Imagelndex: Timagelndex; Индекс изображения для невыбранного элемента
property Indent: Integer; Отступ элемента от левого края списка
property Overlaylmagelndex: Timagelndex; Индекс изображения-маски
property SelectedlmageIndex: Timagelndex; Индекс изображения для выбранного элемента

Нетрудно заметить, что свойства Caption, Data и Imagelndex дублируют одоименные свойства класса TListControlltem. Свойство Overlaylmagelndex ссылается на черно-белый растр, который накладывается на изображения Imagelndex И Selectedlmagelndex. Этопозволяет реализовать разного рода анимационные эффекты при выводе изображений.



использования компонента TTreeView



Рисунок 18.27. Пример использования компонента TTreeView


Для наполнения списка на этапе конструирования программы нужно щелкнуть по компоненту правой кнопкой мыши и выбрать Items Editor., либо щелкнуть по нему дважды, либо, наконец, щелкнуть по кнопке в свойстве Items - во всех случаях на экране появится окно редактора компонента (Рисунок 18.28).



использования компоненты



Рисунок 18.14 . Пример использования компоненты TSplitter (помечен черными квадратиками)




использования окна пояснений



Рисунок 21.2. Пример использования окна пояснений


Чтобы показать раздел в окне пояснений, нужно выделить текст перекрестной ссылки шрифтом с одинарным подчеркиванием, на пример:

Для проверки АSI-шиныASI и связанных с ней реле и датчиков используется опция Сервис | Контроль шины главного меню.

В выделенную скрытым текстом часть ссылки можно вставить следующие дополнительные управляющие символы:

* отменяет выделение текста ссылки цветом;

% отменяет выделение текста ссылки цветом и подчеркиванием;

@ указывает HLP-файл, в котором расположена нужная тема; > указывает тип окна для отображения раздела.[ Методика работы с Microsoft Word дается для версии 97. Для других версий могут быть незначительные отличия. ]

Символы “*” и “%” вставляются непосредственно перед идентификатором раздела и, так же как и он, оформляются скрытым текстом. Например:

ГИПЕРТЕКСТ %НУРЕРТЕХТ

Теперь в справочном окне слово гипертекст ничем, кроме формы расположенного над ним указателя мыши, не будет отличаться от обычного текста справки, тем не менее щелчок по нему вызовет переход к теме hypertext. В ссылке можно указать только один из символов отмены выделения - “*” или “%”.

Символы “@” и “>”, наоборот, вставляются в конце скрытого текста и за ними должны следовать:

маршрут доступа и имя HLP-файла - для символа “@”; имя типа окна, в котором следует отобразить раздел - для символа “>”; это окно должно определяться в файле проекта (см. п. 21.4.3).

Например, если раздел hypertext расположен в файле c:\proba\proba.hlp и должен показываться в дополнительном окне типа wind, соответствующая ссылка будет такой:

ГИПЕPTEKCT HYPERTEXT@C:\PRQBA\PROBA.HLP>WIND

Обратите внимание: символы “@” и “>”, как и следующие за ними символы маршрута и имени типа окна, должны оформляться скрытым текстом. Если, как в приведенном примере, в ссылке одновременно указываются и маршрут, и тип окна, порядок их следования безразличен, однако в одной ссылке можно указать только один символ “@” и (или) один символ “>”. Замечу, что имя типа окна нужно указывать заглавными буквами, даже если в файле проекта оно определено строчными.



использования таблицы TDrawGrid



Рисунок 18.11. Пример использования таблицы TDrawGrid для отображения картинок и текста


Если вы захотите повторить пример, следует сначала подготовить пустую форму главного окна. Дайте ей имя fmDrawGrid и вставьте в описание класса TfmDrawGrid такое поле:

public

sIBitMap: TSringList;

Это поле будет использоваться для хранения текстовых строк и картинок. Его необходимо создать и наполнить в момент создания окна и уничтожить при его уничтожении. Поэтому создайте следующие Обработчики событий OnCreate и OnDestroy для формы:

procedure TfmDrawGrid.For.gif" >




использования TPaintBox



Рисунок 18.35. Пример использования TPaintBox


procedure TFor.gif" >




использования TStringList



Рисунок 18.10. Пример использования TStringList


Поместите на панель еще одну кнопку TBitBtn и установите в ее свойство Kind значение bkClose. Поместите на панель компонент OpenDialog из страницы компонентов Dialogs. Этот компонент создает и обсуживает стандартное для Windows окно открытия файла. С его помощью при прогоне программы вы сможете выбрать текстовый файл (например, файл с текстом программы), чтобы программа показала в таблице все слова из этого файла. На форму (а не на панель panel1) положите компонент TStringGrid. Поместите в его свойства ColCount и RowCount значения 2 (количество колонок и рядов таблицы должно быть больше, чем количество фиксированных колонок FixedCois и количество фиксированных рядов FixedRows). Установите в свойство Align компонента значение alClient, чтобы он занял все свободное место формы.

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

Создайте такой обработчик события OnClick для кнопки BitBtn1:

procedure TfmStGrid.BitBtnIClick(Sender: TObject) ;

Function GetWord(var S: String): String;

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

строки }

const // Множество символов слова:

Letters: set of Char = ['a'..'z', 'A'..'Z', 'A'..'я'];

begin

Result := '' ;

{ Уничтожаем в начале строки все символы, не относящиеся к слову }

while (S о '') and not (S[1] in Letters) do

Delete (S, 1, 1);

// Формируем очередное слово

while (S<> '') and (S[1] in Letters) do

begin

Result := Result + S[1];

Delete (S, 1, 1)

end;

end; //Get Word

var

F: TextFile; // Файл с текстом S,

Word: String; // Вспомогательные строки

NCol, NRow: Integer;// Номер текущей колонки и текущего ряда Words: TStringList; // Список отсортированных слов из файла

begin

// С помощью стандартного диалога получаем имя файла

if not OpenDialogI.Execute then

Exit; // Пользователь отказался выбрать файл

// Пытаемся открыть файл

AssignFile(F, OpenDialogI.FileName) ;

try

Reset(F) ;

except

// Файл нельзя открыть:

ShowMessage('Невозможно открыть файл ' +OpenDialogI.FileName) ;

Exit;

end;

// Готовим список Words:

Words := TStringList.Create;

Words.Sorted := True; // Сортируем строки Words.Duplicates := duplgnore; // Отвергаем дубликаты

// Изменяем курсор перед длительной работой

Screen.Cursor := crHourGlass;

// Читаем файл по строкам

while not EOF(F) do

begin

ReadLn(F, S); // Читаем очередную строку

// Выделяем из строки слова и заносим их в список Words

while S о '' do

begin

Word := GetWord(S) ;

if Word о '' then

Words.Add(Word) // He вставляем пустые строки

end

end;

Screen.Cursor := crDefault; // Восстанавливаем курсор

CloseFile(F); // Закрываем файл

if Words.Count=0 then

Exit; // Пустой файл - выходим

with sgWords do

begin

NCol := 1; // Номер первого столбца слов

// Цикл формирования таблицы

while Words.Count > 0 do

begin

{Формируем заголовок столбца и начальное значение номера ряда}

Cells [NCol, 0] := Words[0][1];

NRow := О

// Цикл заполнения очередного столбца

while (Words.Count > 0) and

(Words[0][1] = Cells[NCol, 0]) do

begin

inc(NRow); // Номер текущего ряда

if NRow = RowCount then

begin // Расширяем длину таблицы

RowCount := RowCount + 1;

{Для свойства RowCount нельзя, использовать функцию инкремента inc!} Cells [0, NRow] := IntToStr(NRow);

end;

Cells[NCol, NRow] :=Words[0];

Words.Delete(0) ;

end;

// Переходим к следующему столбцу

if Words.Count=0 then

Break; // Кончаем работу, если слов больше нет

inc(NCol); // Переходим к следующей колонке

ColCount := ColCount+1 // Расширяем таблицу справа

//на 1 колонку

end;

end;

end;



Пример компонента с тремя панелями



Рисунок 18.31 . Пример компонента с тремя панелями и кнопкой изменения размеров окна


На Рисунок 18.31 показан компонент TStatusBar с тремя панелями и кнопкой изменения размеров окна, созданный таким обработчиком события OnCreate для формы For.gif" >




Пример многоколенчатого меню



Рисунок 18.6. Пример многоколенчатого меню

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

Для элемента меню определено единственное событие Onciick, которое возникает при щелчке на опции или при нажатии Enter, если в этот момент данная опция была выбрана (подсвечена). Обработчик события становится доступен после двойного щелчка на опции в окне конструктора меню



Пример страницы диаграмм



Рисунок 2.9. Пример страницы диаграмм


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

Страницу диаграмм можно напечатать.



Пример структуры программы



Рисунок 8.1. Пример структуры программы


Procedure A; Procedure Al;

begin

end {A1};

Procedure A2;

begin

end {A2};

begin {A}

end {A};

Procedure B;

Procedure Bl;

begin

end {Bl};

, Procedure B2;

Procedure B21;

И Т. Д.

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

А2, В1

И Т. Д.

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

При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Образно говоря, любая подпрограмма как бы окружена полупрозрачными стенками: снаружи подпрограммы мы не видим ее внутренности, но, попав в подпрограмму, можем наблюдать все, что делается снаружи. Так, например, из подпрограммы В21 мы можем вызвать подпрограмму а, использовать имена, объявленные в основной программе, в подпрограммах в и в2, и даже обратиться к ним. Любая подпрограмма может, наконец, вызвать саму себя - такой способ вызова называется рекурсией.

Пусть имеем такое описание:

var V1 : ... ;

Procedure A;

var V2 : ...;

end {A};

Procedure В;

var V3 : . . . ;

Procedure B1;

var V4 : . . . ;

Procedure В 11;

var V5;

Из процедуры B11 доступны все пять переменных v1,...,v5, из процедуры в1 доступны переменные v1,...,v4, из центральной программы-только v1.

При взаимодействии подпрограмм одного уровня иерархии вступает в силу основное правило Object Pascal: любая подпрограмма перед ее использованием должна быть описана. Поэтому из подпрограммы в можно вызвать подпрограмму а, но из а вызвать в невозможно (точнее, такая возможность появляется только с использованием опережающего описания, см. п. 8.5.) Продолжая образное сравнение, подпрограмму можно уподобить ящику с непрозрачными стенками и дном и полупрозрачной крышей: из подпрограммы можно смотреть только “вверх” и нельзя “вниз”, т. е. подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме.

В Object Pascal допускается произвольная последовательность описания констант, переменных, типов, меток и подпрограмм. Например, раздел var описания переменных может появляться в пределах раздела описаний одной и той же подпрограммы много раз и перемежаться с объявлениями других объектов и подпрограмм. Для Object Pascal совершенно безразличен порядок следования и количество разделов var, type, const и label, но при определении области действия этих описаний следует помнить, что имена, описанные ниже по тексту программы, недоступны из ранее описанных подпрограмм, например:

var V1 : ; . . ;

Procedure S;

var V2 : . . . ;

end {S};

var V3 : . . . ;

Из процедуры s можно обратиться к переменным v1 и v2, но нельзя использовать V3, так как описание этой переменной следует в программе за описанием процедуры s.

Локализованные в подпрограмме имена могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя “закрывает” глобальное и делает его недоступным, например:

var

i : Integer;

Procedure P;

var

i : Integer;

begin

IbOutput.Caption := IntToStr(i);

end {P};

begin

i := 1;

P

end;

Что выведет эта программа на экран? Все что угодно: значение внутренней переменной i при входе в процедуру p не определено, хотя одноименная глобальная переменная имеет значение 1. Локальная переменная “закроет” глобальную, и на экран будет выведено произвольное значение, содержащееся в неинициированной внутренней переменной.

Если убрать описание

var

i : integer;

из процедуры p, то на экран будет выведено значение глобальной переменной i,t. е. 1.

Таким образом, одноименные глобальные и локальные переменные - это разные переменные. Любое обращение к таким переменным в теле подпрограммы трактуется как обращение к локальным переменным, т. е. глобальные переменные в этом случае попросту недоступны.



TToolBar с кнопками TToolButton



Рисунок 18.32. Пример TToolBar с кнопками TToolButton


Поместите на пустую форму компонент TimageList, щелкните по нему правой кнопкой мыши и выберите продолжение ImageList Editor. Для заполнения контейнера ImageList1 подойдут любые небольшие по размеру изображения. К сожалению, растры из каталога images | BUTTONS[ См . замечание в начале главы. ] рассчитаны на использование в кнопках TSpeedButton и содержат по два изображения каждый -обычное и для запрещенной кнопки. Кнопки TToolButton также могут иметь два или три изображения, но эти изображения необходимо размещать в разных контейнерах rimageList, поэтому использование заготовок из каталога images | buttons в кнопках TToolButton приведет к появлению на них по два изображения одновременно[ Точнее, при вставке двойной картинки редактор компонента спросит у вас, надо ли ее разделять на две отдельные картинки. ]. Чтобы этого не произошло, загрузите пиктограммы из каталога images | icons: щелкните по кнопке Add окна редактора и выберите в этом каталоге файл chemical. Повторите П. 2 для фацлов Chip, Construe, Earth, Finance, Handchek, Shipping, Skyline И Technlgy, после чего закройте редактор ImageList. Поместите на форму компонент TToolBar, в окне Инспектора объектов разыщите свойство images, раскройте список в правой колонке строки images и выберите imageListi. Мы указали компоненту на источник изображений и можем теперь вставлять в него кнопки. Щелкните по ToolBar1 правой кнопкой мыши и выберите New Button. Вставьте еще две кнопки, после чего вставьте разделитель NewSeparator. Разместите на TooiBarl остальные кнопки и сепараторы (см. Рисунок 18.33). Если вы захотите, чтобы кнопки имели модный “плоский” вид, установите в свойство Flat компонента ToolBarl значение True.

Свойство Buttons компонента TToolBar позволяет обратиться к каждому дочернему компоненту как к объекту класса TToolButton, имеющему такие свойства:



property AllowAlIUp: Boolean;. Если содержит True, синхронизирует свое состояние с состоянием других кнопок в той же группе: в любой момент может быть нажата только одна кнопка группы. Игнорируется, если Grouped=False
property Caption: String; Содержит связанный с кнопкой текст, который будет показан, если свойство ShowCaptions компонента TTooiBar имеет значение True
property Down: Boolean; Определяет состояние кнопки: если содержит True, кнопка утоплена
property DropdownMenu.gif" >


задания перекрестных ссылок



Рисунок 21.1. Пример задания перекрестных ссылок


Для задания скрытого текста в редакторе Word необходимо выделить текст и применить к нему команду Hidden. Для этого можно воспользоваться опцией Формат | Шрифт и в разделе Эффекты щелкнуть по опции скрытый.

Примечание
Примечание

Поскольку эту последовательность действий; при написании текста, справочной службы придется выполнять очень часто, полезно предварительно настроить Word: выберите Сервис | Настройка, на панели.

Команды в окне категории выберите все команды, а в окне Команды - Hidden и “перетащите” мышью (нажав и не отпуская, левую, кнопку) эту команду на инструментальную, панельку. Теперь, чтобы выбрать скрытый текст, достаточно выделить его и щелкнуть по новой кнопке. Для Задания перечеркнутого или дважды подчеркнутого текста нет специальной команды, поэтому автоматизировать соответствующие действия нужно с помощью макроса. Чтобы создать Макрос сначала выделите текст, затем выберите Сервис | Макрос | Начать запись, в окне Запись макроса укажите подходящее имя (например, Зачеркнутый) и щелкните по кнопке ''Панели, затем из окна Настройка перетащите имя макроса на панель инструментов и накройте окно. Теперь указатель мыши будет иметь вид кассеты с лентой, а на экране появится соответствующая панелька управления. Выберите Формат | Шрифт [Зачеркнутый и остановите запись макроса щелчком по левой кнопке панельки управления или с помощью Сервис | Макрос |Остановить запис ь.

Любой вызываемый раздел может отображаться в основном окне справки или в окне пояснений. Это окно появляется поверх основного окна (такие окна иногда называют “всплывающими”) и обычно используется для пояснений (Рисунок 21.2).



ы использования компонента TDateTimePicker



Рисунок 18.26. Примеры использования компонента TDateTimePicker


При показе даты в режиме DateMode=dmComboBox календарь можно не раскрывать и установить дату вручную в верхнем окне. Это удобно, если нужно установить сразу и день, и месяц, и год. На раскрытом календаре изменить месяц можно небольшими кнопками вверхней части компонента. Календарь закрывается после выбора даты или при щелчке по раскрывающей кнопке. Установив в свойство Kind значение dtkTime, можно заставить компонент отображать время (справа на рисунке). Это время в момент установки компонента на форму соответствует системному времени, и в дальнейшем его можно изменить, задав новое значение в свойство Time.

Свойства компонента:



TDTCalAlignment = (dtaLeft, dtaRight) ; Определяет положение раскрывающегося календаря: dtaLeft - слева от компонента;
property CalAlignment: TDTCalAlignment; dtaRight - справа от компонента. Учитывается только ДЛЯ Kind = dtkDate и Date-Mode = dmComboBox
property CalColors: TDateTimeColors; С календарем связан объект класса

TDateTimeColors, свойства которого определяют цвета календаря

property Checked: Boolean; Если Checked=True И ShowCheckBox=True,

независимый переключатель рядом с датой

(временем) будет иметь состояние Выбрано

property Date: TDate;TDTDateFor.gif" >


Примеры комбинированных списков



Рисунок 18.7. Примеры комбинированных списков


Свойство DropDownCount определяет количество элементов списка, появление которых еще не приводит к необходимости прокрутки списка. По умолчанию это свойство имеет значение 8: если в списке указано 9 и более элементов (т. е. больше, чем содержит DropDownCount), при его раскрытии к окну будет добавлена полоса прокрутки. Свойство DroppedDown определяет, раскрыт ли в данный момент список. Это свойство доступно также для записи, что позволяет программно управлять состоянием списка. Событие OnDropDown происходит при изменении состояния списка.

Наполнение списка ведется методами Add, Append, Insert и т. п. его свойства Items класса TStrings (см. п. 16.3.1). По поводу использования свойства items и программной прорисовки элементов списка см. замечания в п. 18.1.10.



Различные формы компонента TGauge



Рисунок 18.45. Различные формы компонента TGauge


Свойства компонента:

property Back.gif" >
Содержание
Вперед




Размещение компонента Label



Рисунок 3.1. Размещение компонента Label


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

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

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

Замечу, что все видимые компоненты[ В Delphi могут использоваться как видимые, так и невидимые компоненты. Невидимые компоненты не имеют визуального отображения на этапе прогона программы. ] имеют свойства Left (Слева), тор (Сверху), width (Ширина) и Height (Высота), числовые значения которых определяют положение левого верхнего угла компонента и его размеры в так называемых пикселях, т. е. в минимальных по размеру точках экрана, светимостью которых может управлять программа. При буксировании компонента или изменении его размеров мышью эти значения автоматически меняются и наоборот - изменение этих свойств в окне Инспектора объектов приводит к соответствующему изменению положения и размеров компонента. В Delphi 4, 5 и 6 значения Left и тор автоматически появляются в небольшом окне рядом с указателем мыши при буксировке компонента по форме.



Размещение компонентой на TScrollBox



Рисунок 18.13. Размещение компонентой на TScrollBox




Разновидности кнопок TBitBtn



Рисунок 18.9. Разновидности кнопок TBitBtn


Нажатие любой из них, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mrxxx: bkok - mrОk, bkCancel - mrCancel И Т. Д. Кнопка bkClose для модального окна возвращает mrCancel, а для главного окна программы - закрывает его и завершает работу программы. Кнопка bkHelp автоматически вызывает раздел справочной службы, связанный с Heipcontext формы, на которую она помещена. Если у кнопки была изменена пиктограмма Glyph, Delphi автоматически присвоит ей Kind=bkCustom. Это произойдет также в случае, когда кнопка указана как умалчиваемая (Defauit=True), но Kind не содержит bkok или bkYes, а также если ее свойство Cancel содержит True, a Kind нe содержит bkCancel или bkNo.

Свойства Cancel, Default И ModalResult кнопка TBitBtn унасле-довала у своего родительского класса TButton, остальные специфичные свойства указаны ниже:

property Glyph: TBitmap;

TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bklg-nore, bkAll) ; property Kind: TBitBtnKind;

Определяет от 1 до 4 связанных с кнопкой растровых изображения (см. ниже) Определяет разновидность кнопки (Рисунок 18.9)
TButtonLayout = (bIGlyphLeft, bIGlyphRight, bIGlyphTop, bIGlyphBottom) ; property Layout: TButtonLayout; Определяет край кнопки, к которому прижимается пиктограмма: bIGlyphLeft - к левому; bIGlyphRight - к правому; bIGlyphTop - к верхнему;biGlyphBottom - к нижнему)
property Margin: Integer; Определяет расстояние в пикселях от края кнопки до пиктограммы
TNumGlyphs: 1..4 ; property NumGlyphs: TNumGlyphs; Определяет количество растровых изображений (см.ниже)
property Spacing: Integer; Определяет расстояние в пикселях от пиктограммы до надписи на кнопке
TByttonStyle = (bsAutoDetect, bsWinSI, bsNew) ;

property Style: TButtonStyle;

Определяет стиль оформления кнопки, зависящий от операционной системы. Стиль bsNew соответствует 32-разрядным версиям Windows. Стиль bsAutoDetect изменяет оформление кнопки в зависимости от ОС, под управлением которой работает программа в данный момент

Примечание
Примечание

При разработке собственных растровых изображений для использования в кнопках следует учесть, что изображения должны меняться? при изменении состояния кнопки. Таких состояний может быть четыре: нормальное, запрещенное, нажатое и утопленное (последнее используется только в кнопках TSpeedButton). В соответствии с этим! разрабатывается до 4 пиктограмм, расположенных по горизонтали ввиде одного длинного растра. Например, стандартный размер пиктограммы для размещения на кнопке равен 16х16 пикселей. Если создаются 3 пиктограммы, размер растра должен составлять 48х16. Количество пиктограмм в растре задается свойством NumGlyphs. Если каждая; пиктограмма - квадратная и длина растра делится без остатка; на его высоту, Delphi автоматически распознает количество пиктограмм. Если задана только одна пиктограмма, ее изображение, меняется автоматически: в состоянии “нажатая” пиктограмма смещается! на один пиксель вправо и, вниз, а в состоянии “запрещенная” все цвета, кроме черного, меняются на светло-серый, а черный на белый, что обеспечивает эффект "вдавленности" изображения. Следует так же учесть, что самый левый нижний пиксель растра определяет цвет прозрачности: на кнопке этот цвет будет заменяться цветом поверхности кнопки.

Как и в кнопках TButton, программист не может управлять цветом поверхности кнопки, но в отличие от TButton может менять цвет надписи на ней. С помощью свойства Default кнопку можно сделать умалчиваемой - в этом случае нажатие Enter автоматически вызывает обработчик ее события OnClick. Однако умалчиваемыми можно сделать только кнопки bkYes и bkNo, остальные значения свойства Kind будут заменяться на bkcustom при размещении в Default значения True и наоборот - в Default автоматически помещается False при установке в Kind любого значения, кроме bkYes, bkNo или bkcus-tom.



Разветвленная структура меню



Рисунок 18.4. Разветвленная структура меню

В Delphi 4 (5 и 6) появилась возможность связывать с опциями меню небольшие изображения. Эти изображения можно задать либо свойством BitMap, либо свойством imageindex. В последнем случае предполагается, что для меню в целом определено свойство Images либо (только для версии 6) свойство SubMenu.gif" >



Редактор компонента



Рисунок 18.28. Редактор компонента


Чтобы начать наполнение, щелкните по кнопке New item и введите связанный с узлом текст в поле Text. С помощью image index панели item properties устанавливается индекс связанной с узлом пиктограммы, с помощью selected index - индекс пиктограммы для выбранного узла. Для ввода подузла любого уровня сначала нужно щелкнуть в окошке Items по узлу, который должен стать родительским, и лишь затем - на кнопке New subitem.

Для ввода списка в режиме прогона программы широко используется центральное свойство компонента - items типа TTreeNodes, открывающее индексированный доступ ко всем узлам списка. Каждый узел описывается классом TTreeNode, имеющим свои собственные методы и свойства. В частности, его свойство item содержит список всех подузлов данного узла; с помощью многочисленных методов свойства TTreeview. items к этому списку можно добавить новый подузел, а с помощью метода TTreeNode. MoveTo - переместить узел в любую позицию дерева иерархии.

Следующий обработчик события oncreate формы создал Рисунок 18.29:

procedure TFor.gif" >

Puc. 18.29. Создание подузлов на этапе прогона программы

Свойства компонента TTreeview:

lean;TBorderStyle =

bsNone..bsSingle;

property BorderStyle: TBorderStyle;

Определяет стиль рамки, охватывающей компонент: bsNone - нет рамки; bsSingle - рамка толщиной в 1 пиксель
property ChangeDelay: Integer; Указывает задержку (в миллисекундах) перед раскрытием узла
property DropTarget: TTreeNode; Указывает узел, который может служить приемником операций Drag&Drop
property HideSelection:Boolean; Указывает, будет ли убираться выделение узлов, когда компонент теряет фокус ввода
property Images: TImageList; Содержит набор изображений, которые будут использоваться при прорисовке узлов
property Indent: Integer; Определяет отступ в пикселях от левого угла узла для всех его подузлов
property Items: TTreeNodes; Открывает доступ к любому узлу по его индексу.

Индексация начинается с нуля и соответствует просмотру всех узлов полностью раскрытого списка

property MultiSelect: Boo

lean;

Разрешает/запрещает одновременный выбор несколь ких узлов
type TMultiSelectStyles =

(msControlSel-ect, msShift

Select, msVisibleOnly,

msSiblingOnly) ;

TMultiSelectStyle = set

of TMultiSelectStyles;

property MultiSelectStyle:

TMultiSelect-Style default

[msControlSelect];

Определяет способ выбора нескольких узлов: msControiselect - с нажатой и удерживаемой клавишей Ctrl для выбора узлов в произвольном порядке;

msShiftSelect - с нажатой и удерживаемой клавишей Shift для выбора сплошного диапазона;

msVisibleOnly - подобно msShiftSelect, но в диапазон не включаются дочерние нераскрытые узлы; msSiblingOnly - подобно msShiftSelect, но в диапазон включаются только узлы одного уровня

property Readonly: Boolean; Запрещает/разрешает редактирование надписей в узлах
property RightClickSelect:

Boolean;

Разрешает выбор узлов правой кнопкой мыши
property Selected:

TTreeNode;

Содержит список всех выбранных узлов или nil, если таких нет
property SelectionCount:

Cardinal;

Содержит количество выбранных узлов
property Selections[Index:

Integer]: TTreeNode;

Обеспечивает индексированный доступ к выбранным узлам
property RowSelect: Boolean; Разрешает цветовыделение линий выбранных узлов. Игнорируется, если showLinesFalse
property ShowButfcons: Boolean; Разрешает/запрещает показ стандартных кнопок раскрытия подузлов. По умолчанию содержит True. Если False, узел раскрывается двойным щелчком мыши
property ShowLines: Boolean; Разрешает/запрещает показ линий
property ShowRoot: Boolean; Разрешает/запрещает показ линий, идущих от самого верхнего уровня иерархии. Игнорируется, если ShowLines=False
TSortType = (stNone,

stData, stText, stBoth) ;

property SortType: TSort

Type;

Указывает способ сортировки узлов: stNone - нет сортировки; stData - сортировка по данным; stText - сортировка по тексту надписей; stBoth - сортировка по тексту и по данным. См. также событие OnCompare
property Topitern: , TTreeNode; Определяет корневой узел
Методы компонента:
function AlphaSort: Boolean; TTVCompare = function (IParamI, lParam2, IParamSort: Longint) Integer stdcall; tfunction CustomSort(SortProc: TTVCompare; Data: Longint): Boolean; Сортирует узлы по тексту и возвращает

True, если сортировка прошла успешно Определяет нестандартную сортировку с помощью функции SortProc. Эта функция должна рассматривать IParamI и lParam2 как объекты TTreeNode и возвращает отрицательное число, если lParaml<lParam2; ноль, если IParamel^lParamS; положительное число, если lParaml>lParam2

procedure FullCollapse; Прячет все узлы, кроме узлов самого верх

него уровня иерархии

Procedure FullExpand; Показывает все узлы дерева иерархии
function GetNodeAt(X, Y: Integer) : TTreeNode; Возвращает узел, располагающийся в указанной точке, или nil, если точка не принадлежит ни одному узлу
function IsEditing: Boolea' Возвращает True, если пользователь редактирует какой-либо узел
procedure LoadPromFile(const

FileName: String);

Загружает дерево иерархии из файла
procedure SaveToFile(const File

Name: String) ;

Сохраняет в файле дерево иерархии
procedure SaveToStream(Stream: TStream) ; Сохраняет в потоке данных дерево иерархии

события: С компонентом связаны такие

TTVChangedEvent = procedure(Sender: TObject; Node: TTreeNode) of object; property OnChange: TTVChangedE vent; Возникает при смене состояния выбора у

одного из узлов. Node - узел, который изменил состояние

TTVChangingEvent = procedure(

Sender: TObject; Node: TTreeNode;

var AllowChange: Boolean) of objectproperty OnChangir.g: TTVChang ingEvent;

Возникает перед сменой состояния выбора

у одного из узлов. Node - узел, который

будет выбран. Обработчик в параметре

AllowChange разрешает или запрещает

выбор узла

TTVExpandedEvent = procedure(

Sender: TObject; Node: TTreeNode) of object;property OnCollapsed: TTVExpand edEvent;

Возникает при закрытии списка подузлов узла Node
TTVCollapsingEvent = procedure(

Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean) of object; property OnCollapsing: TTVCollapsingEvent;

Возникает перед закрытием списка подуз лов узла Node. В параметре AllowCollapse обработчик разрешает или запрещает закрыть список
TTVCompareEvent = procedure(

Sender: TObject; Nodel, Node2:

TTreeNode; Data: Integer; var

Compare: Integer) of object; property OnCompare: TTVCom

pareEvent;

Возникает при сравнении двух узлов

Nodel И Node2. В параметре Compare

обработчик должен вернуть отрицательное число, если Nodel<Node2; ноль, если Model=Node2; положительное число, если

Nodel>Node2

TTVExpandedEvent = procedure(

Sender: TObject; Node: TTreeNode)

of object; property OnDeletion: TTVExpand

edEvent;

Возникает при удалении узла Node из дерева иерархии
TTVEditedEvent = procedure(Sender: TObject; Node:

TTreeNode; var S: String) of object;

property OnEdited: TTVEditedEvent;

Возникает при завершении редактирования надписи в узле Node: S - новая надпись
TTVExpandedEvent = procedure(

Sender: TObject; Node: TreeNode)

of object; property OnExpanded: TTVExpand edEvent;

Возникает при распахивании списка подузлов узла Node
TTVExpandingEvent = procedure(

Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean) of

object; property OnExpanding: TTVExpand ingEvent;

Возникает перед открытием списка подузлов узла Node. В параметре AllowExpansion обработчик разрешает или запрещает

открыть список

TTVExpandedEvent = procedure(

Sender: TObject; Node: TreeNode)

of object;property OnGetImageIndex: TTVEx

pandedEvent;

Возникает при необходимости получения

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

Node в обычном состоянии

TVExpandedEvent == procedure(

Sender: TObject; Node: TTreeNode)

of object;

property OnGetSelectedIndex:

TTVExpandedEvent;

Возникает при необходимости получения

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

Node в выбранном состоянии

При программном заполнении списка следует пользоваться свойством TTreeView. Items класса TTreeNodes.

Свойства класса TTreeNodes:

property Count: Integer; property Item[Index: Integer]: TTreeNode; default-property Owner: TCustomTreeView; Количество узлов, входящих в items Открывает индексированный доступ к узлам Содержит ссылку на родительский список
Методы класса TTreeNodes:
function Add(Node: TTreeNode; const S: String): TTreeNode;

function AddChild(Node: TTreeNode; const S: String): TTreeNode; function AddChildFirst(Node: TTreeNode; const S: String): TTreeNode; function AddChildObject(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode;

function AddChildObjectFirst( Node: TTreeNode; const S: String;

Ptr: Pointer): TTreeNode;

Добавляет узел в конец того списка, в котором зарегистрирован узел Node. Если Node=NlL, добавляется корневой узел для всего компонента Добавляет узел в конец списка item дочерних узлов узла Node

Добавляет узел в начало списка Item дочерних узлов узла Node

Добавляет узел и данные в конец списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка Добавляет узел и данные в начало списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка

function AddFirst(Node:

TTreeNode; const S: String):

TTreeNode;

Добавляет узел в начало того списка, в котором зарегистрирован узел Node
function AddObject(Node:

TTreeNode; const S: String; Ptr:

Pointer): TTreeNode;

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

Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка

function AddObjectFirst(Node:

TTreeNode; const S: String; Ptr:

Pointer): TTreeNode;

Добавляет узел и данные в начало того же списка, в котором зарегистрирован узел Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
procedure Assign(Source: TPersistent) ; Связывает список текущего компонента со списком компонента Source
procedure BeginUpdate; Блокирует обновление экрана до тех пор, пока не будет выполнен метод EndUpdate.

Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана

procedure Clear; Очищает список всех узлов и подузлов компонента
procedure Delete(Node:

TTreeNode);

Уничтожает узел Nods
procedure EndUpdate; Отменяет действие метода BeginUdate
function GetFirstNode: TTreeNode; Возвращает самый первый узел в списке Items[0]
function GetNode(Itemid:

HTreeItem): TTreeNode;

Возвращает узел по его идентификатору Itemid
function Insert(Node: TTreeNode;

const S: String): TTreeNode;

Вставляет узел непосредственно перед узлом Node
function InsertObj ect(Node:

TTreeNode; const S: String; Ptr:

Pointer): TTreeNode;

Вставляет узел и данные непосредственно

перед узлом Node

Как уже отмечалось, каждый узел класса TTreeNode имеет свой набор методов, свойств и событий.

Свойства TTreeNode:

property Absolutelndex: Integer; Возвращает абсолютный индекс узла (с учетом всех подузлов)
property Count: Integer; Содержит количество подузлов в списке Item
property Cut: Boolean; Вырезает узел и помещает его в clipboard
property Data: Pointer; Указывает на связанные с узлом данные
property Deleting: Boolean; Содержит True, если для узла вызван De-story
property DropTarget: Boolean; Содержит True, если узел может служить приемником операции Drag&Drop
property Expanded: Boolean; Содержит True, если узел распахнут
property Focused: Boolean; Содержит True, если узел сфокусирован
property HasChildren: Boolean; Содержит True, если узел имеет дочерние узлы
property Imagelndex: TImageIndex; Содержит индекс связанной с узлом пиктограммы
property Index: Longint; Содержит индекс узла в списке дочерних узлов его родительского узла
property IsVisible: Boolean; Содержит True, если узел виден
property Item[Index: Integer]:

TTreeNode;

Открывает индексированный доступ ко всем дочерним узлам
property Itemid: HTreeItem; Содержит уникальный Windows-дескриптор узла
property Level: Integer; Содержит иерархический уровень узла
property Overlaylndex: Integers- Содержит индекс оверлейной пиктограммы.

Оверлейная пиктограмма вычерчивается

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

property Owner: TTreeNodes; Содержит ссылку на владельца данного узла
property Parent: TTreeNode; Содержит ссылку на родительский узел
property Selected: Boolean; Содержит True, если узел выделен цветом
property Selectedlndex: Integer; Содержит номер пиктограммы для выделенного узла
property Text: Strings- Содержит текст узла
property TreeView: TCustomTree-

View;

Содержит ссылку на компонент TreeView, к которому принадлежит узел

Методы класса TTreeNode:

function AlphaSort: Boolean; Сортирует узлы по алфавиту свойств Text и возвращает True в случае успеха
procedure Assign(Source: TPersis tent); override; Связывает список подузлов с источником Source
procedure Collapse(Recurse: Boolean) ; Закрывает все узлы (Recource=True) или только распахнутые(Resource=False)
type TTVCompare = function(

IParamI, lParam2, IParamSort:

Longint): Integer stdcall; func

tion CustomSort(SortProc: TTVCom

pare; Data: Longint): Boolean;

Реализует нестандартную сортировку узлов
procedure Delete; Удаляет текущий узел
procedure DeleteChildren; Удаляет дочерние узлы
function DisplayRect(TextOnly:

Boolean): TRect;

Возвращает очерчивающий прямоугольник узла. Если TextOnly=True - возвращает

очерчивающий прямоугольник текста

function EditText: Boolean; Переводит текст узла в режим редактирования
procedure EndEdit(Cancel Boo

lean) ;

Заканчивает редактирование текста и со храняет его изменения, если Cancel=False
procedure Expand(Recurse: Boo

lean) ;

Открывает узел (и его подузлы, если Recurce=True)
function GetFirstChild: TTreeNode; Возвращает ссылку на первый подузел или nil, если нет подузлов
function GetLastChild: TTreeNode; Возвращает ссылку на последний подузел или nil, если нет подузлов
function GetNext: TTreeNode;

function GetNextChild(Value:

TTreeNode): TTreeNode;

Возвращает ссылку на очередной подузел dозвращает ссылку на подузел после value

(или nil, если такового нет).

function GetNextSibling:

TTreeNode;

Возвращает ссылку на очередной узел в том же списке.
function GetNextVisible:

TTreeNode;

Возвращает ссылку на очередной видимый узел (для которого раскрыты все дочерние

узлы)

function GetPrev: TTreeNode; Возвращает ссылку на предыдущий узел в том же списке независимо от его видимости
function GetPrevChild(Value:

TTreeNode): TTreeNode;

Возвращает ссылку на предыдущий по отношению к value дочерний узел
function GetPrevSibling:

TTreeNode;

Возвращает ссылку на предыдущий узел того же уровня
function GetPrevVisible:

TTreeNode;

Возвращает ссылку на видимый узел того же уровня
function HasAsParent(Value:

TTreeNode): Boolean;

Возвращает True, если value - родительский узел
function IndexOf(Value:

TTreeNode): Integer;

Возвращает идентификатор узла value
procedure MakeVisible; Если родительский узел видимый, делает видимыми все дочерние узлы
type TNodeAttachMode = (naAdd,

naAddFirst, naAddChild,

naAddChildFirst, nalnsert) ;

procedure MoveTo(Destination:

TTreeNode; Mode: TNodeAttach

Mode) ;

Перемещает текущий узел в позицию относительно Destination в зависимости от параметра Mode: naAdd - добавляет в конец списка узла того же уровня; naAddFirst -

делает первым в списке узлов того же уровня; naAddchild - добавляет в конец списка

дочерних узлов; naAddChildFirst -делает

первым в списке дочерних узлов; nalnsert

- вставляет непосредственно перед узлом



Редактор компонента TActionList



Рисунок 18.8. Редактор компонента TActionList


События TAction:

property OnExecute: TNotifyEvent; Возникает при щелчке мышью на одном из компонентов, связанных общим действием. Обработчик этого события должен реализовать нужное действие
THintEvent = procedure (var HintStr: String; var CanShow: Boolean) of object; property OnHint: THintEvent; Возникает при перемещении указателя мыши над одним из связанных общим действием компонентов. Его умалчиваемый обработчик создает окно оперативной подсказки и показывает в нем строку HintStr
property OnUpdate: TNotifyEvent; Возникает, когда очередь сообщений для приложения пуста или когда обновляется содержимое списка действий

Примечание
Примечание

В версии Delph6 введена группа компонентов (См. ниже пп. 18.2.23), обеспечивающая более мощную Поддержку механизма действий, в том числе создание настраиваемого пользовательского интерфейса, Таким образом, компонент TActionList используется лйщБ;яД&Рвместимо(дхс более разними версиями,, . .



Редактор компонента TActionManager



Рисунок 18.20. Редактор компонента TActionManager

Щелкните по окну правой кнопкой и выберите New Standard Action или просто нажмите Ctrl+Ins - на экране появится дополнительное окно с перечнем всех определенных в Delphi стандартных классов действий (Рисунок 18.21). С помощью полосы скроллирования сместите список вверх и выберите в нем все классы, связанные с категорией File (для выбора нескольких классов одновременно щелкайте по каждому, удерживая нажатой клавишу Ctrl). “Схватите” мышью категорию File и перетащите ее на полосу TActionMainMenu.gif" >



Окно репозитория Delphi



Рисунок П 1.1. Окно репозитория Delphi

Разработайте форму, которую вы часто будете использовать в разных проектах[ Если вы хотите тиражировать какую-то форму текущего проекта, ее нет нужды размещать в репозитории - она там уже есть на закладке с именем вашего проекта (такая закладка репозитория автоматически создается для каждого открываемого проекта). ]. Поместите на ней все необходимые интерфейсные компоненты и, если это необходимо, закодируйте обработчики их событий. Сохраните форму в любой папке жесткого диска. Для упорядочения поиска прототипов можно использовать для этих целей папку Objrepos каталога размещения Delphi. Щелкните по форме правой кнопкой мыши и в локальном меню выберите Add to Repository. На экране появится диалоговое окно регистрации формы в репозитории (Рисунок П1.2). В строке Title напишите имя, под которым форма будет зарегистрирована в репозитории, например, WorkFor.gif" >



Окно масштабирования компонентов



Рисунок П 1.5. Окно масштабирования компонентов




Окно менеджера проекта



Рисунок П.1.6. Окно менеджера проекта

П1.1.4.2. Менеджер трансляции

Менеджер трансляций упрощает создание локализованных версий программных продуктов. Он становится доступным только после указания языков, на которые будут переводится текстовые сообщения, надписи, опции и другие текстовые ресурсы программы. Для каждого языка создается своя динамически подключаемая библиотека ресурсов. Изменение этой библиотеки перед компиляцией программы изменяет ее язык (см. выше “Менеджер проекта”).

Для выбора языка (языков) локализации используется опция меню Project [Language (см. с. 619). Главным языком программы по умолчанию считается язык локализации Windows, так что если Delphi работает под управлением русскоязычной Windows, главным языком будет русский.

Окно менеджера трансляций показано на Рисунок П1.7. Для представленного на нем примера главным языком программы является русский, а языком локализации - английский (Великобритания). Переводится надпись Введите пароль (Enter password).



Пример списка ТОDO



Рисунок П 1.8. Пример списка ТО-DO


В списке можно указать приоритет сообщения (колонка “! ”), его собственника (Owner) и категорию.

Эти параметры можно задать с помощью соответствующих ключей непосредственно в комментарии (см. Рисунок П1.8) или после вызова редактора сообщения в списке (он вызывается после активизации сообщения и нажатия клавиши F2).

П1.1.4.4. Браузер объектов

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



Окно выбора языков локализации



Рисунок П 1.9. Окно выбора языков локализации

В нем указывается один или несколько проектов, для которых осуществляется локализация, и главный язык проекта (код $419 соответствует русскому языку). В следующем окне (после щелчка по кнопке Next) вы сможете выбрать языки локализации, отметив их флажками. На следующем шаге эксперт предложит вам указать каталоги размещения библиотек, которые будут содержать локализованные ресурсы. Все библиотеки имеют одинаковое название хххх. drc (хххх - имя проекта), поэтому они должны размещаться в разных каталогах. Для компиляции программы с тем или иным языком локализации используются менеджер проекта и опция Project | Language I Set Active.

П1.1.4.2. Управление опциями проекта

Управление опциями проекта осуществляется с помощью диалогового окна, вызываемого опцией Project | Options.

На странице For.gif" >



Окно настройки параметров среды



Рисунок П 1.11. Окно настройки параметров среды


Закладка Preferences открывает доступ к параметрам среды Delphi: Editor files - перед прогоном автоматически сохраняются все измененные файлы; Project Desktop - перед прогоном автоматически сохраняется информация о состоянии экрана; Desktop Only - при выходе из программы сохраняется информация о состоянии экрана, Desktop and Symbols - при выходе из программы сохраняется информация о состоянии экрана и символах программы на момент последней удачной компиляции; Auto drag docking - разрешает причаливать одно инструментальное окно к другому; Show compiler progress - показывать окно отображения процесса компиляции; Warn on package rebuild - предупреждать о перекомпиляции пакетов; Minimize On Run - минимизировать окна Delphi в момент старта программы; Hide Designers On Run - прятать вспомогательные окна (окно Инспектора объектов и окна форм) в момент старта программы; Directory -содержит путь к окну расположения файла репозитория DELPHI32.DRO; если путь не указан, используется каталог bin каталога размещения Delphi.

Закладка Designer содержит настройки для процесса конструирования форм:

Display Grid - показывать сетку на пустой форме; Snap to Grid - привязывать расположение компонентов к узлам сетки; Show component captions - показывать имена компонентов на этапе конструирования программы; show designer hints - показывать оперативную подсказку об именах компонентов и их типах на этапе конструирования; show extended control hints - показывать ярлычки оперативной подсказки с расширенной информацией; New For.gif" >




Окна справочной службы



Рисунок П 1.12. Окна справочной службы


П1.1.9.1. Служба OpenHelp

Служба OpenHelp предназначена для модификации справочной службы Delphi: с ее помощью можно удалять ненужные разделы и, что наиболее важно, вставлять новые. Последнее связано с тем, что существует множество относительно небольших фирм, занимающихся разработкой и продажей пакетов компонентов для Delphi и C++ Builder (пакеты компонентов для этих двух инструментов идентичны), а также компонентов ActiveX. Сама Delphi имеет развитые средства создания новых компонентов (см. главы части 8). Поставщики компонентов обычно поставляют вместе с ними нужные файлы справочной помощи, которые OpenHelp может сделать частью справочной службы Delphi.

Служба OpenHelp вызывается опциями Help | Customize главного меню. Ее окно показано на Рисунок П 1.13.

Четыре закладки этого окна управляют содержанием справочной службы (закладка Content), набором файлов помощи (index), контекстно-чувствительной помощью (Link) и проектами (Project). Чтобы удалить раздел содержания, файл справки или проект, нужно на соответствующей закладке щелкнуть по удаляемому компоненту и выбрать в меню Edit | Remove Files или щелкнуть по инструментальной кнопке.

Для добавления к содержанию нового раздела требуется предварительно создать два специальных файла: файл с таблицей содержания (с расширением .toe) и файл содержания (.cnt). toe-файл, как следует из документации, есть стандартный файл содержания cnt, создаваемый утилитой hcw.exe (детальное описание процесса создания справочных файлов и файлов содержания вы найдете в гл. 21), за тем отличием, что в нем нельзя использовать секции include. Файл cnt, в свою очередь, отличается от стандартного тем, что в нем должны быть только две директивы: base и title, причем содержимое title у обоих файлов должно быть одинаковым и они должны располагаться в одной папке. После создания файлов вызывается OpenHelp, и на закладке Content щелкается кнопка или вызывается опция Edit |Add Files. В появляющемся вслед за этим диалоговом окне нужно указать положение файла toe.



Окно связывания точки псптнови с действием



Рисунок П.1.19. Окно связывания точки псптнови с действием




П1 2 Окно регистрации формы в репозитории



Рисунок П1.2 . Окно регистрации формы в репозитории

Вновь размещенную форму можно сделать главной. Такая форма создается при старте нового проекта (опция главного меню File | New Application). Для определения главной формы выберите опцию Tools [Repository, укажите страницу размещения в левом списке Радез диалогового окна и форму в правом списке Objects, после чего установите флажок в переключателе Main For.gif" >

Вперед





П1 3 Окно выравнивания компонентов



Рисунок П1.3 . Окно выравнивания компонентов

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

Left sides - компоненты выравниваются по левой границе; Centers - компоненты центрируются относительно границ эталона; Right sides -компоненты выравниваются по правой границе эталона; Space equally - между всеми компонентами устанавливается равное расстояние по горизонтали или вертикали; Center in window -все компоненты центрируются относительно границ окна; Tops - компоненты выравниваются по верхнему краю; Bottoms - компоненты выравниваются по нижнему краю.

Группа переключателей width регулирует ширину выделенных компонентов, а группа Height - их высоту:

Shrink to smallest -уменьшает размеры компонентов до размеров наименьшего из-них; Grow to largest- увеличивает размеры компонентов до размеров наибольшего из них; Width - указывает ширину компонентов; Height - указывает высоту компонентов.

П1 4 Окно изменения размеров компонентов



Рисунок П1.4. Окно изменения размеров компонентов


С помощью окна Scaling factor вводится коэффициент масштабирования в процентах от текущих размеров.