Выпуск №3

Ведущий рассылки - Пугачёв Сергей.

Здравствуйте. В этом выпуске я расскажу о  важных  элементах объектно -  ориентированного программирования.

Пожалуйста, выражайте своё мнение на w3ser@yandex.ru. И ещё, как Вы относитесь к тому, чтобы посвятить один выпуск рассылки написанию программ на чистом API? Также все предыдущие выпуски можно найти по адресу http://w3ser.narod.ru

 

Оглавление

ü      Множества и записи.

ü      Указатели.

ü      Динамическая информация о типе.

 FAQ по Delphi.

 

Множества и записи.

     Множества – это группа элементов, которая ассоциируется с её именем и с которой можно сравнивать другие величины, чтобы определить принадлежат ли они этому множеству. Один и тот же элемент не может входить в множество более одного раза. Множество может быть пустым. Число элементов в множестве не может превышать 256. Формат описания множества

Set of <тип >;

Значение множества заключается в квадратные скобки. Логические операции, применяемые над множествами, имеют несколько отличное от обычного их применения  значение.

           

Операция

Значение

Результат

+

Объединение множеств

Неповторяющиеся элементы первого и второго множеств

-

Разность множеств

Элементы первого множества, не принадлежащие второму

*

Пересечение множеств

Элементы, общие для обоих множеств.

=

Эквивалентность

Возвращает True в случае эквивалентности множеств.

<=

Проверка вхождения

Возвращает Trueб, если первое множество входит в другое.

>=

Проверка включения

Возвращает True, если первое множество включает второе.

<>

Неэквивалентность

Возвращает True в случае не эквивалентных множеств.

И ещё, пустое множество обозначается как []. А сейчас я проиллюстрирую всё сказанное выше (на примере простого тетриса, который мы начинаем делать здесь):

//Можно объявить новый тип как множество

Type Figure=Set of  1..9; //Тип Figure – это множество значение членов которого могут находиться в промежутке от одного до девяти.

//А можно объявить новую переменную, как какое-то множество.

Var  Day: Set of (Monday, Tuesday, Wednesday, Friday );

Var Square: Figure;

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;

_____________________________________________________________________________________________________________

 

 

 

 

Hosted by uCoz