有没有办法突出显示日历中的单元格?

2023-12-05

我知道有一种方法可以突出显示单元格TStringGrid。我可以使用它,但是输入日期、日期和月份将是一个大问题,除非您知道如何做到这一点。


是的,如果您只对控件的源代码进行少量修改,这很容易。具体来说,我们需要在其上添加少量代码DrawCell method.

最初,这是

procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
  TheText: string;
begin
  TheText := CellText[ACol, ARow];
  with ARect, Canvas do
    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);
end;

将其更改为:

procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
  TheText: string;
  i: Integer;
  Day: Integer;
begin
  TheText := CellText[ACol, ARow];
  with ARect, Canvas do
  begin
    Font.Style := [];
    for i := Low(HighlightDates) to High(HighlightDates) do
      if TryStrToInt(TheText, Day) then
        if SameDate(HighlightDates[i], EncodeDate(Year, Month, Day)) then
        begin
          Font.Style := [fsBold];
          Break;
        end;
    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);
  end;
end;

快速尝试此操作的最简单方法是使用插入器类:

type
  TCalendar = class(Vcl.Samples.Calendar.TCalendar)
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  end;

  TForm1 = class(TForm)
    ...

现在您只需提供一组日期即可突出显示:

var
  HighlightDates: TArray<TDate>;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(HighlightDates, 3);
  HighlightDates[0] := EncodeDate(2020, 07, 10);
  HighlightDates[1] := EncodeDate(2020, 07, 20);
  HighlightDates[2] := EncodeDate(2020, 08, 10);
end;

或者,在新的 Delphi 版本(XE7 及更高版本)中,

procedure TForm1.FormCreate(Sender: TObject);
begin
  HighlightDates :=
    [
      EncodeDate(2020, 07, 10),
      EncodeDate(2020, 07, 20),
      EncodeDate(2020, 08, 10)
    ];
end;

不要忘记添加DateUtils to the uses clause.

Screenshot of a TCalendar control with two dates selected: 2020-07-10 and 2020-07-20.

(我为瑞典的节日名称表示歉意。)

不用说,您可以按照您喜欢的任何方式绘制突出显示的单元格;使字体加粗只是一种可能性。如果您想通过在右上角画一个苯环来突出显示一个单元格,也可以。

您将需要使用新代码创建一个新控件。在此,日期数组将是其中的一个成员。它可能具有与 setter 关联的属性,该属性也会使控件无效。此外,您还可以添加公共HighlightDate(const ADate: TDate) and StopHighlightDate(const ADate: TDate)在此数组中添加和删除日期(并使控件无效)的过程。

Update

根据要求(请参阅评论),以下是如何更改突出显示单元格的背景颜色:

{ TCalendar }

procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect;
  AState: TGridDrawState);
var
  TheText: string;
  i: Integer;
  Day: Integer;
  OldColor: TColor;
begin
  TheText := CellText[ACol, ARow];
  with ARect, Canvas do
  begin
    OldColor := Brush.Color;
    for i := Low(HighlightDates) to High(HighlightDates) do
      if TryStrToInt(TheText, Day) then
        if SameDate(HighlightDates[i], EncodeDate(Year, Month, Day)) then
        begin
          Brush.Color := clSkyBlue;
          FillRect(ARect);
          Break;
        end;
    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);
    Brush.Color := OldColor;
  end;
end;

