constFormats: array[TAlignment] ofWord = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
WriteText(Canvas, Rect, 2, 2, S, Formats[Alignment]);
end;
begin
{ здесь задаем аргументы Col и Row, и форматируем как угодно ячейки }
caseRow of
0: { Центрирование заголовков колонок }
if(Col < ColCount) thenDisplay(Cells[Col,Row], taCenter)
else
{ Все другие данные имеют правое центрирование }
Display(Cells[Col,Row], taRight);
end;
end;
Выравнивание колонок StringGrid IV
Создайте ваш собственный метод drawcell на примере того, что приведен ниже:
procedureTsearchfrm.Grid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
varl_oldalign : word;
begin
if (row=0) or(col<2) thengrid1.canvas.font.style:= grid1.canvas.font.style+[fsbold]; {устанавливаем заголовок в жирном начертании}
ifcol<>1 then begin
l_oldalign:=settextalign(grid1.canvas.handle, ta_right);
{NB использует для рисования правую сторону квадрата}
grid1.canvas.textrect(rect,rect.right-2, Rect.top+2,grid1.cells[col,row]);
settextalign(grid1.canvas.handle,l_oldalign);
end else begin
grid1.canvas.textrect(rect, rect.left+2, rect.top+2, grid1.cells[col,row]);
end;
grid1.canvas.font.style:= grid1.canvas.font.style-[fsbold];
end;
…вы можете попробовать использовать StringGrid. У него имеется свойство Objects, через которое вы можете назначать объекты. Создайте объект, содержащий переменную типа TColor, и назначьте это Objects[col,row], что позволит иметь к нему доступ в любое время. Назначьте событие OnDrawCell StringGrid, позволяющее рисовать текст ячейки правильного цвета. Чтобы убедиться, что ячейка выбрана, воспользуйтесь свойством Selection, содержащим то, что выбрал пользователь. Все это должно выглядеть приблизительно так:
typeTStrColor = class(TObject)
public
Color : TColor; {вы могли бы также определить частные и публичные методы доступа}
end;
…
procedureTForm1.FormCreate(Sender:TObject)
vari,j : Integer;
begin
WithStringList1 do
fori := 0 toColCount-1
forj := 0 toRowCount-1 Objects[i,j] := TStrColor.Create;
end;
…
procedureTForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
varOldColor : TColor;
begin
withStringGrid1.Canvas do begin
OldColor := Font.Color;
Font.Color := (StringGrid1.Objects[col,row] asTStrColor).Color;
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[Col,Row]);
Font.Color := OldColor;
end;
end;
…
procedureTForm1.ProcessSelection(Sender: TObject);
vari, j : Integer;
begin
WithStringGrid1.Selection do
For i := left toright do
for j := top tobottom do
MessageDlg(IntToStr(i) + ',' + IntToStr(j) + '-' + IntToStr((StringGrid1.Objects[i,j] aststrcolor).color), mtInformation, [mbOk], 0);
end;
Этот компонент не позволяет делать многочисленный выбор….
Покрашенный StringGrid II
В данном модуле демонстрируется техника изменения цвета у выводимого в StringGrid текста.
unitStrgr;
interface
usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, DB;
typeTForm1 = class(TForm)
StringGrid1: TStringGrid;
procedureStringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
procedureTForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
constCharOffset = 3;
begin
withStringGrid1.canvas do begin
font.color := clMaroon;
textout(rect.left + CharOffset, rect.top + CharOffset, 'L');
font.color := clNavy;
textout(rect.left + CharOffset + TextWidth('L'), rect.top + CharOffset, 'loyd');
end;
end;
end.
Редактирование в StringGrid
…правда, я этого не пробовал, но в голову пришли две идеи:
1. Нажмите на втором поле редактировании, переведите фокус на другое поле (например, x.focus, где x не сетка), сбросьте goEditing и selectRow и затем верните фокус назад сетке. (Эта техника работала у меня в нескольких местах, например, в градах и мемах.)
Читать дальше