Есть ли способ вызвать StringGrid OnCellDraw во время выполнения - PullRequest
1 голос
/ 09 июля 2020

У меня есть программа, которая отслеживает забронированные дни в году. Чтобы отобразить это, у меня есть StringGrid, в котором я использую цвета для отображения забронированных дней. Забронированные дни хранятся в ar2Booking, который представляет собой двумерный массив, содержащий дни и месяцы соответственно.

procedure TfrmClient.stgYearPlan1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  k, iMonth, iDay : Integer;
begin
for k := 1 to 31 do
  stgYearPlan1.Cells[k,0] := IntToStr(k);

for k := 1 to 12 do
  stgYearPlan1.Cells[0,k] := ShortMonthNames[k];

for iDay := 1 to 31 do
 for iMonth := 1 to 12 do
 begin
      if ar2Booking[iDay,iMonth] = 'Y' then
      begin
        if (ACol = iDay) and (ARow = iMonth) then
        begin
          stgYearPlan1.Canvas.Brush.Color := clBlack;
          stgYearPlan1.Canvas.FillRect(Rect);
          stgYearPlan1.Canvas.TextOut(Rect.Left,Rect.Top,stgYearPlan1.Cells[ACol, ARow]);
        end;
      end;

      if ar2Booking[iDay,iMonth] = 'D' then
      begin
        if (ACol = iDay) and (ARow = iMonth) then
        begin
          stgYearPlan1.Canvas.Brush.Color := clSilver;
          stgYearPlan1.Canvas.FillRect(Rect);
          stgYearPlan1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,stgYearPlan1.Cells[ACol, ARow]);
        end;
      end;
 end;
end;

Затем я хочу нажать кнопку во время выполнения, которая позволяет пользователю забронировать дату. Затем я хотел бы, чтобы выбранная ими дата отражалась в StringGrid. Если я обновлю массив, как я смогу снова запустить OnCellDraw, чтобы отразить новые забронированные даты?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2020

После того, как друг показал мне, я обнаружил, что процедура StringGrid.Redraw выполняет то, что мне нужно. Всем спасибо

1 голос
/ 09 июля 2020

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

// -- add to the type section 
type
  TStringGridCracker = class(TStringGrid);

procedure TForm1.Button1Click(Sender: TObject);
begin
   TStringGridCracker(StringGrid1).InvalidateCell(1,2);
end;
...