Delphi 如何更改 TCalendar 组件中的单元格颜色?
How to change cell color in a TCalendar Component in Delphi?
我需要在 TCalendar
应用程序的 TCalendar
组件中更改某些单元格的颜色,该应用程序将在 Android 和 iOS 上运行。我正在使用 Delphi Seattle 10。有什么办法吗?
这在 Delphi XE5 下有效。不幸的是,我没有 Delphi 10 来检查代码。
type
TMyCalendar = class(TCalendar)
private
FSelectedDays: set of byte;
procedure ApplyStyle; override;
end;
...
{ TMyCalendar }
procedure TMyCalendar.ApplyStyle;
var
i: word;
LB: TListBox;
begin
inherited;
if FSelectedDays <> [] then
begin
LB := TListBox(TStyleObject(Children.Items[0]).Children.Items
[TStyleObject(Children.Items[0]).Children.Count - 1]);
for i := 0 to LB.Count - 1 do
if (Assigned(LB.ItemByIndex(i))) and
(StrToInt(LB.ItemByIndex(i).Text) in FSelectedDays) then
begin
LB.ItemByIndex(i).StyledSettings := LB.ItemByIndex(i).StyledSettings -
[TStyledSetting.ssStyle];
LB.ItemByIndex(i).Font.Style := LB.ItemByIndex(i).Font.Style +
[TFontStyle.fsBold];
With TRectangle.Create(LB.ItemByIndex(i)) do
begin
Parent := LB.ItemByIndex(i);
Align := TAlignLayout.alClient;
Fill.Color := TAlphaColorRec.Red;
Opacity := 0.5;
end;
end;
end;
end;
然后创建 TMyCalendar 实例 class:
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
MyCalendar: TMyCalendar;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyCalendar := TMyCalendar.Create(Self);
MyCalendar.Parent := Self;
MyCalendar.Position.X := 1;
MyCalendar.Position.Y := 1;
MyCalendar.FSelectedDays := [9, 11]; // <-set other days here and check the month
end;
附加
还有另一种方法可以访问表示月份日期列表的私有变量 FDays。你声明一个 class helper
在 属性 Days
:
中暴露它
TMyCalendarHelper = class helper for TCalendar
function GetDays: TListBox;
procedure SetDays(const Value: TListBox);
property Days: TListBox read GetDays write SetDays;
end;
...
{ TMyCalendarHelper }
function TMyCalendarHelper.GetDays: TListBox;
begin
result := Self.FDays;
end;
procedure TMyCalendarHelper.SetDays(const Value: TListBox);
begin
Self.FDays := Value;
end;
然后在 calss 后代中,您可以使用 Days
属性.
控制此 ListBox 及其项目
procedure TMyCalendar.ApplyStyle;
var
i: word;
// LB: TListBox;//<-you do not need it any more
begin
inherited;
if FSelectedDays <> [] then
begin
// LB := TListBox(TStyleObject(Children.Items[0]).Children.Items//<-you do not need it
// [TStyleObject(Children.Items[0]).Children.Count - 1]);//<-you do not need it
for i := 0 to Days.Count - 1 do
if (Assigned(Days.ItemByIndex(i))) and
(StrToInt(Days.ItemByIndex(i).Text) in FSelectedDays) then
begin
Days.ItemByIndex(i).StyledSettings := Days.ItemByIndex(i).StyledSettings -
[TStyledSetting.ssStyle];
Days.ItemByIndex(i).Font.Style := Days.ItemByIndex(i).Font.Style +
[TFontStyle.fsBold];
//Do other things you want with Days.ItemByIndex(i)
附加 2
可以更正日期的绘制方式。
TMyCalendar = class(TCalendar)
private
FSelectedDays: set of byte;
procedure PaintChildren; override;
end;
procedure TMyCalendar.PaintChildren;
var
i: word;
TMPC: TAlphaColor;
R: TRectF;
begin
inherited;
if FSelectedDays <> [] then
begin
for i := 0 to Days.Count - 1 do
if (Assigned(Days.ItemByIndex(i))) and
(StrToInt(Days.ItemByIndex(i).Text) in FSelectedDays) then
begin
TMPC := Days.ItemByIndex(i).Canvas.Fill.Color;
R := Days.ItemByIndex(i).AbsoluteRect;
R.Inflate(Position.X, Position.Y, -Position.X, -Position.Y);
Days.ItemByIndex(i).Canvas.BeginScene;
Days.ItemByIndex(i).Canvas.Fill.Color := TAlphaColorRec.Red;
Days.ItemByIndex(i).Canvas.FillRect(R, 0, 0, [], 0.5);
Days.ItemByIndex(i).Canvas.EndScene;
Days.ItemByIndex(i).Canvas.Fill.Color := TMPC;
end;
end;
end;
我需要在 TCalendar
应用程序的 TCalendar
组件中更改某些单元格的颜色,该应用程序将在 Android 和 iOS 上运行。我正在使用 Delphi Seattle 10。有什么办法吗?
这在 Delphi XE5 下有效。不幸的是,我没有 Delphi 10 来检查代码。
type
TMyCalendar = class(TCalendar)
private
FSelectedDays: set of byte;
procedure ApplyStyle; override;
end;
...
{ TMyCalendar }
procedure TMyCalendar.ApplyStyle;
var
i: word;
LB: TListBox;
begin
inherited;
if FSelectedDays <> [] then
begin
LB := TListBox(TStyleObject(Children.Items[0]).Children.Items
[TStyleObject(Children.Items[0]).Children.Count - 1]);
for i := 0 to LB.Count - 1 do
if (Assigned(LB.ItemByIndex(i))) and
(StrToInt(LB.ItemByIndex(i).Text) in FSelectedDays) then
begin
LB.ItemByIndex(i).StyledSettings := LB.ItemByIndex(i).StyledSettings -
[TStyledSetting.ssStyle];
LB.ItemByIndex(i).Font.Style := LB.ItemByIndex(i).Font.Style +
[TFontStyle.fsBold];
With TRectangle.Create(LB.ItemByIndex(i)) do
begin
Parent := LB.ItemByIndex(i);
Align := TAlignLayout.alClient;
Fill.Color := TAlphaColorRec.Red;
Opacity := 0.5;
end;
end;
end;
end;
然后创建 TMyCalendar 实例 class:
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
MyCalendar: TMyCalendar;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyCalendar := TMyCalendar.Create(Self);
MyCalendar.Parent := Self;
MyCalendar.Position.X := 1;
MyCalendar.Position.Y := 1;
MyCalendar.FSelectedDays := [9, 11]; // <-set other days here and check the month
end;
附加
还有另一种方法可以访问表示月份日期列表的私有变量 FDays。你声明一个 class helper
在 属性 Days
:
TMyCalendarHelper = class helper for TCalendar
function GetDays: TListBox;
procedure SetDays(const Value: TListBox);
property Days: TListBox read GetDays write SetDays;
end;
...
{ TMyCalendarHelper }
function TMyCalendarHelper.GetDays: TListBox;
begin
result := Self.FDays;
end;
procedure TMyCalendarHelper.SetDays(const Value: TListBox);
begin
Self.FDays := Value;
end;
然后在 calss 后代中,您可以使用 Days
属性.
procedure TMyCalendar.ApplyStyle;
var
i: word;
// LB: TListBox;//<-you do not need it any more
begin
inherited;
if FSelectedDays <> [] then
begin
// LB := TListBox(TStyleObject(Children.Items[0]).Children.Items//<-you do not need it
// [TStyleObject(Children.Items[0]).Children.Count - 1]);//<-you do not need it
for i := 0 to Days.Count - 1 do
if (Assigned(Days.ItemByIndex(i))) and
(StrToInt(Days.ItemByIndex(i).Text) in FSelectedDays) then
begin
Days.ItemByIndex(i).StyledSettings := Days.ItemByIndex(i).StyledSettings -
[TStyledSetting.ssStyle];
Days.ItemByIndex(i).Font.Style := Days.ItemByIndex(i).Font.Style +
[TFontStyle.fsBold];
//Do other things you want with Days.ItemByIndex(i)
附加 2 可以更正日期的绘制方式。
TMyCalendar = class(TCalendar)
private
FSelectedDays: set of byte;
procedure PaintChildren; override;
end;
procedure TMyCalendar.PaintChildren;
var
i: word;
TMPC: TAlphaColor;
R: TRectF;
begin
inherited;
if FSelectedDays <> [] then
begin
for i := 0 to Days.Count - 1 do
if (Assigned(Days.ItemByIndex(i))) and
(StrToInt(Days.ItemByIndex(i).Text) in FSelectedDays) then
begin
TMPC := Days.ItemByIndex(i).Canvas.Fill.Color;
R := Days.ItemByIndex(i).AbsoluteRect;
R.Inflate(Position.X, Position.Y, -Position.X, -Position.Y);
Days.ItemByIndex(i).Canvas.BeginScene;
Days.ItemByIndex(i).Canvas.Fill.Color := TAlphaColorRec.Red;
Days.ItemByIndex(i).Canvas.FillRect(R, 0, 0, [], 0.5);
Days.ItemByIndex(i).Canvas.EndScene;
Days.ItemByIndex(i).Canvas.Fill.Color := TMPC;
end;
end;
end;