TCategoryPanelGroup 提供完整的顏色自訂屬性,涵蓋群組層級與面板層級,支援漸層、摺疊箭號、背景色、字型色等多維度視覺控制。

| 屬性 | 所屬元件 | 影響範圍 | 預設行為 |
|---|---|---|---|
GradientBaseColor | Group | 標題列漸層起始色 (hsGradient 模式) | clBtnFace |
GradientColor | Group | 標題列漸層結束色 | clBtnShadow |
ChevronColor | Group | 摺疊箭號 (Chevron) 正常狀態顏色 | clWindowText |
ChevronHotColor | Group | 滑鼠懸停時箭號顏色 | clHighlight |
Color | Group | 群組背景色 (含邊框、捲軸區) | clBtnFace |
Color | Panel | 單一面板內容區背景色 | clWindow |
HeaderFont.Color | Group | 標題文字顏色 | clWindowText |
uses ExtCtrls, StdCtrls, ColorGrd;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 初始化面板
CategoryPanel1.Height := ClientHeight div 2;
CategoryPanel2.Height := CategoryPanel1.Height;
CategoryPanel3.Height := CategoryPanel1.Height;
CategoryPanel1.Caption := 'CPanel1';
CategoryPanel2.Caption := 'CPanel2';
CategoryPanel3.Caption := 'CPanel3';
// RadioGroup 列出所有可調整顏色屬性
RadioGroup1.Caption := 'Color';
with RadioGroup1.Items do
begin
Add('CategoryPanelGroup1.ChevronColor');
Add('CategoryPanelGroup1.ChevronHotColor');
Add('CategoryPanelGroup1.GradientBaseColor');
Add('CategoryPanelGroup1.GradientColor');
Add('CategoryPanelGroup1.Color');
Add('CategoryPanel1.Color');
Add('CategoryPanel2.Color');
Add('CategoryPanel3.Color');
Add('CategoryPanelGroup1.HeaderFont.Color');
end;
RadioGroup1.ItemIndex := 0;
// ColorGrid 設定
ColorGrid1.Align := alRight;
ColorGrid1.Width := 48;
ColorGrid1.GridOrdering := go2x8; // 2欄 x 8列 顯示 16 色
end;
procedure TForm1.ColorGrid1Change(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: CategoryPanelGroup1.ChevronColor := ColorGrid1.ForegroundColor;
1: CategoryPanelGroup1.ChevronHotColor := ColorGrid1.ForegroundColor;
2: CategoryPanelGroup1.GradientBaseColor := ColorGrid1.ForegroundColor;
3: CategoryPanelGroup1.GradientColor := ColorGrid1.ForegroundColor;
4: CategoryPanelGroup1.Color := ColorGrid1.ForegroundColor;
5: begin
CategoryPanel1.Color := ColorGrid1.ForegroundColor;
CategoryPanelGroup1.Realign; // 面板顏色變更需強制重繪
end;
6: begin
CategoryPanel2.Color := ColorGrid1.ForegroundColor;
CategoryPanelGroup1.Realign;
end;
7: begin
CategoryPanel3.Color := ColorGrid1.ForegroundColor;
CategoryPanelGroup1.Realign;
end;
8: begin
CategoryPanelGroup1.HeaderFont.Color := ColorGrid1.ForegroundColor;
CategoryPanelGroup1.HeaderFont := CategoryPanelGroup1.HeaderFont; // 觸發字型重繪
end;
end;
end;
TCategoryPanelGroup (群組容器)
├── Color (群組背景)
├── HeaderStyle = hsGradient
│ ├── GradientBaseColor (標題漸層起始)
│ └── GradientColor (標題漸層結束)
├── ChevronColor (箭號正常色)
├── ChevronHotColor (箭號懸停色)
├── HeaderFont.Color (標題文字色)
└── TCategoryPanel (面板項目)
├── Caption (標題文字)
├── Collapsed (摺疊狀態)
├── Color (面板內容區背景)
└── 子控制項...
procedure ApplyProfessionalGradient(Group: TCategoryPanelGroup; Scheme: Integer);
begin
Group.HeaderStyle := hsGradient;
case Scheme of
0: begin // 深藍專業風
Group.GradientBaseColor := $004A2E1A; // 深棕藍
Group.GradientColor := $002D1A0D; // 更深
Group.HeaderFont.Color := clWhite;
Group.ChevronColor := clWhite;
Group.ChevronHotColor := clYellow;
end;
1: begin // 綠色生態風
Group.GradientBaseColor := $002E6B2E;
Group.GradientColor := $001A451A;
Group.HeaderFont.Color := clWhite;
Group.ChevronColor := clLime;
Group.ChevronHotColor := clYellow;
end;
2: begin // 紅色警示風
Group.GradientBaseColor := $001A1ACC;
Group.GradientColor := $000D0D8B;
Group.HeaderFont.Color := clWhite;
Group.ChevronColor := clYellow;
Group.ChevronHotColor := clRed;
end;
end;
Group.GradientDirection := gdVertical;
end;
procedure TForm1.ApplyThemeAwareColors;
begin
CategoryPanelGroup1.HeaderStyle := hsThemed;
// hsThemed 模式下 GradientColor/BaseColor/ChevronColor 會被忽略
// 僅 HeaderFont.Color 和 Panel.Color 生效
CategoryPanelGroup1.HeaderFont.Color := clWindowText; // 跟隨系統
CategoryPanel1.Color := clWindow;
CategoryPanel2.Color := clWindow;
CategoryPanel3.Color := clWindow;
end;
procedure TForm1.ToggleHighContrast(Enabled: Boolean);
var
panels: array of TCategoryPanel;
i: Integer;
begin
if Enabled then
begin
CategoryPanelGroup1.HeaderStyle := hsGradient;
CategoryPanelGroup1.GradientBaseColor := clBlack;
CategoryPanelGroup1.GradientColor := clBlack;
CategoryPanelGroup1.HeaderFont.Color := clYellow;
CategoryPanelGroup1.ChevronColor := clYellow;
CategoryPanelGroup1.ChevronHotColor := clWhite;
CategoryPanelGroup1.Color := clBlack;
for i := 0 to CategoryPanelGroup1.Panels.Count - 1 do
CategoryPanelGroup1.Panels[i].Color := clBlack;
end
else
ApplyProfessionalGradient(CategoryPanelGroup1, 0); // 恢復預設
end;
| 問題 | 原因 | 解決 |
|---|---|---|
| 設定 Panel.Color 後不生效 | 未觸發重繪 | 呼叫 CategoryPanelGroup1.Realign 或 Panel.Invalidate |
| HeaderFont.Color 設定無效 | 字型物件未重新指派 | HeaderFont := HeaderFont 強制更新 |
| hsThemed 模式下漸層色不生效 | 主題模式忽略漸層屬性 | 改用 hsGradient 或接受系統主題渲染 |
| ChevronHotColor 不顯示 | 滑鼠未進入標題區或主題模式 | 確認 HeaderStyle=hsGradient 且滑鼠正確懸停 |
uses IniFiles;
procedure SaveColorPreferences(Group: TCategoryPanelGroup; Ini: TIniFile);
begin
Ini.WriteInteger('Colors', 'GradientBase', Group.GradientBaseColor);
Ini.WriteInteger('Colors', 'GradientEnd', Group.GradientColor);
Ini.WriteInteger('Colors', 'Chevron', Group.ChevronColor);
Ini.WriteInteger('Colors', 'ChevronHot', Group.ChevronHotColor);
Ini.WriteInteger('Colors', 'GroupBG', Group.Color);
Ini.WriteInteger('Colors', 'HeaderFont', Group.HeaderFont.Color);
// 面板顏色可逐一儲存
end;
procedure LoadColorPreferences(Group: TCategoryPanelGroup; Ini: TIniFile);
begin
Group.GradientBaseColor := Ini.ReadInteger('Colors', 'GradientBase', clBtnFace);
Group.GradientColor := Ini.ReadInteger('Colors', 'GradientEnd', clBtnShadow);
Group.ChevronColor := Ini.ReadInteger('Colors', 'Chevron', clWindowText);
Group.ChevronHotColor := Ini.ReadInteger('Colors', 'ChevronHot', clHighlight);
Group.Color := Ini.ReadInteger('Colors', 'GroupBG', clBtnFace);
Group.HeaderFont.Color := Ini.ReadInteger('Colors', 'HeaderFont', clWindowText);
Group.HeaderFont := Group.HeaderFont; // 觸發套用
end;
TCategoryPanelGroup 的顏色層級架構清晰:群組層級控制標題列漸層、箭號、字型、整體背景;面板層級控制各自內容區背景。善用 ColorGrid 互動選色、Realign 強制重繪、主題感應切換、偏好持久化,即能打造專業、可個性化的摺疊面板視覺體驗。