Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ракитин Р.Ю. ООП в Turbo Delphi

.PDF
Скачиваний:
55
Добавлен:
18.03.2015
Размер:
3.59 Mб
Скачать

151

//цвет шрифта – «белый»

Font.Color:=clWhite;

{координаты вывода текста, рассчитанные относительно центра клиентской области} x:=(ClientWidth - TextWidth('Delphi')) div 2; y:=(ClientHeight - TextHeight('D')) div 2; //вывод текста

TextOut(x,y,'Delphi') end;

end;

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

3.Добавим в предыдущее приложение возможность рисования мышью.

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

переменную Draw. Начальное значение для переменной укажем в обработчике события OnShow, установив его в False (рисовать запрещено).

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

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); begin

Paintbox1.Canvas.MoveTo(x,y); //перемещаем курсор

//включаем/отключаем рисование

if Button=mbMiddle then Draw:=not Draw;

//стираем нарисованное, обновлением фонового рисунка if Button=mbRight then PaintBox1Paint(nil);

end;

Рисование мышкой реализуем в обработчике события OnMouseMove.

procedure TForm3.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

//если разрешено, то рисуем линию в указанную точку if Draw then

Paintbox1.Canvas.LineTo(x,y) end;

152

Глава 15. Работа с таблицами

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

Компонент TStringGrid (Таблица строк) предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. Таблица делится на две части: фиксированную и рабочую. Фиксированная часть служит для показа заголовков колонок и рядов, а также для ручного управления их размерами. Обычно фиксированная часть занимает левую колонку и верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных колонок и рядов.

Рабочая часть это остальная часть таблицы. Она может содержать произвольное количество колонок и рядов, более того эти величины могут изменяться программно. Если рабочая часть таблицы не помещается целиком на экране, то автоматически появляется полоса прокрутки.

Основные свойства:

BorderStyle определяет рамку компонента: bsNone нет рамки, bsSingle рамка толщиной 1 пиксель;

Cells[Col,Row] определяет содержимое ячейки с табличными координатами (Col, Row);

Col содержит номер колонки с ячейкой, имеющей фокус ввода (нумерация начинается с нуля);

ColCount содержит количество колонок таблицы; ColWidths содержит ширину колонки с индексом Index;

EditorMode разрешает/запрещает редактирование ячеек. Игнорируется, если свойство Options включает значение goAlwayseShowEditor или не включает значение goEditing;

FixedColor определяет цвет фиксированной зоны;

FixedCols определяет количество колонок фиксированной зоны; FixedRows определяет количество рядов фиксированной зоны; GridHeight содержит значение высоты таблицы;

GridLineWidth определяет ширину линий, расчерчивающих таблицу; GridWidth содержит значение ширины таблицы;

Row содержит номер ряда ячейки, имеющий фокус ввода (нумерация начинается с нуля);

RowCount содержит количество рядов таблицы;

RowHeights содержит значение высоты ряда с индексом Index; Rows содержит все текстовые строки ряда с индексом Index;

153

ScrollBars определяет полосы прокрутки: ssNone нет полос; ssHorizontal

в таблицу вставляется горизонтальная полоса; ssVertical вставляется вертикальная полоса; ssBoth вставляются обе полосы;

Options настройки таблицы. Основные свойства:

goFixedVertLine рисовать вертикальные линии сетки у фиксированных ячеек.

goFixedHorzLine рисовать горизонтальные линии сетки у фиксированных ячеек.

goVertLine рисовать вертикальные линии сетки у нефиксированных ячеек.

goHorzLine рисовать горизонтальные линии сетки у нефиксированных ячеек.

goRangeSelect позволять выделять несколько ячеек. goDrawFocuSelected рисовать фокус выделенной ячейки.

goRowSizing можно ли изменять размер строк перетягиванием мышкой. goColSizing можно ли изменять размер колонок перетягиванием мышкой. goRowMoving – можно ли перемещать строки. Если True, то можно

мышкой нажать на фиксированную ячейку строки и перетащить её в новое положение.

goColMoving можно ли перемещать колонки. Если True, то можно

мышкой нажать на фиксированную ячейку колонки и перетащить её в новое положение.

goEditing можно ли вводить с клавиатуры данные в сетку.

goTabs если здесь установить True, то между ячейками можно передвигаться с помощью клавиши Tabs.

goRowSelect если False, то выделяется только выделенная ячейка. Если True, то вся строка.

goAlwaysShowEditor если False, то для редактирования ячейки нужно нажать Enter или F2. Если True, то редактирование возможно сразу после выделения ячейки.

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

Если программисту необходимо создать таблицу в ячейках, которой необходимо хранить произвольные объекты, то необходимо использовать компонент TDrawGrid (Рисуемая таблица) . Большинство свойств, описывающих поведение и внешний вид ячеек таблицы, совпадает с аналогичными свойствами таблицы строк. Однако в классе TDrawGrid отсутствуют свойства Cells и Objects. Создавать массивы объектов или определять, что надо нарисовать в конкретной ячейке, необходимо отдельно.

154

Практическое задание

