有没有一种方法可以在运行时调用StringGrid OnCellDraw

我有一个程序可以跟踪一年中预定的日期。为了显示此内容,我有一个StringGrid,我使用Colors来显示预订的日期。预订的日期存储在ar2Booking中,ar2Booking是一个2D数组,分别包含日期和月份。

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,ARow]);
        end;
      end;
 end;
end;

然后,我想在运行时单击一个按钮,该按钮允许用户预订日期。然后,我希望它们选择的日期反映在StringGrid中。如果我更新数组,如何能够再次运行OnCellDraw以反映新的预订日期?

谢谢

iCMS 回答:有没有一种方法可以在运行时调用StringGrid OnCellDraw

通常,您将使控件的一部分无效,从而使它与下一个Windows绘制消息一起重绘。 TStringGrid执行此操作的方法受到保护,因此您需要使用cracker类来访问它们。

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

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

在一个朋友给我看后,我发现StringGrid.Redraw过程完成了我所需要的。谢谢大家

本文链接:https://www.f2er.com/1968543.html

大家都在问