- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Указатели
Указатель является величиной, указывающей на некоторый адрес в памяти, где хранятся какие-то данные. Указатели бывают типизированные, указывающие на данные определенного типа, и нетипизированные (типа pointer), которые могут указывать на данные произвольного типа. Чаще всего указатели используются для работы с объектами в динамически распределяемой области памяти, особенно при работе с записями.
В Object Pascal имеется ряд предопределенных типов указателей. Это прежде всего типы указателей на строки: РAnsiChar и PWideChar, представляющие собой соответственно указатели на значения AnsiChar и WideChar. Имеется также родовой тип PChar, определяющий указатель на Char (т.е. пока указывающий на AnsiChar). Эти указатели используются при работе со строками с нулевым символом в конце.
Тип указателя
|
Тип переменной, на которую указывает указатель
|
PAnsiString, PString
|
AnsiString
|
PByte Array
|
ByteArray (объявлен в модуле SysUtils). Используется для доступа к динамически размещаемым массивам
|
PCurrency
|
Currency
|
PExtended
|
Extended
|
POleVariant
|
OleVariant
|
PShortString
|
ShortString
|
PTextBuf
|
TextBuf (объявлен в модуле SysUtils). Внутренний тип буфера в запей файлов TTextRec
|
PVarRec
|
TVarRec (объявлен в модуле System)
|
PVariant
|
Variant
|
PWideString
|
WideString
|
PWordArray
|
TWordArray (объявлен в модуле SysUtils). Используется для доступа к динамически размещаемым массивам 2-байтных величин
|
Объявление своего типизированного указателя на любой тип имеет вид:
type <имя типа указателя> = ^<тип данных>;
Например, предложения:
type Pint = ^integer;
var PI, P2: Pint;
объявляют тип Pint указателя на величину типа integer и две переменные Р1 и Р2, являющиеся указателями на значения типа integer. Однако, надо понимать, что объявление переменных Р1 и Р2 не создает самих величин, на которые они указывают. Выделяется только память под хранение указателей, но сами эти указатели ни на что не указывают. Имеется предопределенная константа nil, которая обычно присваивается указателям, которые в данный момент ни на что не указывают.
Чтобы получить доступ к данным, на которые указывает типизированный указатель, надо применить операцию его разыменования. Она записывается с помощью символа ^, помещаемого после указателя. Например, если переменная Р1 является указателем приведенного выше типа Pint, то выражение Р1^ — это та целая величина, на которую указывает указатель Р1. Если I — переменная целого типа, то после выполнения оператора
Р1^ := I;
Р1 начнет указывать на переменную I и выражение Р1^ будет возвращать значение этой переменной. Того же результата можно добиться операцией адресации. Например, приведенный выше оператор можно заменить эквивалентным ему оператором
Р1 := @1;
Этот оператор присваивает указателю Р1 адрес переменной I.
Таким образом, применение операций разыменования или адресации — один из способов присвоить указателю ссылку на конкретную область памяти. Другой, более распространенный способ — применение процедуры new, которая выделяет память под переменную соответствующего типа и присваивает указателю ссылку на эту область. Например, оператор
new(PI);
выделит память для хранения целого значения и присвоит указателю Р1 ссылку на это значение.
Операция разыменования не применима к указателям типа pointer. Чтобы разыменовать указатель pointer, надо сначала привести его к другому типу указателя. Например, если указатель Р объявлен как указатель типа pointer, то выражение PInt(P) приведет его тип к объявленному выше типу Pint, после чего его можно будет разыменовывать. Таким образом, с помощью операции приведения типа можно записать такие операторы:
Pint(Р):=Р1;
I := Pint(Р)^ + Р2^;
Указатели широко используются в Object Pascal и Delphi, причем часто неявно для пользователя. Например,
для передачи параметров по ссылке в процедуры и функции;
для обработки строк;
для динамического распределения памяти;
для работы с записями.