Ведущий
рассылки - Пугачёв Сергей.
Здравствуйте. В этом выпуске я расскажу о важных элементах объектно - ориентированного программирования.
Пожалуйста, выражайте своё мнение
на w3ser@yandex.ru. И ещё, как Вы относитесь к
тому, чтобы посвятить один выпуск рассылки написанию программ на чистом API?
Также все предыдущие выпуски можно найти по адресу http://w3ser.narod.ru
Оглавление |
Множества и записи.
Множества – это группа элементов, которая ассоциируется с её именем и с которой можно сравнивать другие величины, чтобы определить принадлежат ли они этому множеству. Один и тот же элемент не может входить в множество более одного раза. Множество может быть пустым. Число элементов в множестве не может превышать 256. Формат описания множества
Set of
<тип >;
Значение множества
заключается в квадратные скобки. Логические операции, применяемые над
множествами, имеют несколько отличное от обычного их применения значение.
Операция |
Значение |
Результат |
+ |
Объединение множеств |
Неповторяющиеся элементы первого и второго множеств |
- |
Разность множеств |
Элементы первого множества, не принадлежащие второму |
* |
Пересечение множеств |
Элементы, общие для обоих множеств. |
= |
Эквивалентность |
Возвращает True в случае эквивалентности множеств. |
<= |
Проверка вхождения |
Возвращает Trueб, если первое множество входит в
другое. |
>= |
Проверка включения |
Возвращает True, если первое множество включает второе. |
<> |
Неэквивалентность |
Возвращает True в случае не эквивалентных множеств. |
И ещё, пустое множество
обозначается как []. А сейчас я проиллюстрирую всё
сказанное выше (на примере простого тетриса, который мы начинаем делать здесь):
//Можно объявить новый тип как множество
Type Figure=Set of 1..9; //Тип Figure – это множество значение членов которого могут находиться
в промежутке от одного до девяти.
//А можно объявить новую переменную, как какое-то множество.
Var Day: Set of (Monday,
Tuesday, Wednesday, Friday );
Square:=[]; //Пустое множество
Square:=[1,4,5];
Square:=Square-[1];
Пока это даже ещё не заготовка, но всё ещё впереди…
Записи – это элементы
данных, которые объединяют в себе другие данные разных типов. Отдельные
элементы записи, имеющие имена, называются полями.
Записи бывают двух видов: фиксированные
и вариантные. Формат фиксированной
записи следующий:
Record //Фиксированная
запись состоит из конечного числа полей
<Имя первого поля>: <Тип поля>;
…
<Имя Nого поля>:
<Тип поля>;
end;
Вариантная запись тоже
имеет конечное количество полей, но предоставляет возможность по-разному
обратиться к памяти, занимаемой полями.
Record
Case <признак> : <Тип признака> of
<Вариант №1>: (<Описание
варианта>);
…
<Вариант №N>: (<Описание
варианта >);
end;
Для обращения к полям
записи необходимо указывать имя записи и имя поля, разделённые точкой. Для поля
же допускаются все операции как для переменных соответствующего типа.
Пример использования
записей:
Type TetrisElem= record //Эта запись будет соответствовать фигуре из тетриса
Name: string; //Имя фигуры
Fi: Figure; //Используем объявленное выше множество, оно будет обозначать из каких квадратов состоит фигура
Pos: integer; //Левый верхний угол
End;
А для вариантной записи
это будет выглядеть так:
Type
TetrisElem=record
Case
Integer of
0: (Fi:Figure; Pos:integer);
1: (Name PChar; Fix:Figure);
End;
// Для варианта 0 запись трактуется как состоящая из
поля Fi
и поля Pos,
а для варианта 1, как состоящая из поля Name и поля Fix.
Давайте теперь
обратимся к этим записям. В случае с фиксированной записью:
Var fix:
TetrisElem;
Begin
Fix.Name:=’Hallow World’;
Fix.Pos:=10;
ShowMessage(Fix.Name); //В
разделе uses должен
быть указан модуль Dialogs
End;
C вариантной
записью всё очень похоже. Следующий выпуск будет посвящён обобщению всех
полученных знаний и созданию объектно - ориентированного тетриса.
_____________________________________________________________________________________________________________
Указатель
– это переменная, хранящая адрес, каких либо данных. Указатели бывают зависящие
от типа данных, на которые они ссылаются и не зависящие от него. При объявлении
типированного указателя перед типом, на который ссылается указатель, ставится
знак ^.
Формат описания следующий:
Var
<имя указателя> :^< тип данных>; // Для типированных указателей
Var
<имя указателя> :Pointer; // Для нетипированных указателей
Для определения адреса ссылаемого объекта перед именем этого объекта
ставится знак @. Для получения доступа к к
ссылаемым данным справа от имени указателя
ставится знак ^. Например:
var ti :^integer;
ob:integer;
begin
ob:=100;
ti:=@ob;
ob:=ti^+ob;
end;
О применении указателей будет рассказано в одном из ближайших
номеров.
__________________________________________________________________________________________________________________________
Динамическая информация о типе
Большинству методов при вызове передаётся параметр Sender типа TObject. Для выполнения с ним каких либо действий его надо привести к определённому типу, для которого подразумевается выполнение операций. Для выяснения принадлежности типов используют оператор is, вот его вид:
<Объект> is <Класс>;
Если
Объект принадлежит классу, то выражение имеет значение True, в противном случае False. Оператор as предназначен
для приведения одного типа к другому. Его вид такой же
как и в предыдущем случае, но только вместо is ставится as. Такое преобразование называется неявным. Явное преобразование типа выполняется следующим образом:
<Тип>(<Объект>);
Пример явного
преобразования:
procedure
TForm1.Button1Click(Sender: TObject);
begin
If (Sender is TButton) then
(Sender as TButton).Width:=(Sender
as TButton).Width+10;
end;
// Здесь при нажатии на кнопку, её длинна
увеличивается на 10. Это удобно использовать создавая
один обработчик для нескольких объектов
// Таким обработчиком может быть функция с параметром Sender:TObject
Пример неявного преобразования:
TButton(Sender).Width:=TButton(Sender).Width+10;
Здесь тип компонента приводится к типу TButton.
_____________________________________________________________________________________________________________
FAQ по Delphi
Узнать время работы Windows |
Функция GetTickCount возвращает
количество тысячных секунд с начала текущего сеанса Windows.
Эта программа показывает, сколько времени уже длится сеанс работы в Windows.
procedure TForm1.Timer1Timer(Sender: TObject);
var
t: integer;
begin
t := GetTickCount;
Form1.Caption := 'Windows работает уже ' +
IntToStr(t div 60000) + ' мин ' +
IntToStr((t mod 60000) div 1000) + ' сек ' +
IntToStr(t mod 1000) + ' мсек';
end;
_____________________________________________________________________________________________________________