惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
Last Week in AI
Last Week in AI
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
F
Full Disclosure
博客园 - 【当耐特】
博客园 - 司徒正美
V
Visual Studio Blog
F
Fortinet All Blogs
T
Tor Project blog
T
Threatpost
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
C
Cyber Attacks, Cyber Crime and Cyber Security
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
M
MIT News - Artificial intelligence
L
Lohrmann on Cybersecurity
P
Palo Alto Networks Blog
I
Intezer
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
The Last Watchdog
The Last Watchdog
S
Securelist
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
U
Unit 42
博客园 - 叶小钗
P
Proofpoint News Feed
C
Cybersecurity and Infrastructure Security Agency CISA
H
Help Net Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
Hacker News - Newest:
Hacker News - Newest: "LLM"
NISL@THU
NISL@THU
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Project Zero
Project Zero
T
The Exploit Database - CXSecurity.com
TaoSecurity Blog
TaoSecurity Blog
A
Arctic Wolf
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
N
News | PayPal Newsroom

博客园 - 秋·风

修复aarch64 win64下lazarus不弹出SourceTabPopUpMenu fpc aarch64-win64版编译应用时遇到一个奇怪的bug 在windows 11 on arm64系统编译lazarus出错的处理方法 修复TDBMemo只读不能使用Ctrl+C复制文字的Bug freepascal打补丁后已支持windows 11 on arm64(lazarus aarch64 windows版也可以运行了) 查看libc.so.6的版本号 Lazarus移动版启动程序 fpc 3.2.2交叉编译i386-linux链接出错 lazarus鸿蒙开发13:使用鸿蒙原生API画图--lazarus侧关键代码 lazarus鸿蒙开发12:使用鸿蒙原生API画图--鸿蒙侧关键代码 lazarus鸿蒙开发11:使用鸿蒙原生接口画图 lazarus鸿蒙开发10:lazarus一键编译、打包助手 lazarus鸿蒙开发9:使用命令行编译DevEco Studio应用 lazarus鸿蒙开发8:在DevEco Studio的日志窗口显示日志信息 lazarus鸿蒙开发7:在 Windows 上为 OpenHarmony (LoongArch64) 编译 Qt 5.15.12 SDK 指南 lazarus鸿蒙开发6:鸿蒙project配置 lazarus鸿蒙开发5:编译ohos_hap_project lazarus鸿蒙开发4:编译OHOS_QT_Lazarus lazarus鸿蒙开发3:编译libLazarusOHOS_Wrapper.so lazarus鸿蒙开发2:编译鸿蒙版本Qt5pas lazarus鸿蒙开发1:编译QT 5.12.12 鸿蒙版 fpc/lazarus for x86_64/aarch64鸿蒙版(绿色版 2026.06.03更新) fastreport报表编辑器在aarch64等非x86_64 CPU第一次打开慢的解决方案 linux/windows双系统可用的打包程序 使用FPC自带的纯 Pascal 实现的 Zlib 替代品——paszlib QFLazarus使用说明 忽略lazarus console in/output窗显示的转义序列 编译fpc遇到的怪事(2026-05-20更新) 取消树莓派的系统双击桌面图标时出现弹窗的选择提示 银河麒麟v11安装lazarus的方法 【小技巧】lazarus的应用设置某个form不在任务栏显示(linux) 用lazarus封装了linux的rsync SimpleXML-for-lazarus fastreport在windows11(lazarus)报表设计时出现的问题 用lazarus编写的deb打包工具 龙芯deepin 25系统使用旧世界软件的方法 SimpleJSON for lazarus 中文转全拼音和首字母 lazarus扩展IDE宏的方法 fpc/lazarus可用的宏 Lazarus IDE宏列表 【原创控件】PopupMenu和MainMenu自绘单元 【原创控件】PopupMenu自绘 【原创控件】lazarus自定义mainmenu菜单栏(2026-02-26 增加菜单项图标尺寸参数) cudaText存在段落长度超过一定字数时会出现字符重叠的问题 lazarus编写的程序在Ubuntu任务栏/快捷栏不显示设定的图标 lazarus实现拖放文件 在uos使用lazarus调试时遇到的问题 【原创控件】lazarus IDE界面备份和恢复插件(2026-02-07增加恢复默认布局及官方已集成到lazarus) lazarus for arm32编译so链接出错
调整lazarus gtk2编辑控件背景颜色
秋·风 · 2026-03-19 · via 博客园 - 秋·风

lazarus在某些linux版本使用gtk2可能修改TEdit等控件输入框的背景颜色无效的问题,最终在lazarus官方论坛找到处理方法,并在AI的帮助下完成。现在只需在uses的最后添加UniGTKColorFix这个单元就可以。

使用UniGTKColorFix前:

image

使用UniGTKColorFix后: 

image
使用方法:
新uses最后加上UniGTKColorFix就可以。

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, DBCtrls, StdCtrls,
  ExtCtrls, MaskEdit, Spin, EditBtn
  , UniGTKColorFix
  ;

type

  { TForm1 } 

直接上UniGTKColorFix.pas代码:

unit UniGTKColorFix;

{$mode objfpc}{$H+}

interface

// 仅在 Linux GTK2 环境下生效,其他系统自动忽略,不影响跨平台编译
{$IFDEF LCLGTK2}
uses
  Classes, SysUtils, Graphics, Controls, StdCtrls, DBCtrls,ExtCtrls,MaskEdit,Spin,
  EditBtn,GroupedEdit,
  gtk2, WSProc;

// ==========================================
// 辅助函数:应用 GTK2 强制颜色样式
// ==========================================
procedure ApplyGTKColorStyle(AWidget: PGtkWidget; AColor: TColor);

