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

Компонет TWrapGrid, осуществляющий перенос текста в TStringGrid

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

Компонет TWrapGrid, осуществляющий перенос текста в TStringGrid

Я наконец нашел время и создал заказной компонент TWrapGrid, функционально идентичный TStringGrid, но умеющий переносить текст в ячейках. Пока это бета-версия, поэтому поэкспериментируйте с ним, и в случае наличия каких-либо замечаний или предложений не забудьте уведомить об этом меня. При использовании компонента не забывайте про RowHeights (или DefaultRowHeight), т.к. при переносе текста потребуется отобразить несколько строк.

Для использования скопируйте код в модуль, сохраните его с именем 'Wrapgrid.PAS' и следуйте за инструкциями, расположенными в верхней части кода.

Присылайте свой комментарии и пожелания. Вот код:


{  Код заказного компонента для Delphi.

Позволяет переносить текст в TStringGrid, отсюда и его имя - TWrapGrid.
Автор Luis J. de la Rosa.
E-mail: delarosa@ix.netcom.com
Вы свободны в использовании, распространении и улучшении кода.

Для использования:  Выберите в Delphi пункты меню 'Options' - 'Install Components'.
Нажмите 'Add'.
Найдите и выберите файл с именем 'Wrapgrid.PAS'.
Нажмите 'OK'.
После этого вы увидете компонент во вкладке "Samples" палитры компонентов
Delphi.
После этого вы можете использовать компонент вместо стандартного TStringGrid.

Пожалуйста шлите любые комментарии и пожелания на адрес delarosa@ix.netcom.com.
Успехов!

Несколько дополнительных замечаний по коду:
Методы Create и DrawCell были перекрыты. Everything else should
behave just like a TStringGrid.
The Create sets the DefaultDrawing to False, so you don't need to.

Also, I am using the pure block emulation style of programming, making my
code easier to read.
}

unit Wrapgrid;

interface

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Grids;

type

  TWrapGrid = class(TStringGrid)
  private
    { Private declarations }
  protected
    { Protected declarations }
    { Процедура DrawCell осуществляет перенос текста в ячейке }
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
      AState: TGridDrawState); override;
  public
    { Public declarations }
    { Процедура Create перекрывается для того, чтобы использовать процедуру DrawCell
    по умолчанию }
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor TWrapGrid.Create(AOwner: TComponent);
begin

  { Создаем TStringGrid }
  inherited Create(AOwner);

  { Заставляем компонент перерисовываться нашей процедурой по умолчанию DrawCell }
  DefaultDrawing := FALSE;
end;

{ Процедура DrawCell осуществляет перенос текста в ячейке }

procedure TWrapGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;

  AState: TGridDrawState);
var

  Sentence, { Выводимый текст }
  CurWord: string; { Текущее выводимое слово }
  SpacePos, { Позиция первого пробела }
  CurX, { Х-координата 'курсора' }
  CurY: Integer; { Y-координата 'курсора' }
  EndOfSentence: Boolean; { Величина, указывающая на заполненность ячейки }
begin

  { Инициализируем шрифт, чтобы он был управляющим шрифтом }
  Canvas.Font := Font;

  with Canvas do
  begin
    { Если это фиксированная ячейка, тогда используем фиксированный цвет }
    if gdFixed in AState then
    begin
      Pen.Color := FixedColor;
      Brush.Color := FixedColor;
    end
      { в противном случае используем нормальный цвет }
    else
    begin
      Pen.Color := Color;
      Brush.Color := Color;
    end;

    { Рисуем подложку цветом ячейки }
    Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
  end;

  { Начинаем рисование с верхнего левого угла ячейки }
  CurX := ARect.Left;
  CurY := ARect.Top;

  { Здесь мы получаем содержание ячейки }
  Sentence := Cells[ACol, ARow];

  { для каждого слова ячейки }
  EndOfSentence := FALSE;
  while (not EndOfSentence) do
  begin
    { для получения следующего слова ищем пробел }
    SpacePos := Pos(' ', Sentence);
    if SpacePos > 0 then
    begin
      { получаем текущее слово плюс пробел }
      CurWord := Copy(Sentence, 0, SpacePos);

      { получаем остальную часть предложения }
      Sentence := Copy(Sentence, SpacePos + 1, Length(Sentence) - SpacePos);
    end
    else
    begin
      { это - последнее слово в предложении }
      EndOfSentence := TRUE;
      CurWord := Sentence;
    end;

    with Canvas do
    begin
      { если текст выходит за границы ячейки }
      if (TextWidth(CurWord) + CurX) > ARect.Right then
      begin
        { переносим на следующую строку }
        CurY := CurY + TextHeight(CurWord);
        CurX := ARect.Left;
      end;

      { выводим слово }
      TextOut(CurX, CurY, CurWord);
      { увеличиваем X-координату курсора }
      CurX := CurX + TextWidth(CurWord);
    end;
  end;
end;

procedure Register;
begin

  { Вы можете изменить закладку Samples на любую другую
  палитре компонентов Delphi }
  RegisterComponents('Samples', [TWrapGrid]);
end;

end.

Эта является пользовательской компонентой, называемой TWrapGrid, которая похожа на стандартную компоненту TStringGrid в Delphi. Главное отличие между ними заключается в том, что TWrapGrid может обернуть текст внутри ячеек, а TStringGrid не может.

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

  1. Класс TWrapGrid: Это основной класс, который наследуется от TStringGrid. Он переопределяет два метода: Create и DrawCell.
  2. Метод Create: Этот метод переопределяется для установки свойства DefaultDrawing в False, что позволяет компоненте использовать свой собственный механизм рисования.
  3. Метод DrawCell: Это наиболее интересная часть кода. Он принимает четыре параметра:
    • ACol и ARow: индексы столбца и строки ячейки, которая рисуется.
    • ARect: прямоугольник, представляющий область, в которой текст должен быть нарисован.
    • AState: множество флагов, указывающих состояние грида (например, является ли он фиксированным или плавующим).
  4. В методе DrawCell есть несколько ключевых шагов:
    • Он инициализирует шрифт для рисования.
    • Он проверяет, находится ли ячейка в фиксированном или плавующем состоянии, и устанавливает цвета кисти и пера соответственно.
    • Он рисует прямоугольник фона ячейки.
    • Он перебирает каждый слово содержимого ячейки, обернув текст, если необходимо.

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

  1. Код использует много переменных с похожими именами (например, CurX, CurY, SpacePos). Могло бы быть полезно использовать более описательные имена переменных.
  2. Нет обработки ошибок или валидации входных параметров. Например, что происходит, если передается пустая строка как содержимое ячейки?
  3. Код не обрабатывает случаи, когда текст превышает границы грида.

Вот несколько предложений:

  1. Рассмотрите возможность добавления более настроек пользователю, таких как возможность задать ширину обертывания или указать, где обернуть текст.
  2. Могло бы быть полезно добавить визуальные индикаторы (например, полосу прокрутки) при обертывании текста за границы грида.
  3. Если вы планируете выпустить эту компоненту на рынок, рассмотрите возможность предоставления документации и примеров для помощи пользователям в использовании.

В целом, это-solid реализация пользовательской компоненты с возможностью обертывания текста. С несколькими минорными улучшениями и дополнениями она может стать еще более полезной инструментом для разработчиков, работающих с Delphi!

Компонент TWrapGrid, позволяющий переносить текст в 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 12:01:19/0.0064220428466797/1