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

StringGrid, выделить фиксированные строки

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

Code:
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids;
 
type
TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
C, R: Integer;
begin
for C := 0 to StringGrid1.ColCount - 1 do
begin
   for R := 0 to StringGrid1.RowCount - 1 do
   begin
     if (C < StringGrid1.FixedCols) or
        (R < StringGrid1.FixedRows) then
       StringGrid1.Cells[C, R] := Format('Fixed Cell (%dx%xd)', [C, R])
     else
       StringGrid1.Cells[C, R] := Format('Cell (%dx%d)', [C, R]);
   end;
end;
end;
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
I: Integer;
begin
with StringGrid1 do
   if gdFixed in State then
   begin
     Canvas.FillRect(Rect);
     InflateRect(Rect, -2, 0);
     if (ACol = Col) or (ARow = Row) then
       Canvas.Font.Style := [fsBold]
     else
       Canvas.Font.Style := [];
     DrawText(Canvas.Handle,
       PChar(Cells[ACol, ARow]), -1, Rect,
       DT_SINGLELINE or DT_VCENTER);
   end else begin
     Rect := CellRect(ACol, 0);
     for I := 1 to FixedRows - 1 do
       with CellRect(ACol, I) do
         Inc(Rect.Bottom, Bottom - Top);
     InvalidateRect(Handle, @Rect, True);
 
     Rect := CellRect(0, ARow);
     for I := 1 to FixedCols - 1 do
       with CellRect(I, ARow) do
         Inc(Rect.Right, Right - Left);
     InvalidateRect(Handle, @Rect, True);
   end;
end;
 
end.
Взято из http://forum.sources.ru
Автор: Smike

Перевод контента на русский язык:

В этом проекте Delphi используется компонент TStringGrid, чтобы создать таблицу с фиксированными строками и столбцами. Код включает в себя два процедура:

  1. FormCreate: эта процедура вызывается при создании формы, и она инициализирует таблицу, заполняя ее ячейки текстом.
  2. StringGrid1DrawCell: эта процедура используется для настройки внешнего вида ячеек таблицы во время рисования.

Основной целью этого проекта seems to be подчеркивание фиксированных строк и столбцов в таблице.

В процедуре FormCreate код проходит по каждой ячейке таблицы и устанавливает ее текст на основе того, является ли она фиксированной строкой или столбцом. Фиксированные строки и столбцы подчеркиваются с помощью жирного шрифта и заливки фона цветом (хотя это неexplicitly показано в коде).

Процедура StringGrid1DrawCell используется для настройки внешнего вида ячеек таблицы во время рисования. Она проверяет, является ли ячейка частью фиксированной строки или столбца, и если да, то заливает фон цветом и устанавливает стиль шрифта жирным.

Однако, есть проблема с кодом: в процедуре StringGrid1DrawCell при проверке, является ли ячейка частью фиксированной строки или столбца, не используется свойство ячейки (то есть, является ли она фиксированной или нет). Вместо этого используются жесткие значения для количества фиксированных строк и столбцов. Это может привести к неправильному подчеркиванию.

Альтернативное решение:

Вместо использования жестких значений для количества фиксированных строк и столбцов, можно использовать свойства FixedRows и FixedCols компонента TStringGrid, чтобы определить, является ли ячейка частью фиксированной строки или столбца.

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

Вот обновленная версия процедуры StringGrid1DrawCell, которая использует свойства FixedRows и FixedCols:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  I: Integer;
begin
  with StringGrid1 do
    if gdFixed in State then
    begin
      Canvas.FillRect(Rect);
      InflateRect(Rect, -2, 0);

      if (ACol <= FixedCols) or (ARow <= FixedRows) then
        Canvas.Font.Style := [fsBold]
      else
        Canvas.Font.Style := [];

      DrawText(Canvas.Handle,
        PChar(Cells[ACol, ARow]), -1, Rect,
        DT_SINGLELINE or DT_VCENTER);
    end;
end;

В этой обновленной процедуре код проверяет, является ли ячейка частью фиксированной строки или столбца, сравнивая ее индекс столбца (ACol) с FixedCols и ее индекс строки (ARow) с FixedRows. Если ячейка часть фиксированной строки или столбца, то устанавливает стиль шрифта жирным. В противном случае устанавливает стиль шрифта нормальным.

В статье описывается как выделить фиксированные строки в StringGrid при помощи Delphi, используя процедуры FormCreate и StringGrid1DrawCell для форматирования ячеек и изменения внешнего вида.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 03:58:34/0.0060319900512695/0