// ==========================================
// 1. 增强 TEdit
// ==========================================
type
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 2. 增强 TDBEdit
// ==========================================
  TDBEdit = class(DBCtrls.TDBEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 3. 增强 TComboBox
// ==========================================
  TComboBox = class(StdCtrls.TComboBox)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 4. 增强 TDBComboBox
// ==========================================
  TDBComboBox = class(DBCtrls.TDBComboBox)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 5. 增强 TLabeledEdit
// ==========================================
  TLabeledEdit = class(ExtCtrls.TLabeledEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 6. 增强 TMaskEdit
// ==========================================
  TMaskEdit = class(MaskEdit.TMaskEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(Value: TColor); override;
  end;

// ==========================================
// 7. 增强 TSpinEdit
// ==========================================
  TSpinEdit = class(Spin.TSpinEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(AValue: TColor); override;
  end;

// ==========================================
// 8. 增强 TFloatSpinEdit
// ==========================================
  TFloatSpinEdit = class(Spin.TFloatSpinEdit)
  protected
    procedure CreateWnd; override;
    procedure SetColor(AValue: TColor); override;
  end;

// ==========================================
// 9. 增强 TEditButton
// ==========================================
TEditButton = class(EditBtn.TEditButton)
protected
  procedure CreateWnd; override;
  //改名避免冲突,添加 reintroduce 指示字
  function GetMyColor: TColor;
  procedure SetMyColor(AValue: TColor); reintroduce;
public
  property Color: TColor read GetMyColor write SetMyColor;
end;

implementation

procedure ApplyGTKColorStyle(AWidget: PGtkWidget; AColor: TColor);
var
  RCStr: String;
  R, G, B: Byte;
  StyleName: String;
  HexColor: String;
begin
  if not GTK_IS_WIDGET(AWidget) then Exit;

  // 1. 转换颜色
  RedGreenBlue(ColorToRGB(AColor), R, G, B);
  HexColor := IntToHex(R, 2) + IntToHex(G, 2) + IntToHex(B, 2);

  // 2. 生成唯一样式名 (基于控件内存地址)
  StyleName := 'forced_color_' + IntToHex(PtrUInt(AWidget), 8);

  // 3. 构建 RC 字符串:同时设置 base 和 bg,覆盖焦点和非焦点状态
  RCStr :=
    'style "' + StyleName + '" {' + LineEnding +
    '  engine "" {}' + LineEnding +                 // 禁用主题引擎
    '  bg[NORMAL]    = "#' + HexColor + '"' + LineEnding +
    '  bg[ACTIVE]    = "#' + HexColor + '"' + LineEnding +
    '  base[NORMAL]  = "#' + HexColor + '"' + LineEnding + // 关键:Edit输入框背景
    '  base[ACTIVE]  = "#' + HexColor + '"' + LineEnding + // 关键:Edit焦点背景
    '  text[NORMAL]  = "#000000"' + LineEnding +
    '  text[ACTIVE]  = "#000000"' + LineEnding +
    '}' + LineEnding +
    'widget "*.' + StyleName + '" style "' + StyleName + '"';

  // 4. 应用
  gtk_rc_parse_string(PChar(RCStr));
  gtk_widget_set_name(AWidget, PChar(StyleName));
  gtk_widget_reset_rc_styles(AWidget);
end;

// ==========================================
// TEdit 实现
// ==========================================
procedure TEdit.CreateWnd;
begin
  inherited CreateWnd;
  // 句柄创建后,应用当前 Color 属性
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TEdit.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  // 运行时修改颜色,立即应用
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TDBEdit 实现
// ==========================================
procedure TDBEdit.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TDBEdit.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TComboBox 实现
// ==========================================
procedure TComboBox.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TComboBox.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TDBComboBox 实现
// ==========================================
procedure TDBComboBox.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TDBComboBox.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TLabeledEdit 实现
// ==========================================
procedure TLabeledEdit.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TLabeledEdit.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TMaskEdit 实现
// ==========================================
procedure TMaskEdit.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TMaskEdit.SetColor(Value: TColor);
begin
  inherited SetColor(Value);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), Value);
end;

// ==========================================
// TSpinEdit 实现
// ==========================================
procedure TSpinEdit.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TSpinEdit.SetColor(AValue: Graphics.TColor);
begin
  inherited SetColor(AValue);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), AValue);
end;

// ==========================================
// TFloatSpinEdit 实现
// ==========================================
procedure TFloatSpinEdit.CreateWnd;
begin
  inherited CreateWnd;
  ApplyGTKColorStyle(PGtkWidget(Handle), Color);
end;

procedure TFloatSpinEdit.SetColor(AValue: Graphics.TColor);
begin
  inherited SetColor(AValue);
  if HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Handle), AValue);
end;

// ==========================================
// TEditButton 实现
// ==========================================
// ==========================================
// TEditButton 实现
// ==========================================
function TEditButton.GetMyColor: TColor;
begin
  // 读取父类属性
  Result := inherited Color;
end;

procedure TEditButton.SetMyColor(AValue: TColor);
begin
  // 1. 调用父类写入
  inherited Color := AValue;

  // 2. 应用 GTK 修复
  // 注意:TEditButton 是复合控件,必须对内部的 Edit 控件应用样式
  if Assigned(Edit) and Edit.HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Edit.Handle), AValue);
end;

procedure TEditButton.CreateWnd;
begin
  inherited CreateWnd;
  // 同样针对内部 Edit 控件
  if Assigned(Edit) and Edit.HandleAllocated then
    ApplyGTKColorStyle(PGtkWidget(Edit.Handle), GetMyColor);
end;

{$ENDIF} // end of LCLGTK2

end.