Screenshot of calendar with cells highlighted using a different cell background colour.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法突出显示日历中的单元格? 的相关文章

  • 有用的 Delphi 代码模板

    我用 Delphi 编程已经两年多了 我大概只有 5 个自定义模板 我觉得我应该有更多 如果有人有任何特别有用的东西 那么在 stackoverflow 上有一个很好的存储库就太好了 我不在乎您使用的是 Delphi 2009 语法还是 D
  • Delphi + Synapse:如何检查我是否仍然连接

    我在用TTCPBlockSocket http synapse ararat cz doc help blcksock TTCPBlockSocket html对于 TCP IP 应用程序 问题是我无法确定连接何时丢失 GetLastErr
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • 如何处理第三方库中的警告/提示?

    我们使用 FastReport 来生成报告 事实上 我们为访问源代码付费 我们目前使用的是FastReport的最新稳定版本 虽然它对于我们的生产来说足够稳定 但每当我编译时 我都会看到以下内容 dcc32 Hint fs iinirtti
  • 如何在以管理员身份运行模式下部署应用程序?

    如何部署应用程序 使其需要管理员权限 而无需最终用户手动执行此操作 我使用 Delphi 2009 来构建该应用程序 您可以使用以下命令通知 Windows 您的应用程序需要以管理员身份运行requestedExecutionLevel应用
  • Delphi 2010 控制闪烁

    我一直在从 XP 操作系统升级或迁移我们的软件 以便能够在 Windows 7 下编译和运行 我们的软件开始出现我们在 Windows XP 下没有注意到的问题 目前 我正在处理 TForm 上闪烁的用户定义控件 它似乎时不时地闪烁 但并非
  • 使用 gmail 和 Indy 发送电子邮件

    我正在尝试使用 gmail 从 Delphi 发送电子邮件 我有 Indy 10 5 9 0 和 Delphi XE3 我从以下位置获得了示例代码 http www andrecelestino com delphi xe envio de
  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • Delphi 如何与 Active Directory 集成?

    我们需要使用 Delphi 7 验证 Microsoft Active Directory 上的用户 最好的方法是什么 我们可以有两种情况 用户输入其网络用户名和密码 其中用户名可能包括域 然后我们检查活动目录是否是有效的活动用户 或者我们
  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data

