32. Таблицы изображений. Draw. Grid – таблица, где каждая ячейка представляет графическую информацию. Две основные области – фиксированная и подвижная. Для прорисовки ячеек таблицы обязательно следует определить обработчик события On. Draw. Cell. Рисование выполняется с помощью свойства Canvas таблицы.
Сколько в таблице ячеек?
Свойства компонента Draw. Grid: Col. Count Row. Count Col Row Число столбцов Число строк Fixed. Cols Fixed. Rows Число столбцов и строк в фиксированной области Fixed. Color Цвет ячеек фиксированной области Адрес сфокусированной ячейки (с нуля!) Default. Col. Width Ширина столбцов по умолчанию Default. Row. Height Высота строк по умолчанию Col. Widths[k: integer] Ширина k–го столбца (run-time) Row. Heights[k: integer] Высота k–ой строки (run-time)
Left. Col Top. Row Visible. Col. Count Visible. Row. Count Самый левый видимый столбец Самая верхняя видимая строка Количество строк и столбцов, видимых в зоне прокрутки Grid. Line. Width Bordre. Style Default. Drawing Ширина разделительных линий Тип границы компонента (есть или нет) Если TRUE, то служебные элементы таблицы прорисовываются автоматически Options Параметры таблицы [множество]: go. Fixed. Vert. Line, go. Fixed. Horz. Line, go. Vert. Line, go. Horz. Line, go. Range. Select, go. Row. Sizing, go. Col. Sizing, go. Row. Moving, go. Col. Moving, go. Editing
Методы компонента Draw. Grid: function Cell. Rect (ACol, ARow: Longlnt) : TRect; Возвращает прямоугольник ячейки по номерам столбца ACol и ряда ARow (для рисования в данной ячейке). procedure Mouse. To. Cell (X, Y: Integer; var ACol, ARow: Longlnt) ; Возвращает табличные координаты ячейки ACol и ARow по экранным координатам (X, Y) точки.
События компонента Draw. Grid: On. Draw. Cell : procedure (Sender; ACol, ARow; Rect: TRect; State: TGrid. Draw. State); Возникает при перерисовке ячейки (ACol , ARow). On. Get. Edit. Text : procedure (Sender; ACol, ARow; var Value: String); Возникает в момент начала редактирования текста в ячейке (ACol, ARow). В параметре Value обработчик должен вернуть текст для встроенного редактора типа TEdit. On. Set. Edit. Text : procedure (Sender; ACol, ARow; const Value: String); Возникает при завершении редактирования ячейки (ACol, ARow). В параметре Value обработчик получает результат ввода или редактирования текста.
Пример 1: шахматная доска. 3 На форму - Draw. Grid Default. Col. Width 24 Col. Count 8 Row. Count 8 Fixed. Cols 0 Fixed. Rows 0 На событие Draw. Grid 1. On. Draw. Cell перерисуем каждую ячейку. with Draw. Grid 1, Canvas do begin if Odd(ACol+Arow) then Brush. Color: =cl. Blue else Brush. Color: =cl. White; Fill. Rect(Rect); end;
Пример 2: просмотрщик графических файлов. На форму - Draw. Grid Align al. Client Col. Count 3 Row. Count 2 Fixed. Cols 0 Fixed. Rows 0 Options. go. Editing True В описание формы добавить поле, содержащее ссылку на список строк. 2 Type TForm 1 = class(TForm) Draw. Grid 1: TDraw. Grid; public { Public declarations } SL : TString. List; end;
На событие Form 1. On. Create создадим список имен граф. файлов: var sr k : TSearch. Rec; : byte; begin SL: =TString. List. Create; Ch. Dir('c: /Program Files/Common Files/Borland Shared/’+ 'Images/Splash/256 Color'); if Find. First('*. bmp', fa. Any. File, sr) = 0 then begin repeat if (sr. Attr and fa. Any. File) = sr. Attr then begin k: =SL. Add(sr. Name); SL. Objects[k]: =TBitmap. Create; TBitmap(SL. Objects[k]). Load. From. File(SL[k]); end; until Find. Next(sr) <> 0; Find. Close(sr); end;
На событие Form 1. On. Destroy разрушим этот список имен. Begin SL. Free; end; На событие Draw. Grid 1. On. Get. Edit. Text укажем имя файла. Begin Value end; : = SL[2 * ACol + Arow]; На событие Draw. Grid 1. On. Set. Edit. Text сменим имя файла и считаем рисунок для ячейки. Begin if File. Exists(Value) then begin SL[2 * ACol + ARow] : = Value; TBitmap(SL. Objects[2*ACol +ARow]). Load. From. File(Value); end;
На событие Draw. Grid 1. On. Draw. Cell перерисуем ячейку. var k: Integer; begin k : = 2 * ACol + ARow; if k<SL. Count then with Draw. Grid 1. Canvas, Rect, SL do begin Bottom : = Bottom - Text. Height('1') - 2; Stretch. Draw(Rect, (Objects[k] as TBit. Map)); Text. Out(Left + (Right - Left - Text. Width(SL[k])) div 2, Bottom + 1, SL[k]) end; На событие Form 1. On. Resize изменим размеры ячеек: Begin with Draw. Grid 1 do begin Default. Col. Width : = Client. Rect. Right div 3 - 1; Default. Row. Height : = Client. Rect. Bottom div 2 – 1 end;
33. Таблицы строк. String. Grid – таблица, где каждая ячейка хранит и текстовую и графическую информацию. Является потомком компонента Draw. Grid и наследует все его свойства и методы. Дополнительно позволяет хранить текст в каждой ячейке и автоматически выводит этот текст. Основное приобретенное свойство Cells[ ACol, Arow ]: string представляет текст в ячейке (ACol, ARow). Свойство Objects[ ACol, ARow ]: TObject позволяет каждой ячейке таблицы соотносить произвольный объект. Если Default. Drawing=TRUE, то выполняется автоматическая отрисовка текста. Иначе вывод текста выполняет программист, используя свойство Canvas.
Пример: Таблицы сложения/умножения.
На событие Radio. Group(RG). On. Click рисуем таблицу заново. var i, j : byte; begin With SG do begin if RG. Item. Index=0 then Cells[0, 0]: =‘+‘ else Cells[0, 0]: =‘х‘; for i: =1 to 9 do begin Cells[0, i]: =Int. To. Str(i); Cells[i, 0]: =Int. To. Str(i); for j: =1 to 9 do if RG. Item. Index=0 then Cells[j, i]: =Int. To. Str(i+j) else Cells[j, i]: =Int. To. Str(i*j); end; 4
Пример: Таблица «Расписание занятий» .
Пользовательский тип TCell описывает параметры отдельной ячейки. TCell = class Name, Room : string; Color : TColor; end; while Random(20)<>0 do begin i: =Random(7)+1; j: =Random(6)+1; if SG 1. Objects[j, i]=Nil then begin Cell: =TCell. Create; Case Random(10) of 0: Cell. Name: =‘История'; 1: Cell. Name: =‘ОО и ВП'; . . . 9: Cell. Name: =‘Бухг. учёт'; end; Cell. Room: =Int. To. Str(Random(400)); Cell. Color: =Rgb(157+Random(99), 157+Random(99)); SG 1. Objects[j, i]: =Cell; end;
Отрисовка содержимого ячейки – в обработчике события On. Draw. Cell if ARow>0 then if ACol>0 then with SG 1, Canvas do if Objects[ACol, ARow]<>Nil then begin Cell: =TCell(Objects[ACol, ARow]); Brush. Color: =Cell. Color; Fill. Rect(Rect); Font. Name: ='System'; Font. Size: =10; Font. Style: =[fs. Bold]; x: =Rect. Right-3 -Text. Width(Cell. Room); y: =Rect. Bottom-1 -Text. Height(Cell. Room); Text. Out(x, y, Cell. Room); Font. Name: ='Arial'; Font. Size: =14; while Text. Width(Cell. Name)>Rect. Right-Rect. Left-4 do Font. Size: =Font. Size-1; x: =Rect. Left+(Rect. Right-Rect. Left. Text. Width(Cell. Name)) div 2; 5 y: =Rect. Bottom-Text. Height(Cell. Room)Text. Height(Cell. Name)-5; Text. Out(x, y, Cell. Name); end;
34. Иерархия компонентов. Иерархия для класса TForm Класс TObject. Является общим предком всех классов в Delphi. Описывает основные возможности работы с объектами во время выполнения программы (создание, уничтожение, обработка событий, определение адресов полей и методов по имени).
Класс TPersistent. Класс содержит методы, позволяющие компонентам копировать своё содержимое. procedure Assign(Source: TPersistent); копирует поля источника Source, в текущий компонент. procedure Assign. To(Destination: TPersistent); копирует поля текущего компонента в компонент – параметр. Пример использования: Clipboard. Assign(My. Bitmap); My. Bitmap. Assign(Clipboard); При этом используются переопределенные (измененные в потомках) методы.
Класс TComponent. Служит базой для создания остальных компонент. Некоторые компоненты напрямую порождаются от этого класса (TMenu, TScreen, TApplication, TTimer). Другие компоненты происходят от класса TControl, имеющего двух потомков TWin. Control и TGraphic. Control. Визуальные компоненты, созданные на базе TWin. Control (Form, Button, Memo, Panel) получают т. н. оконный ресурс Windows, позволяющий получать и обрабатывать сообщения Windows. При создании они получают дискриптор окна (св-во Handle), позволяющий вызывать функции Windows API. Потомки класса TGraphic. Control (Label, Shape, Image, Paint. Box) оконного ресурса не получают, т. е. являются рисунками. Ими управляет их владелец (форма, панель), имеющий подобный ресурс.
Свойства объектов класса TComponent: Name Tag Owner Имя компонента Произвольное целое (для программиста!) Владелец компонента (создаёт и уничтожает компонент) Components [index: integer] Список всех компонентов, которыми владеет данный компонент Component. Count Количество подчиненных компонент Component. Index Номер данного компонента в списке его владельца При создании компонента используется конструктор constructor Create(AOwner: TComponent)
Пример 1. Динамическое создание кнопок. Form 1. On. Mouse. Down var Btn: TButton; begin Btn: =TButton. Create(Form 1); Btn. Parent: =Form 1; Btn. Left: =x; Btn. Top: =y; Btn. Caption: =Int. To. Str(Form 1. Component. Count); end; Для компиляции необходимо в список модулей Uses добавить Uses Windows, . . . , Std. Ctrls;
Пример 2. Динамическое создание кнопок. Form 1. On. Mouse. Down var Btn: TButton; begin if Shift = [ss. Left] then Btn: =TButton. Create(Form 1); if Shift=[ss. Right] then begin Btn: =TBit. Btn. Create(Form 1); TBit. Btn(Btn). Kind: =bk. Retry; end; Btn. Parent: =Form 1; Btn. Left: =x; Btn. Top: =y; Btn. Caption: =Int. To. Str(Form 1. Component. Count); Btn. On. Click: =My. Click; end;
Каждая кнопка при создании получает обработчик события On. Click Btn. On. Click: =My. Click; текст которого написан заранее type TForm 1 = class(TForm) procedure My. Click(Sender: TObject); private. . . end; procedure TForm 1. My. Click(Sender: TObject); begin if Sender is TButton then Caption: = (Sender as TButton). Caption; if Sender is TBit. Btn then Close; end;
Пример 3. Динамическое создание кнопок. Form 1. On. Create var i : byte; begin for i: =0 to 32 do with TButton. Create(Form 1) do begin Parent: =Form 1; Left: =10+20*i; Top: =50; Height: =17; Width: =17; if i<32 then Caption: =Chr(Ord(‘А’)+i) else Caption: =' '; On. Click: =Key. Click; end;
Type TForm 1 = class(TForm) Label 1: TLabel; procedure Form. Create(Sender: TObject); procedure Key. Click(Sender: TObject); end; Процедуру Key. Click пишем сами! procedure TForm 1. Key. Click(Sender: TObject); begin with Sender as TButton do Label 1. Caption: =Label 1. Caption+Caption; end;