【Delphi】实现彩色日志显示框

目录

一、前言

二、实现方法

1. 第一步

2. 第二步

3. 第三步

三、主程序代码

四、下载

1. 可执行程序

2. 程序源代码


一、前言

        在用Delphi做日常开发的时候,经常需要显示程序运行的日志,一般我们会使用TMemo,使用起来简单,方便。但是缺点也很明显,就是只能显示单色文字,字体也只能统一设置,无法实现个性颜色和字体。

        但是我们看大的一些系统,日志则非常美观、漂亮、专业。

        例如,Delphi的编译日志如下:

        那么,我们能收实现这样的日志显示框呢,当然可以,而且非常简单,无需使用任何第三方控件,使用Delphi自带的TRichEdit就可以。

二、实现方法

        通过对TRichEdit进行Helper构造,增加一个显示多颜色的命令即可。

1. 第一步

        编写一个uTRichEdit_Helper.pas单元,在该单元中增加一个Add_Color_Log方法,该方法有5个参数:

序号参数类别默认说明
1msgstring需要显示的消息字符串
2FontColorTColorclBlack(黑色)字体显示的颜色
3FontSizeByte9字体大小
4FontStyleTFontStyles[ ]字体格式
5LeftMarginByte4左边预留空格
{*******************************************************
 *  时间:2023-12-03
 *  作者:sensor wu
 *  功能:实现TRichEdit的彩色可编程 Log 功能
 *
 *  此处为 VCL,FMX不支持该控件
 *
 *  说明:
 *    msg: 需要显示的消息内容
 *    FontColor: 需要现实的颜色,默认黑色
 *    FontSize : 字体大小,默认9号字体
 *    FontStyle: 字体是否加粗、斜体等显示,默认不是
 *    LeftMargin: 左边留空格数量,默认是4
 *
 *  快捷用法:
 *  1.  RichEdit.Add_Color_log('编译成功!'#13#10, clGreen);   //显示一行绿色
 *  2.  RichEdit.Add_Color_log('编译错误:');
 *      RichEdit.Add_Color_log('23行缺少逗号...'#13#10,clRed);  //显示一行:编译错误: 23行缺少逗号...  前面黑色,后面红色
 *******************************************************}
unit uTRichEdit_Helper;

interface
uses
  Vcl.Graphics,      //TColor
  Winapi.Messages,   //消息常量,例如:EM_SCROLLCARET ,为了减少空间,可以不引该单元,直接使用数字解开
  Winapi.Windows,    //消息常量,例如:SB_ENDSCROLL
  Vcl.ComCtrls;

type
  TRichEditHelper = class helper for TRichEdit
     public
       procedure Add_Color_log(msg: string; FontColor : TColor = clBlack; FontSize : Byte = 9; FontStyle : TFontStyles = []; LeftMargin: Byte = 4);

  end;

implementation



{ TRichEditHelper }

procedure TRichEditHelper.Add_Color_log(msg: string; FontColor: TColor;
  FontSize: Byte; FontStyle: TFontStyles; LeftMargin: Byte);
begin
  //此处省略了实现代码
end;

end.

2. 第二步

        在主程序中引用该单元:

implementation

uses
  uTRichEdit_Helper;

3. 第三步

        使用:

  RichEdit1.Add_Color_log(#13#10);
  RichEdit1.Add_Color_log('Checking project dependencies...'#13#10,clBlack,9,[fsBold]);
  RichEdit1.Add_Color_log('Compiling RichEdit_Helper_Demo.dproj (Debug,Win32)'#13#10,clBlack,9,[fsBold]);
  RichEdit1.Add_Color_log('brcc32 command line for "RicheEdit_Helper_Demo.vrc"'#13#10,clBlack);
  RichEdit1.Add_Color_log('dcc32 command line for "RicheEdit_Helper_Demo.dpr"'#13#10,clBlack);
  RichEdit1.Add_Color_log('Success'#13#10,clGreen,9,[fsBold]);
  RichEdit1.Add_Color_log('Elapsed time: 00:00:01.2'#13#10);

三、主程序代码

unit uMainForm_RichEdit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdUDPServer, IdGlobal, IdSocketHandle,
  Vcl.ExtCtrls, IdUDPClient, System.ImageList, Vcl.ImgList,
  Vcl.VirtualImageList, Vcl.BaseImageCollection, Vcl.ImageCollection,
  IdBaseComponent, IdComponent, IdUDPBase, Vcl.Menus, Vcl.ExtActns,
  System.Actions, Vcl.ActnList, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.VirtualImage,
  Vcl.Buttons;

type
  TForm_RichEdit = class(TForm)
    Panel_Command: TPanel;
    SpeedButton6: TSpeedButton;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton10: TSpeedButton;
    VirtualImage1: TVirtualImage;
    Panel_Client: TPanel;
    Panel_LeftCommand: TPanel;
    SpeedButton4: TSpeedButton;
    RichEdit1: TRichEdit;
    ActionList1: TActionList;
    Action_Start: TAction;
    Action_Stop: TAction;
    Action_RegService: TAction;
    Action_UnRegService: TAction;
    Action_SetParams: TAction;
    SendMail1: TSendMail;
    ImageCollection1: TImageCollection;
    VirtualImageList1: TVirtualImageList;
    procedure SpeedButton4Click(Sender: TObject);
    procedure Action_StartExecute(Sender: TObject);
    procedure Action_SetParamsExecute(Sender: TObject);
    procedure Action_StopExecute(Sender: TObject);
    procedure Action_RegServiceExecute(Sender: TObject);
    procedure Action_UnRegServiceExecute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_RichEdit: TForm_RichEdit;

implementation

uses
  uTRichEdit_Helper;

{$R *.dfm}

procedure TForm_RichEdit.Action_RegServiceExecute(Sender: TObject);
begin
  RichEdit1.Add_Color_log('Web服务端口号: ');
  RichEdit1.Add_Color_log('8080'#13#10,clBlue,9,[]);
end;

procedure TForm_RichEdit.Action_SetParamsExecute(Sender: TObject);
begin
  RichEdit1.Add_Color_log(#13#10);
  RichEdit1.Add_Color_log('Checking project dependencies...'#13#10,clBlack,9,[fsBold]);
  RichEdit1.Add_Color_log('Compiling RichEdit_Helper_Demo.dproj (Debug,Win32)'#13#10,clBlack,9,[fsBold]);
  RichEdit1.Add_Color_log('brcc32 command line for "RicheEdit_Helper_Demo.vrc"'#13#10,clBlack);
  RichEdit1.Add_Color_log('dcc32 command line for "RicheEdit_Helper_Demo.dpr"'#13#10,clBlack);
  RichEdit1.Add_Color_log('Success'#13#10,clGreen,9,[fsBold]);
  RichEdit1.Add_Color_log('Elapsed time: 00:00:01.2'#13#10);
end;

procedure TForm_RichEdit.Action_StartExecute(Sender: TObject);
begin
  RichEdit1.Add_Color_log('服务已经成功启动 (绿色)'#13#10,clGreen,9,[]);
end;

procedure TForm_RichEdit.Action_StopExecute(Sender: TObject);
begin
  RichEdit1.Add_Color_log('服务已经成功停止 (红色)'#13#10,clRed,9,[]);
end;

procedure TForm_RichEdit.Action_UnRegServiceExecute(Sender: TObject);
begin
    RichEdit1.Add_Color_log('UDP在这个端口');
    RichEdit1.Add_Color_log('8192',clGreen,9,[fsBold,fsItalic]);
    RichEdit1.Add_Color_log('收到数据');
    RichEdit1.Add_Color_log('(' + FormatDateTime('YYYY-MM-DD hh:mm:ss',Now) +')'#13#10,clGray,9,[]);
end;

procedure TForm_RichEdit.SpeedButton4Click(Sender: TObject);
begin
  RichEdit1.Clear;
end;

end.

四、下载

1. 可执行程序

        下载(EXE)程序

2. 程序源代码

        下载(源程序:¥14.9)

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据关键词写作文章的软件,根据标题写作文章的工具

在当今信息化时代,人工智能技术的飞速发展,智能AI写作工具逐渐成为文案创作者的得力助手。这些工具不仅能够根据标题迅速生成文章,而且在提高创作效率的同时,也为我们节省了大量时间和精力。 人工智能的基本原理:人工智…

Python遥感开发之快速判断TIF数据为空

Python遥感开发之快速判断TIF数据为空 前言:介绍一下如何使用python下的gdal读取tif数据的时候,快速判断该tif数据是否为空,如果为空的话就把当前的tif删掉。 如图所示,通过arcgis查看箭头指向的为空值。 仅通过文件的大小无法判…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中,可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面,记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

【Leetcode题单】(01 数组篇)刷题关键点总结01【数组的遍历】

【Leetcode题单】(01 数组篇)刷题关键点总结01【数组的遍历】(4题) Easy数组的遍历485. 最大连续 1 的个数 Easy495. 提莫攻击 Easy414. 第三大的数 Easy628. 三个数的最大乘积 Easy 大家好,这里是新开的LeetCode刷题系…

【数组和函数实战: 斗地主游戏】

目录 1. 玩法说明 2. 分析和设计 3. 代码实现 4. 游戏演示1. 玩法说明 一副54张牌,3最小,两个王最大,其实是2,和上面一样从大到小排列 2. 分析和设计 2.1 分析和设计 常量和变量设计 一副牌有54张,有牌的数值和花色,可以分别用两个数组来存储,card为卡牌表示的数值,color为…

Git 标签管理

前言 标签 tag,就相当于对 某一次的 commit 做一个标识,起了一个别名,例如:在某个项目发布版本的时候,可针对最后一次 commit 起一个别名 v1.0 来标识这一次的commit。tag 的作用:commit id 相对于 tag 是很…

openwrt上开启syslog打印方法

最近在openwrt上调试蓝牙时,出现问题,设备上的蓝牙适配器已经正常工作了,执行pair命令后,openwrt和待连接的设备上都出现了配对码,两边都同意,但连接失败 尝试分析log,发现在如下代码处打印了错…

代码随想录算法训练营 ---第五十二天

第一题: 简介: 动态规划五部曲: 1.确定 dp数组下标的定义 dp[i] 到达 i 时 最长递增子序列的长度 2.确定递推公式 我们确定当前的最大长度需要遍历前面所有的最大长度,然后如果序列最后一个值小于nums[i]那就dp[j] 1&#xf…

Redis--13--缓存一致性问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 缓存一致性问题1、先更新缓存,再更新DB方案二:先更新DB,再更新缓存方案三:先删缓存,再写数据库推荐1&…

Elk-filebeat

前言 Elk:filebeat搜集日志工具和logstash相同 Filebeat是一个轻量级的日志收集工具,所使用的资源比logstash部署和启动时使用的资源更小 Filebeat可以运行在非Java环境,他可以代理logstash在非Java环境上收集日志 Filebeat无法实现数据的…

【选择题】校招笔试选择题第一辑

题目 以下程序的运行结果是&#xff08; &#xff09; #include <stdio.h> int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0; }A. computer , puter B. computer , com C. computer , computer D. computer…

zookeeper+kafka+ELK+filebeat集群

目录 一、zookeeper概述&#xff1a; 1、zookeeper工作机制&#xff1a; 2、zookeeper主要作用&#xff1a; 3、zookeeper特性&#xff1a; 4、zookeeper的应用场景&#xff1a; 5、领导者和追随者&#xff1a;zookeeper的选举机制 二、zookeeper安装部署&#xff1a; 三…

STM32-SPI 中断

SPI协议 1.1 SPI总线介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xff0c;在时钟…

【Leetcode题单】(01 数组篇)刷题关键点总结02【统计数组中的元素】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结02【统计数组中的元素】&#xff08;6题&#xff09; 统计数组中的元素645. 错误的集合 Easy697. 数组的度 Easy448. 找到所有数组中消失的数字 Easy442. 数组中重复的数据 Medium41. 缺失的第一个正数 Hard27…

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…

找不到msvcp110.dll如何修复?分享5个亲测有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。那么&#xff0c;msvcp110.dll到底是什么呢&#xff1f;它又有什么作用&#xff1…

算法通关村第七关—理解二叉树的遍历(白银)

深入理解前中后序遍历 给定一棵二叉树 二叉树前序遍历 public void preorder(TreeNode root,List<Integer>res){if&#xff08;rootnull){return;}res.add(root.val);preorder(root.left,res);preorder(root.right,res); }递归的过程如下图所示 从图中可以看到&#x…

〖大前端 - 基础入门三大核心之JS篇㊺〗- 定时器和延时器

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

12月1号作业

实现运算符重载 #include <iostream>using namespace std; class Person{friend const Person operator-(const Person &L,const Person &R);friend bool operator<(const Person &L,const Person &R);friend Person operator-(Person &L,const …

第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间

文章目录 第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间指定被视为Global元素的对象的命名空间指定映射为元素的属性的命名空间案例1&#xff1a;属性被视为本地元素案例2:属性被视为Global元素 第二十二章 指定元素和属性的命名空间 - 指定被视…