[英]TToolbar stops displaying button captions after a while
知道為什么帶有TToolButtons的TToolbar會在一段時間后停止顯示按鈕標題嗎? 在整個應用程序中自動創建的表單上的所有工具欄都會發生這種情況。 即使遇到此問題,動態創建的表單上的工具欄也能正常工作。
我只在一台Windows 7筆記本上看到過這種情況。 發生這種情況時不會出現錯誤,我無法在命令中重現問題。 唯一的解決方案是重新啟動應用程序。
TToolbar.ShowCaptions始終為True且永遠不會更改。 這在下圖中也是可見的,因為當ShowCaptions為False時,圖標是垂直對齊的。
之前在Windows 8 PC上發生過類似的問題。 然而,這次字幕被其他文字取代。
編輯:
我能夠通過調用TImageList.Change重現5-10k次來重現問題。 我只有Delphi 2010,所以我不能說這是Delphi還是Windows問題。
單元:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls, ToolWin, StdCtrls, Gauges;
type
TImageListHelper = class helper for TImageList
public
procedure DoChange;
end;
TForm1 = class(TForm)
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
ImageList1: TImageList;
ProgressBar1: TProgressBar;
procedure ToolButton1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
repeat
ImageList1.DoChange;
ProgressBar1.StepIt;
Self.Update;
until ProgressBar1.Position >= ProgressBar1.Max;
end;
procedure TImageListHelper.DoChange;
begin
Self.Change;
end;
end.
形成:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 66
ClientWidth = 711
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object ToolBar1: TToolBar
Left = 0
Top = 0
Width = 711
Height = 41
ButtonHeight = 36
ButtonWidth = 71
Caption = 'ToolBar1'
Images = ImageList1
ShowCaptions = True
TabOrder = 0
ExplicitWidth = 885
object ToolButton1: TToolButton
Left = 0
Top = 0
Caption = 'ToolButton1'
ImageIndex = 0
OnClick = ToolButton1Click
end
object ToolButton2: TToolButton
Left = 71
Top = 0
Caption = 'ToolButton2'
ImageIndex = 0
end
object ToolButton3: TToolButton
Left = 142
Top = 0
Caption = 'ToolButton3'
ImageIndex = 0
end
object ToolButton4: TToolButton
Left = 213
Top = 0
Caption = 'ToolButton4'
ImageIndex = 0
end
object ToolButton5: TToolButton
Left = 284
Top = 0
Caption = 'ToolButton5'
ImageIndex = 0
end
object ToolButton6: TToolButton
Left = 355
Top = 0
Caption = 'ToolButton6'
ImageIndex = 0
end
object ToolButton7: TToolButton
Left = 426
Top = 0
Caption = 'ToolButton7'
ImageIndex = 0
end
object ToolButton8: TToolButton
Left = 497
Top = 0
Caption = 'ToolButton8'
ImageIndex = 0
end
object ToolButton9: TToolButton
Left = 568
Top = 0
Caption = 'ToolButton9'
ImageIndex = 0
end
object ToolButton10: TToolButton
Left = 639
Top = 0
Caption = 'ToolButton10'
ImageIndex = 0
end
end
object ProgressBar1: TProgressBar
Left = 0
Top = 49
Width = 711
Height = 17
Align = alBottom
Max = 10000
Step = 1
TabOrder = 1
ExplicitTop = 48
end
object ImageList1: TImageList
Left = 8
Top = 16
Bitmap = {
494C010101000500040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000FF000000FF0000000000000000000000FF000000FF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000FF000000FF0000000000000000000000FF000000FF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000FF000000FF0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000FF000000FF0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000FF000000FF0000000000000000000000FF000000FF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000FF000000FF0000000000000000000000FF000000FF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000
FFFF000000000000E7E7000000000000E7E7000000000000F99F000000000000
F99F000000000000FE7F000000000000FE7F000000000000F99F000000000000
F99F000000000000E7E7000000000000E7E7000000000000FFFF000000000000
FFFF000000000000FFFF00000000000000000000000000000000000000000000
000000000000}
end
end
鑒於問題中的再現,我認為問題是VCL工具欄代碼刪除了所有按鈕,然后在修改圖像列表時重新創建它們。
我正在查看Delphi 6代碼,因為我沒有立即提供Delphi 2010,但代碼沒有實質性改變。 相關代碼位於TToolBar.CreateButtons
。 在這個方法的底部,我們有:
for I := 0 to InternalButtonCount - 1 do Perform(TB_DELETEBUTTON, 0, 0);
UpdateButtons;
循環刪除所有按鈕,然后UpdateButtons
將它們添加回來。 看起來潛在的控制並不喜歡被這樣對待。 我們可以改為刪除任何多余的按鈕,而不是刪除所有按鈕。
var
Count: Integer;
....
Count := InternalButtonCount;
while Count>FButtons.Count do
begin
Perform(TB_DELETEBUTTON, Count-1, 0);
dec(Count);
end;
UpdateButtons;
在您的示例代碼和實際應用程序中,您不會更改按鈕的數量,因此此版本甚至不會進入循環。
通過此更改,您的程序可以正常運行。
您可以通過執行以下操作在應用程序中應用此更改:
它似乎是Delphi 2010中的一個錯誤,在function TToolBar.UpdateItem()
末尾的ComCtrls單元中。 該功能從第21476行開始。
在Delphi XE4中(它可能已經修復過,我無法檢查)下面的注釋和代碼(Delphi 2010中缺少的)出現在函數的末尾 :
// If more than 2^16 strings are TB_ADDSTRING-ed to the tool bar's string
// pool, the Windows API assumes iString is a pointer to a null terminated
// string, not an index in the string pool. Therefore we have to recreate
// the toolbar to reset the string pool so the strings display propperly.
if Button.iString >= 65536 then
RecreateWnd;
將Delphi 2010 ComCtrls.pas的副本復制到projects文件夾並添加上述代碼,可以解決測試創建的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.