随机推荐

  • 将具有多个 from 的 linq 查询表达式转换为扩展方法语法 [重复]

    这个问题在这里已经有答案了 我无法将此代码转换为扩展方法语法 var query from c in context Customers from o in c Orders where o DateSent null select new
  • Sql Server 2008 地理 LineString 大小限制

    今天我遇到了地理类型可能的大小限制Linestrings在 Sql Server 2008 中 当我创建一个线串时STGeomFromText 包含 567 个点 其中包含长 纬度和 Z 坐标 一切正常 但是 如果我向线串再添加一个点 我会
  • 命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA

    我有一个 C 程序 它正在创建一个命名管道来写入数据 有客户反映了客户端连接命名管道但服务器端写入数据失败的情况 用ERROR NO DATA 我能找到的任何 MSDN 页面都没有真正解释此错误代码 有人对如何解决这个问题有任何想法吗 或者
  • Spring Security 更新身份验证成功后的上次登录日期

    如何在身份验证成功时触发我的方法 我想更新我的数据库列 上次登录日期 在谷歌上查了一下 但仍然不明白应该如何完成 这是我的 spring security xml
  • 在.NET中使用PEM编码的RSA私钥

    我有一个私钥 如下所示 开始 RSA 私钥 一些私钥数据 结束 RSA PRIVA 我需要在我的 C 项目中使用此密钥 但我找不到任何如何使用此格式的密钥的示例 谢谢 步骤 1 获取 一些私钥数据 content remove BEGIN
  • 验证 ADF 移动应用程序中的用户名和密码

    我正在 adf 移动应用程序中开发一个简单的登录页面 以下是现在登录 amx 页面中的一段代码
  • SQL trunc/group/order by 日期(日/月/季度/年),总和跳过日期,没有数据

    我参与了一个需要按日期构建直方图的项目 在我之前 这是通过 Java 代码对每个矩形 日期子区域 对数据库进行大量 SQL 查询来完成的 我尝试另一种方法 select sum CNT trunc DATE MM from DATA whe
  • 在 Windows 上,mkbundle 因链接器错误而失败

    我正在尝试构建一个需要在可能未安装 NET 的环境中运行的控制台实用程序 Mono 的 mkbundle 似乎是解决这个问题的一个很好的解决方案 但是当在 Windows 10 上通过 cygwin 在一个简单的项目上运行 mkbundle
  • 使用任意 QML 项目作为缓存图像源

    编辑 原来的问题仍然包含在下面 但我决定重新命名为一个表单 该表单在各种情况下对开发人员更有用 其中一些在我的回答中描述 因为原始问题的解决方案变成了提供更广泛的应用领域 我有一组应用程序的灰度图标 并且要求用户可以更改图标颜色 因此 显而
  • 在 Firebird 的服务器端使用生成器值时,如何不浪费它们?

    检查这段简单的代码 它使用生成器在 Firebird 表中创建唯一的主键 CREATE OR ALTER TRIGGER ON BEFOREINSERT PK BOOKING ITEM FOR BOOKING ITEM BEFORE INS
  • 访问隐藏在第三个扩展类中的间接超类变量

    假设我有如下代码 class A int a 1 class B extends A int a 2 class C extends B int a 3 void print it int a 4 Local variable a to t
  • .NET - 函数变量存储在地址空间的堆或堆栈上?

    我在一次考试中遇到了如下问题 当程序调用函数时 其中的数据结构类型是 为该函数中的变量分配的内存 HEAP QUEUE LIFO STACK 根据测试 HEAP是正确答案 虽然我选择了STACK 有很棒的人可以解释一下为什么吗 提前致谢 首
  • CSS - 具有等边距和固定大小块的响应式网格

    我正在尝试突破 CSS 的限制 以复制印刷中常见的网格布局 要求 块之间以及块与容器边缘之间的边距必须相等 布局必须具有响应性 并且每行上的块数必须适应窗口的大小 最后一行必须左对齐 块的宽度 高度是固定的 不使用空的非语义 HTML 元素
  • 使用 Powershell 将文件上传到 Sharepoint Online (Microsoft 365)(选项 1-使用 PnP.Powershell)

    我正在尝试将文件上传到 Sharepoint Online M365 库子文件夹中 但它不断出现错误 我尝试过很多脚本 这篇文章是关于使用 PnP Powershell 我已经发布了有关其他脚本的问题 希望有人可以帮助我解决其中任何一个问题
  • Spring 和 HTTP 选项请求

    作为对此的后续question 我想知道如何在 spring 3 mvc 应用程序中处理 OPTIONS 请求 我不想为我的 spring 代码中的每个端点编写选项处理方法 但是建议的选项处理程序到 的映射仅适用于还没有处理程序的端点 所以
  • 我可以在 Android 中设置 AlarmManager 的结束时间吗?

    我已经设置了一个AlarmManager在特定时间响起 然后每隔一段时间重复一次 是否可以告诉它在多少间隔后停止 甚至什么时候停止 这是我到目前为止所拥有的 Calendar calendar Calendar getInstance ca
  • 避免异步在方法签名中传播

    阻止我在 net 代码中不断使用异步 等待模式的原因是 一旦创建异步方法 async 关键字就会在我的代码中传播 迫使我使所有方法异步 有没有一种模式可以有效地阻止这种情况 阻止我在 net 代码中不断使用异步 等待模式的原因是 一旦创建异
  • 如何获得随机颜色而不重复?

    我想为每个门获得随机颜色 所以我有 9 个门 9 种材料和 9 种颜色 现在我希望每个门都获得随机颜色 但颜色不能重复 例如 不能2 种红色或 3 种蓝色 各一种 感谢帮助enter image description here 这是我尝试
  • 外国时间与当地时间

    我正在尝试将外国时间转换为当地时间 我正在获取日期和时间Europe London 目前我正在使用时刻时区来让我的代码正常工作 但是它给了我错误的输出 resultDate new moment 2017 06 30T22 10 00 tz
  • 有没有办法突出显示日历中的单元格?

    我知道有一种方法可以突出显示单元格TStringGrid 我可以使用它 但是输入日期 日期和月份将是一个大问题 除非您知道如何做到这一点 是的 如果您只对控件的源代码进行少量修改 这很容易 具体来说 我们需要在其上添加少量代码DrawCel