我有一个程序可以跟踪一年中预定的日期。为了显示此内容,我有一个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,stgYearPlan1.Cells[ACol, ARow]);
end;
end;
end;
end;
然后,我想在运行时单击一个按钮,该按钮允许用户预订日期。然后,我希望它们选择的日期反映在StringGrid中。如果我更新数组,如何能够再次运行OnCellDraw以反映新的预订日期?
谢谢
答案 0 :(得分:1)
通常,您将使控件的一部分无效,从而使它与下一个Windows绘制消息一起重绘。 TStringGrid执行此操作的方法受到保护,因此您需要使用cracker类来访问它们。
// -- add to the type section
type
TStringGridCracker = class(TStringGrid);
procedure TForm1.Button1Click(Sender: TObject);
begin
TStringGridCracker(StringGrid1).InvalidateCell(1,2);
end;
答案 1 :(得分:1)
在一个朋友给我看后,我发现StringGrid.Redraw过程完成了我所需要的。谢谢大家