Ракитин Р.Ю. ООП в Turbo Delphi
.PDF151
//цвет шрифта – «белый»
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.