gpt4 book ai didi

delphi - 在状态栏中绘制图像在 XE7 版本中不起作用

转载 作者:行者123 更新时间:2023-12-03 15:54:15 24 4
gpt4 key购买 nike

我的应用程序将在初始化时在状态栏中显示一些信息。我通过在状态栏上绘制图标(打开和关闭)来显示它。以下代码在 Embarcadero XE3 中运行良好,但在 XE7 版本中不再运行。该代码不会引发任何异常或错误。我该如何解决这个问题?

procedure TFormMain.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
i: Integer;
begin
case Panel.Index of
3:
begin
i := ICON_DATABASE_OFF;
if HasDatabaseConnection() then
i := ICON_DATABASE;
ImageList1.Draw(StatusBar.Canvas, Rect.Left, Rect.Top, i);
end;
4:
begin
i := ICON_GLOBE_OFF;
if HasInternetConnection() then
i := ICON_GLOBE;
ImageList1.Draw(StatusBar.Canvas, Rect.Left, Rect.Top, i);
end;
end;
end;

在 XE3 中: enter image description here

更新
(见评论)
发生错误的原因是 FormMainOnResizeEvent

procedure TFormMain.FormResize(Sender: TObject);
begin
//StatusBar1.Panels[0].Width := FormMain.Width - 448;
StatusBar1.Panels[0].Width := ClientWidth - 448;
end;

我调试时显示的值在两个版本中都是相同的:
在XE3中:
FormMain.Width = 1400
客户端宽度 = 1024

在 XE7 中:
FormMain.Width = 1400
客户端宽度 = 1024

定义的尺寸为宽度 754 和高度 515。
由于某些未知原因,在 XE7 中未绘制图标。
如果我在打开表单后调整其大小,图标将正确显示!

我没有应用任何皮肤或更改我的应用程序的样式。我正在使用默认配置

状态栏将有 6 个图标:
0 - 显示提示(宽度是灵活的;当表单宽度改变时改变)
1 - 将显示当前所选公司的名称(固定宽度)
2 - 将显示当前用户的名称(固定宽度)
3 - 将显示一个图标(固定宽度)
4 - 将显示一个图标(固定宽度)
5 - 将显示日期(固定宽度)

由于 Paintel 1~5 具有固定尺寸(总计 = 448),因此我认为没有理由重新计算 Paintel 宽度的百分比 [0]。

同样,该问题仅出现在 XE7 中。

enter image description here

最佳答案

您需要将TPanel.Style设置为psOwnerDraw而不是默认的psText。如果您不这样做,则不会调用 OnDrawPanel

对类似代码的快速测试表明它可以工作(至少在 XE8 中):

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
const Rect: TRect);
begin
if Panel.Index = 0 then
ImageList1.Draw(StatusBar.Canvas, Rect.Left, Rect.Top, 0);
end;

结果:

Statusbar image

根据发帖者的评论(在此答案下方),该问题实际上与表单的 OnResize 事件中的代码有关,其中不再有足够的空间容纳两个问题面板。有问题的代码(取自发布者的评论):

procedure TFormMain.FormResize(Sender: TObject); 
begin
StatusBar1.Panels[0].Width := FormMain.Width - 448 ;
end;

首先,强调代码中最重要的问题:永远不要在该表单的事件处理程序中使用Form.Width!使用 Self.Width (或简单地使用 Width,这意味着 Self),制作正确的代码

StatusBar1.Panels[0].Width := Self.Width - 448;

(最好使用 Self.ClientWidth,它是调整大小(边缘)边框和删除任何滚动条后表单的内部(客户端)区域,而不是 宽度,顺便说一句。)

我认为面板绘图的问题与面板宽度计算有关。如果在调整 Panels[0] 大小后没有足够的空间容纳面板,则索引 3 和 4 处的面板会变得太小,并且无法看到绘制到矩形中的图像。我可以通过将此事件处理程序添加到我的第一个代码块并再次运行应用程序,调整表单大小来重现此情况:

procedure TForm1.FormResize(Sender: TObject);
begin
StatusBar1.Panels[1].Width := Self.Width - 448;
end;

请注意下面两个图像中第二个面板(面板 1 )的外观变化 - 第一个是当表单最初以设计宽度 800 显示时,第二个是在将窗口缩小到 600 像素后运行时的宽度。

表单宽度为 800 像素 - 请注意带有日期的状态栏面板:

enter image description here

表单宽度为 600 像素 - 注意带有日期的状态栏面板丢失

enter image description here

这里的解决方案是首先扣除面板 3 和 4 的宽度,然后将剩余空间的一定百分比分配给面板 0。请注意,我使用的是表单的 ClientWidth 而不是宽度在这里。

procedure TFormMain.FormResize(Sender: TObject);
var
Available: Double;
begin
Available := ClientWidth - StatusBar1.Panels[3].Width -
StatusBar1.Panels[4].Width;
// Allocate 80% of remaining width to first panel
StatusBar1.Panels[0] := Trunc(Available * 0.8);
end;

关于delphi - 在状态栏中绘制图像在 XE7 版本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com