Создадим простейшую базу данных, содержащую следующие поля: «Имя», «Год рождения», «Место жительства», «Информацию о работе», «Семейное положение».

Применрный вид приложения показан на рисунке.

1.Создадим новый проект. В

названии главной формы напишем «Простейшая База Данных».

2.Разместим на форме компонент Таблица строк, в

котором и будет выводится и храниться необходимая информация. Значения

количества строк RowCount установим 1, а столбцов ColCount := 5. Зафиксируем в

FixedCols один столбец. В свойстве Options для значения goRowSelect поставим True, таким образом сможем выделять в созданной таблице несколько строк.

3.Разместим три кнопки: для редактирования существующей записи (назовем ButEdit), добавления новой записи (назовем ButAdd) и удаления записи (назовем ButDel).

4.Для редактирования соответствующих полей будем использовать компоненты TEdit (EdName – «Имя», EdAdres «Место жительства», EdJob

«Работа»), TMaskEdit (EdYear – «Год рождения») и TComboBox Семейное положение») – добавим строки «не женат», «жен/замужи установим значение ItemIndex:=0. Для объекта TMaskEdit зададим маску ввода для даты рождения.

5. Зададим имена для заголовочной строкой. Для этого создадим обработчик события открытия формы OnShow. В обработчике напишем:

StringGrid.Cells[0, 0]:='Имя'; StringGrid.Cells[1, 0]:='Год рожд.'; StringGrid.Cells[2, 0]:='Место жит.'; StringGrid.Cells[3, 0]:='Работа'; StringGrid.Cells[4, 0]:='Семейное полож.';

Обратите внимание, что нумерация строк и столбцов начинается с нуля.

155

6. Создадим обработчик события нажатия кнопки «Добавить». В обработчике напишем:

with StringGrid do begin

RowCount:=RowCount+1; //увеличим число строк на 1

{копируем значения из объектов Edit, MaskEdit и ComboBox в соответствующую ячейку}

Cells[0, RowCount-1]:=EdName.Text;

Cells[1, RowCount-1]:=EdYear.Text;

Cells[2, RowCount-1]:=EdAdres.Text;

Cells[3, RowCount-1]:=EdJob.Text; Cells[4, RowCount-1]:=

ComboBox.Items[ComboBox.ItemIndex];

{выделяем в качестве фиксированной одну строку} FixedRows:=1;

end;

Необходимые пояснения даны по ходу программы.

7. Создадим обработчик события нажатия кнопки «Удалить». В обработчике напишем:

var

r, c:integer;

...

begin

...

if StringGrid.Row = 0 then Exit; with StringGrid do

begin

for r := Row to RowCount-1 do for c := 0 to ColCount-1 do

Cells[c, r]:=Cells[c, r+1]; RowCount:=RowCount-1;

end; end;

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

будем копировать на ее место значения из строк с большим порядковым номером. При этом копирование производится для соответствующих ячеек. В завершении максимальное число строк (RowCount) уменьшаем на 1.

8. При двойном нажатии кнопки мыши скопируем значения из соответствующей ячейки в компоненты для редактирования. Для этого создадим обработчик события OnDblClick для Таблицы строк. В обработчике напишем:

if StringGrid.Row=0 then Exit;

156

with StringGrid do begin

EdName.Text:=Cells[0,Row];

EdYear.Text:=Cells[1,Row];

EdAdres.Text:=Cells[2,Row];

EdJob.Text:=Cells[3,Row];

if Cells[4,Row]= ComboBox.Items[0] then ComboBox.ItemIndex:=0

else ComboBox.ItemIndex:=1; end;

9. Создадим обработчик события нажатия кнопки «Редактировать». В обработчике напишем:

{если строка является заголовком тогда выходим} if StringGrid.Row=0 then Exit;

with StringGrid do begin

Cells[0, Row]:=EdName.Text;

Cells[1, Row]:=EdYear.Text;

Cells[2, Row]:=EdAdres.Text;

Cells[3, Row]:=EdJob.Text;

Cells[4, Row]:=ComboBox.Items[ComboBox.ItemIndex]; end;

Таким образом, скопируется информация из компонент редактирования в соответствующую строку.

157

Глава 16. Работа с датой и временем

1.Компонент TMonthCalendar (Календарь)

Компонент предназначен для выбора и отображения даты. Может

одновременно отображать несколько смежных месяцев в зависимости от своих размеров. Основные свойства компонента:

CalColors цвет календаря (фона, дат, заголовков);

Date определяет выбранную дату; FirstDayOfWeek определяет первый день недели;

MaxDate определяет максимальную дату, месяц которой еще будет доступен для отображения в компоненте. Если свойство содержит пустое значение, то отображается любой следующий месяц;

MinDate определяет минимальную дату, месяц которой еще будет доступен для отображения в компоненте. Если свойство содержит пустое значение, то отображается любой предыдущий месяц;

ShowTodayCircle разрешает/запрещает обводить кружком текущую дату; WeekNumbers разрешает/запрещает показ порядковых номеров недель от

начала года в левой колонке.

2.Компонент TDateTimePicker (Поле ввода даты/времени)

