Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

i, j, temp, max: integer;

for i := 0 to grid.colcount-1 do begin

 max := 0;

 for j := 0 to grid.rowcount-1 do begin

temp := grid.canvas.textWidth(grid.cells[i,j]);

if temp > max then max := temp;

 end;

 grid.colWidths[i] := max + grid.gridLineWidth +1;

end;

Вероятно,

вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек.

Выравнивание колонок StringGrid III

Вот некоторый код, который делает то, что вы хотите:

procedure WriteText(ACanvas: TCanvas; const ARect: TRect; DX, DY: Integer; const Text: string; Format: Word);

var

 S: array[0..255] of Char;

 B, R: TRect;

begin

 with ACanvas, ARect do begin

case Format of

DT_LEFT:

ExtTextOut(Handle, Left + DX, Top + DY, ETO_OPAQUE or ETO_CLIPPED,@ARect, StrPCopy(S, Text), Length(Text), nil);

DT_RIGHT:

ExtTextOut(Handle, Right - TextWidth(Text) - 3, Top + DY,ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text),Length(Text), nil);

DT_CENTER:

ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2, Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,StrPCopy(S, Text), Length(Text), nil);

end;

 end;

end;

procedure TBEFStringGrid.DrawCell(Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var

 procedure Display(const S: string; Alignment: TAlignment);

 const Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);

 begin

WriteText(Canvas, Rect, 2, 2, S, Formats[Alignment]);

 end;

begin

 { здесь задаем аргументы Col и Row, и форматируем как угодно ячейки }

 case Row of

 0: { Центрирование заголовков колонок }

if (Col < ColCount) then Display(Cells[Col,Row], taCenter)

else

{ Все другие данные имеют правое центрирование }

Display(Cells[Col,Row], taRight);

 end;

end;
 

Выравнивание

колонок StringGrid IV

Delphi 1 

Создайте ваш собственный метод drawcell на примере того, что приведен ниже:

procedure Tsearchfrm.Grid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var l_oldalign : word;

begin

 if (row=0) or (col<2) then grid1.canvas.font.style:= grid1.canvas.font.style+[fsbold]; {устанавливаем заголовок в жирном начертании}

 if col<>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 I

Delphi 1

…вы можете попробовать использовать StringGrid. У него имеется свойство Objects, через которое вы можете назначать объекты. Создайте объект, содержащий переменную типа TColor, и назначьте это Objects[col,row], что позволит иметь к нему доступ в любое время. Назначьте событие OnDrawCell StringGrid, позволяющее рисовать текст ячейки правильного цвета. Чтобы убедиться, что ячейка выбрана, воспользуйтесь свойством Selection, содержащим то, что выбрал пользователь. Все это должно выглядеть приблизительно так:

type TStrColor = class(TObject)

public

Color : TColor; {вы могли бы также определить частные и публичные методы доступа}

end;

procedure TForm1.FormCreate(Sender:TObject)

var i,j : Integer;

begin

 With StringList1 do

for i := 0 to ColCount-1

for j := 0 to RowCount-1 Objects[i,j] := TStrColor.Create;

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);

var OldColor : TColor;

begin

Поделиться с друзьями: