Компонент StringGrid может хранить в своих ячейках не только строковые, но и графические данные.
В качестве примера загрузки графических данных в StringGrid рассмотрим размещение изображения в ячейке по клику на неё.
Для этого необходимо обработать два события компонента StringGrid: OnClick и OnDrawCell.
В OnClick будет выполняться определение текущей ячейки и загрузка изображения. В OnDrawCell его отрисовка.
Для хранения информации о текущей ячейке используем две глобальные переменные.
1 |
x, y: Integer; |
Определение текущей ячейки осуществляется просто:
1 2 |
x := StringGrid1.Col; y := StringGrid1.Row; |
С загрузкой изображения гораздо сложнее. Для этого нужно «поместить» в ячейку графический объект и уже в него загрузить изображение. В качестве примера используем TBitmap.
1 2 |
StringGrid1.Objects[x, y] := TBitmap.Create; (StringGrid1.Objects[x, y] as TBitmap).LoadFromFile('C:\Птица.bmp'); |
В итоге обработчик события OnClick для StringGrid будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 |
procedure TForm1.StringGrid1Click(Sender: TObject); begin // определениее текущей ячейки x := StringGrid1.Col; y := StringGrid1.Row; // загрузка изображения в текущую ячейку StringGrid1.Objects[x, y] := TBitmap.Create; (StringGrid1.Objects[x, y] as TBitmap).LoadFromFile('C:\Птица.bmp'); end; |
Теперь, чтобы загруженное изображение отобразилось в ячейке, необходимо выполнить его отрисовку.
Для того чтобы изображение поместилось в ячейку воспользуемся методом StretchDraw класса Canvas. Этот метод принимает два аргумента: область, в которой необходимо поместить изображение, и графический объект, который это изображение содержит.
В качестве области будет служить размер текущей ячейки, а в качестве графического объекта, по сути, сама ячейка. Сведения о том, какая ячейка является в данный момент текущей, получаем из глобальных переменных.
1 2 3 4 5 6 |
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin // отрисовка if StringGrid1.Objects[x, y] is TBitmap then StringGrid1.Canvas.StretchDraw(StringGrid1.CellRect(x, y), TBitmap(StringGrid1.Objects[x, y])); end; |
После компиляции и запуска приложения в ячейки StringGrid при клке на них будет добавляться изображение.
Добавить комментарий