Delphi World - Событие OnDraw для TStringGrid
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Событие OnDraw для TStringGrid

Это код, который я использую для печати TMemoField в TDBGrid. Перекрываем (override) метод DrawCell:


Canvas.FillRect(ARect);
R := ARect;
WITH TMemoField(Field) DO
DrawText(Canvas.Handle, PChar(Value), Length(Value), R,
DT_WORDBREAK OR DT_NOPREFIX);

Я думаю этот код, который я создал в Delphi 1.0, должен помочь вам:


procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
  Rect: TRect; State: TGridDrawState);
var
  bufB: array[0..79] of Char;
  algn: Word;
begin
  algn := 0;
  if (Col = NumbColK) or (Col = PrceColK) or
    (Col = TtlColK) then
    algn := dt_Right;
  if Row = 0 then
    algn := dt_Center;
  if algn = 0 then
    Exit;
  StringGrid1.Canvas.FillRect(Rect);
  StrPCopy(bufB, StringGrid1.CellS[Col, Row]);
  Rect.Top := Rect.Top + 2;
  Rect.Right := Rect.Right - 2;
  DrawText(StringGrid1.Canvas.Handle, bufB, -1, Rect, algn);
end;

  1. В первой части необходимо установить нужное вам выравнивание, и очистить старый текст.
  2. Число -1, поскольку, я думаю, bufB должен быть строкой с терминирующим нулем, в которую вы можете помещать любое число, например, 10, и он должен ограничивать вашу строку до 10, как раз то, что вы хотели.

...действительно, в зависимости от вашего приложения, можно все значительно упростить. Если вы заполняете сетку из другого источника, просто сделайте так:


grid.cells[col,row] :=
trimWithDots (myString, form1.canvas, grid.widths[col]-2);

где trimWithDots-функция, с помощью которой вычисляется количество пикселей, необходимых для написания в ячейки сетки строки myString. При этом у myString обрезаются левые и правые пробелы, а для определения ширины используется функция холста textWidth:


function trimWithDots (const myString: string; canvas: tCanvas;
wid: integer): string;
begin
  result := myString;
  while canvas.textWidth (result) > wid do
    delete (result, length(result), 1);
end;

Естественно, вы можете сделать это более грамотнее, добавляя к правильно-обрезанному тексту '...'. По какой-то странной причине, grid.canvas почему-то возвращает мне неверные результаты, поэтому я всегда работаю с form1.canvas, который меня никогда не подводил.

Если вы не загружаете сетку из другого источника, вы можете все делать так, как описано выше, но помещая код в обработчик события onDrawDataCell. В этом случае сетка нарисует за вас все линии, вам же останется нарисовать только содержимое.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования