Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Текст в ячейке StringGrid если не помещается переносится на следующую ячейку

Delphi , Компоненты и Классы , TStringGrid и TDrawGrid

Текст в ячейке StringGrid если не помещается переносится на следующую ячейку

Сначала нужно обработать событие OnDrawCell компонента TStringGrid:


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
  i, x, y: Integer;
begin
  if 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 do
  begin
    {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;
begin
  with StringGrid1 do
  begin
    cells[1, 1] := 'A rather long line which will span cells';
    for i:= 1 to colcount-1 do
      for 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, что вызовет таблицу обрезать длинные строки и продолжить их в следующих ячейках.

Например:

procedure TForm1.FormCreate(Sender: TObject);
begin
  with StringGrid1 do
  begin
    WrapMode := gmDefault;
     // ... настройка данных ...
  end;
end;

Этот подход более прост и менее подвержен ошибкам. Однако, он может не обеспечивать точный визуальный вид, как ваш оригинальный код, в зависимости от того, как вы хотите обрабатывать обрезание и окрашивание.

В статье описывается метод обработки текста в ячейках компонента TStringGrid, при котором текст в случае неудачного размещения переносится на следующую ячейку.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TStringGrid и TDrawGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:23:32/0.0057249069213867/1