CalAlignment определяет положение раскрывающегося календаря: dtaLeft слева от компонента; dtaRight справа от компонента. Учитывается только для

Kind=dtkDate и DateMode=dmComoBox;

CalColors цвет календаря;

Checked если выполняются условия Checked=True и ShowCheckBox=True, то флажок рядом с полем даты (времени) будет показан и установлен. Наличие

флажка или его отсутствие разрешает или запрещает ручной ввод даты или времени;

Date содержит введенную дату;

DateFormat определяет формат показа даты: dfShort 11.01.04; dfLong 5

сентября 2004 г;

DateMode определяет способ выбора даты: dmComboBox с помощью раскрывающегося календаря; dmUpDown с помощью встроенного компонента TUpDown;

Kind определяет содержимое компонента: dtkDate дата; dtkTime время; Time содержит введенное пользователем время.

158

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

Символ

Значение

Пример

d

Номер дня в месяце в цифровой форме

3

dd

Номер дня в месяце в цифровой форме, причем вне

03

 

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

 

 

значение меньше десяти, то слева будет приписан символ 0

 

ddd

День недели в символьной сокращенной форме

Вт

dddd

День недели в символьной полной форме

Вторник

M

Месяц в цифровой форме

3

MM

Месяц в цифровой форме, причем вне зависимости от

03

 

значения будут выведены две цифры

 

MMM

Месяц в символьной сокращенной форме

июн

MMMM

Месяц в символьной полной форме

июня

yy

Последние две цифры года

04

ww

Год в четыре цифры

2004

h

Час в цифровой форме в 12-ти часовом исчислении

4

hh

Час в цифровой форме в 12-ти часовом исчислении, причем

04

 

вне зависимости от значения будут выведены две цифры

 

H

Час в цифровой форме в 24-ёх часовом исчислении

16

HH

Час в цифровой форме в 24-ёх часовом исчислении, причем

16

 

вне зависимости от значения будут выведены две цифры

 

m

Минуты в цифровой форме

9

mm

Минуты в цифровой форме, причем вне зависимости от

09

 

значения будут выведены две цифры

 

t

Один символ аббревиатуры АМ/РМ

Р

tt

Аббревиатура АМ/РМ полностью

PM

Для примера сложного форматирования введем в свойство Format:=’dd MMMM yyyy (dddd), HH:mm’, тогда получим

3.Компонент TCalendar (Календарь)

Компонент календарь отображает календарь на выбранный месяц и год. Его свойства Day, Month, Year могут содержать любую дату от 1 до 9999 года от Рождества Христова.

159

4.Форматы даты и времени

Работа с календарями происходит на основе типа TDateTime. Текущая выбранная дата записывается в свойство Date этого типа. Само значение хранится в запакованном формате в поле типа Double. Кроме типа TDateTime можно применять также системный формат TSystemTime, который содержит полное описание текущих даты и времени:

type

TSystemTime = record wYear: word; wMonth: word; wDayofWeek: word; wDay: word;

wHour: word; wMinute: word; wSecond: word; wMilliseconds: word; end;

Можно использовать и формат TTimeStamp:

type

TTimeStamp = record Time: Integer; Date: Integer; end;

В поле Time храниться число миллисекунд, прошедшее с полуночи, в поле

Date число дней от 1 января 0001 года плюс 1.

Для обработки даты и времени модуль SysUtils содержит следующие основные функции:

function Date: TDateTime; возвращает текущую дату.

function DateTimeToStr(DateTime: TDateTime):string;

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

procedure DateTimeToSystemTime(DateTime: TDateTime;

var SystenTime: TSystemTime); преобразование даты/времени из формата TDateTime в формат TSystemTime.

function DateToStr(Date: TDateTime): string; преобразование даты в строку.

function DayOfWeek(Date: TDateTime): integer; номер дня недели,

число от 1 до 7 (1 – воскресенье, 7 – суббота).

procedure DecodeDate(Date: TDateTime;

var Year, Month, Day: word); выделение из даты года, месяца и дня.

160

procedure DecodeTime(Time: TDateTime;

var Hour, Min, Sec, Msec: word); выделение из даты часов, минут, секунд и миллисекунд.

function EncodeTime(Hour, Min, Sec, Msec: word): TDateTime;

преобразование явно заданных часов, минут, секунд и миллисекунд в дату формата TDateTime;

function Now: TDateTime; возвращает текущую дату и время. function Time: TDateTime; возвращает текущее время.

function TimeToStr(Time: TDateTime):string; преобразование времени в строку.

Задания для самостоятельного выполнения:

1.По введенному номеру года найти количество понедельников в этом году, количество пятниц 13.

2.По введенной дате вывести день недели в этом году и календарь на этот месяц.

3.Создайте приложение «Праздничные Дни». Для хранения информации о днях использовать файлы.

4.Создать приложение «Таймер». Использовать компонент класса TTimer (основное свойство Interval время в миллисекундах, основное событие onTimer генерируется при прошествии указанного интервала).

5.Создать приложение «Часы». Использовать компонент класса TTimer.