You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi使用TColorDialog未选色关闭时自动保存黑色问题求助

问题根源

你当前代码存在两个明显逻辑问题,共同导致了你遇到的异常:

  1. 没有判断TColorDialog.Execute()的返回值:当用户点击颜色选择框的取消/关闭按钮时,Execute方法会返回False,此时ColorDialog1.Color的默认值为0(对应黑色clBlack),你没有做判断直接把这个值写入了配置文件。
  2. 资源访问逻辑错误:你在finally块中已经调用了ini.Free释放了配置对象,后续还调用Ini.ReadInteger读取已释放的对象,属于野指针访问,轻则读取到异常值,重则直接触发程序崩溃。
修复方案

仅当用户确认选择颜色后,再执行写配置、更新背景色的逻辑,同时优化资源管理和取值逻辑,修复后代码如下:

procedure TEinstellungenF.BtnBackgroundClick(Sender: TObject);
var 
  filename: String;
  ini: TIniFile;
  selectedColor: TColor;
begin
  // 用户取消选色直接退出,不执行后续逻辑
  if not ColorDialog1.Execute then Exit;
  
  selectedColor := ColorDialog1.Color;
  filename := ExtractFilePath(ParamStr(0)) + 'Einstellungen.ini';
  ini := TIniFile.Create(filename);
  try
    // 写入选中的颜色到配置
    ini.WriteInteger('Farben', 'Hintergrundfarbe', selectedColor);
    // 直接用已获取的颜色赋值,无需重复读取配置
    FrmMain.Color := selectedColor;
    Self.Color := selectedColor;
  finally
    ini.Free;
  end;
end;
优化说明
  • 取消选色后直接终止方法执行,不会再写入黑色值到配置
  • 直接复用已经拿到的颜色值更新背景,省去不必要的配置读取操作,同时彻底解决已释放对象访问的隐患
  • 仅在需要写入配置时才创建Ini对象,减少不必要的资源占用

内容的提问来源于stack exchange,提问作者Daniel1999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:48:03