Текст в ячейке StringGrid если не помещается переносится на следующую ячейку
Сначала нужно обработать событие OnDrawCell компонента TStringGrid:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
i, x, y: Integer;
beginif gdFixed in State then
Exit;
if ARow > 1 then
Exit;
{Draw row 1 with text from cell 1,1 spanning all cells in the row}with sender as TStringGrid dobegin{Extend rect to include grid line on right, if not last cell in row}if aCol < Pred(ColCount) then
Rect.Right := Rect.Right + GridlineWidth;
{Figure out where the text of the first cell would start
relative to the current cells rect}
y := Rect.Top + 2;
x := Rect.Left + 2;
for i:= 1 to aCol - 1 do
x := x - ColWidths[i] - GridlineWidth;
{Paint cell pale yellow}
Canvas.Brush.Color := $7FFFFF;
Canvas.Brush.Style := bsSolid;
Canvas.FillRect( Rect );
{Paint text of cell 1,1 clipped to current cell}
Canvas.TextRect( Rect, x, y, Cells[1, 1] );
end;
end;
По созданию окна изобразим следующее
procedure TForm1.FormCreate(Sender: TObject);
var
i, k: Integer;
beginwith StringGrid1 dobegin
cells[1, 1] := 'A rather long line which will span cells';
for i:= 1 to colcount-1 dofor k:= 2 to rowcount -1 do
cells[i,k] := Format( 'Cell[%d, %d]', [i, k]);
end;
end;
Текст:
Код, представленный в этом разделе, является частью приложения Delphi, использующего компонент TStringGrid для отображения данных в таблице. Цель состоит в обработке случая, когда длинная строка превышает ширину ячейки и требует продолжения в следующей ячейке.
В процедуре FormCreate код устанавливает некоторые начальные данные для ячеек таблицы:
Устанавливается значение ячейки [1, 1] в длинную строку, которая будет занимать несколько ячеек.
Пополняется остальная часть таблицы примерными данными в формате "Ячейка [X, Y]".
В процедуре StringGrid1DrawCell код обрабатывает рисование отдельных ячеек в таблице:
Если ячейка фиксированная (т. е., не редактируемая), то код выходит из процедуры.
Если номер строки больше 1, то код также выходит. Это может быть способом пропустить рисование некоторых строк или ячеек.
Устанавливается прямоугольник (Rect), представляющий область, где будет рисоваться ячейка.
Правый край Rect корректируется, если это не последняя ячейка в строке (т. е., есть линия таблицы справа).
Вычисляется начальная позиция для рисования текста в ячейке относительно текущей ячейки (Rect). Это делается путем вычитания ширин предыдущих ячеек и их линий.
Ячейка окрашивается в светло-желтый цвет.
Наконец, рисуется текст первой ячейки (1, 1), обрезанный до текущей ячейки. Если текст превышает ширину ячейки, он будет продолжен в следующей ячейке.
Однако, код имеет некоторые потенциальные проблемы:
Процедура StringGrid1DrawCell кажется спроектированной для конкретной строки и столбца, но не ясно, как она обрабатывает другие ячейки.
Нет обработки ошибок в случаях, когда строка превышает ширину ячейки в способах, которые не обрабатываются текущим кодом (например, если есть несколько строк текста).
Процедура StringGrid1DrawCell выполняет некоторые рисования и окрашивания, но это может быть лучше обработано компонентом TStringGrid himself.
Альтернативный подход:
Вместо переопределения события OnDrawCell, можно использовать встроенную поддержку компонента TStringGrid для обрезания текста вокруг следующей ячейки. Это можно сделать, установив свойство WrapMode в gmDefault, что вызовет таблицу обрезать длинные строки и продолжить их в следующих ячейках.
Например:
procedureTForm1.FormCreate(Sender:TObject);beginwithStringGrid1dobeginWrapMode:=gmDefault;// ... настройка данных ...end;end;
Этот подход более прост и менее подвержен ошибкам. Однако, он может не обеспечивать точный визуальный вид, как ваш оригинальный код, в зависимости от того, как вы хотите обрабатывать обрезание и окрашивание.
В статье описывается метод обработки текста в ячейках компонента TStringGrid, при котором текст в случае неудачного размещения переносится на следующую ячейку.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.