2017-06-19 39 views
5

Bất kỳ ý tưởng nào tại sao TToolbar với TToolButtons sẽ ngừng hiển thị chú thích nút sau một thời gian? Điều này xảy ra với tất cả các thanh công cụ trên các biểu mẫu được tạo tự động trên toàn bộ ứng dụng. Thanh công cụ trên các biểu mẫu được tạo động hoạt động tốt ngay cả sau khi sự cố này xảy ra.TToolbar ngừng hiển thị chú thích nút sau một lúc

Tôi chỉ thấy điều này xảy ra trên một sổ ghi chép Windows 7. Không có lỗi được nêu ra khi điều này xảy ra và tôi không thể tái tạo vấn đề trên lệnh. Giải pháp duy nhất là khởi động lại ứng dụng.

TToolbar.ShowCaptions luôn đúng và không bao giờ thay đổi. Điều này cũng hiển thị trên hình ảnh bên dưới vì các biểu tượng được căn chỉnh theo chiều dọc khi ShowCaptions là Sai.

Toolbar with missing captions

Sự cố tương tự đã xảy ra trước đây trên PC Windows 8. Tuy nhiên, chú thích thời gian này đã được thay thế bằng văn bản khác.

Toolbar with weird captions

EDIT:

tôi đã có thể tạo lại vấn đề bằng cách gọi TImageList.Change giữa 5-10k lần. Tôi chỉ có Delphi 2010, vì vậy tôi không thể nói nếu đây là một vấn đề Delphi hoặc Windows.

Đơn vị:

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. 

Mẫu:

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 
+1

Mùi giống như rò rỉ tài nguyên của một số loại. Hãy thử theo dõi số lượng đối tượng GDI. –

+0

Nhiều khả năng, phụ đề được thay đổi khi chạy. Bạn có thể định nghĩa một điểm ngắt trên thuộc tính 'FCaption' của toolbutton hoặc - nếu nó tồn tại - trong phương thức' SetCaption'. –

+0

@ RenéHoffmann Chú thích không bao giờ thay đổi. Ngay cả khi họ đã, điều này không nên ảnh hưởng đến toàn bộ ứng dụng. – mwore

Trả lời

4

Dường như đây là lỗi trong Delphi 2010, trong đơn vị ComCtrls ở cuối function TToolBar.UpdateItem(). Hàm bắt đầu tại dòng 21476.

Trong ô Delphi XE4 (có thể đã được sửa trước đó, tôi không thể kiểm tra) chú thích và mã sau (bị thiếu trong Delphi 2010) xuất hiện ở cuối hàm :

// 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; 

Lấy một bản sao của Delphi 2010 ComCtrls.pas vào thư mục dự án và thêm mã ở trên, chữa khỏi sự cố mà thử nghiệm của bạn tạo ra.

+1

Một trong những điều tốt đẹp về giải pháp thể hiện trong câu trả lời của tôi là nó tránh làm ngập hồ bơi chuỗi ở nơi đầu tiên. Với giải pháp được mô tả ở đây (cũng phát hiện btw), bạn có thể thấy quá trình byte riêng tư tăng đều đặn trong khi vòng lặp 'ToolButton1Click' thực hiện. Với giải pháp của tôi không xảy ra. Nó không phải là một số lượng đáng kể, nhưng tôi nghĩ rằng nó làm cho ý nghĩa nổi tiếng để tránh phá hủy và tái tạo các nút này không có lý do chính đáng, Hơn nữa, tránh giải trí cửa sổ nếu có thể phải là một chính sách tốt. Cá nhân tôi sẽ áp dụng các thay đổi từ cả hai câu trả lời. –

+0

Thời gian của câu trả lời không quan trọng. Chấp nhận lý do tại sao bạn cảm thấy là câu trả lời hay nhất. –

4

Do sinh sản trong câu hỏi, tôi nghĩ rằng vấn đề là các VCL đang thanh công cụ loại bỏ tất cả các nút và sau đó tái tạo lại chúng bất cứ khi nào danh sách hình ảnh được sửa đổi.

Tôi đang xem mã Delphi 6 vì tôi không có Delphi 2010 ngay lập tức để tay, nhưng mã đã không thay đổi về mặt vật chất. Mã thích hợp nằm trong TToolBar.CreateButtons. Về phía dưới cùng của phương pháp này, chúng tôi có:

for I := 0 to InternalButtonCount - 1 do Perform(TB_DELETEBUTTON, 0, 0); 
UpdateButtons; 

Vòng lặp loại bỏ tất cả các nút và sau đó thêm chúng trở lại. Có vẻ như việc kiểm soát cơ bản không đánh giá cao việc được điều trị theo cách này. Thay vì xóa tất cả các nút, chúng tôi chỉ có thể xóa bất kỳ nút dư thừa nào.

var 
    Count: Integer; 
.... 
Count := InternalButtonCount; 
while Count>FButtons.Count do 
begin 
    Perform(TB_DELETEBUTTON, Count-1, 0); 
    dec(Count); 
end; 
UpdateButtons; 

Trong mã ví dụ của bạn và trong ứng dụng thực, bạn không thay đổi số lượng nút để phiên bản này thậm chí không tham gia vòng lặp.

Với thay đổi này, chương trình của bạn chạy chính xác.

Bạn có thể áp dụng thay đổi này trong ứng dụng của bạn bằng cách làm như sau:

  1. Đi một bản sao của ComCtrls.pas từ thư mục nguồn của thư mục cài đặt của bạn, và lưu nó trong cây dự án của bạn.
  2. Thêm đơn vị ComCtrl được sao chép đó vào dự án của bạn.
  3. Thực hiện các sửa đổi được mô tả ở trên.
+0

Sau khi thử nghiệm thêm một số giải pháp này gây ra các vấn đề khác. Thay đổi chú thích nút khi thời gian chạy ẩn phụ đề cho tất cả các nút. – mwore

+0

Không có trong bài kiểm tra của tôi nó không ....... Tôi tự hỏi nếu bạn có thể cho tôi đủ chi tiết để tái sản xuất –

+0

Sử dụng ứng dụng thử nghiệm từ câu hỏi và vá ComCtrls. Thay thế ToolButton1Click bằng 'ToolButton1.Caption: = 'Button''. Khi nhấp vào tất cả những gì tôi nhận được là các biểu tượng không có chú thích trên bất kỳ nút nào. – mwore

Các vấn đề liên quan