2008-11-11 29 views
7

Tôi đã cố gắng hết sức và không thể tìm ra những gì đã xảy ra ở đây. Nó hoạt động tốt trong Delphi 4. Sau khi nâng cấp lên Delphi 2009, tôi không biết đây có phải là cách nó hoạt động hay không, hoặc nếu đó là vấn đề:Phím Tăng tốc Trình đơn Không hiển thị (Delphi 2009)

Đây là menu chương trình của tôi trông giống như trong Chế độ thiết kế dưới Delphi 2009:

alt text http://www.beholdgenealogy.com/img/menu1.gif

Chú ý rằng mỗi từ trong Main menu và file menu con có một bức thư nhấn mạnh. Nó được cho là như thế này. Thư được gạch dưới này được gọi là Khóa gia tốc và là chuẩn trong các ứng dụng Windows để bạn có thể sử dụng phím Alt và chữ cái đó để nhanh chóng chọn mục menu và sau đó chọn menu con bằng bàn phím thay vì bằng chuột.

Bạn nhận được chúng theo cách này bằng cách sử dụng các "&" nhân vật như một phần của chú thích của mặt hàng đó, ví dụ: Lưu & As ...

Khi tôi chạy ứng dụng của tôi, và sử dụng chuột để mở menu file, nó trông như thế này:

alt text http://www.beholdgenealogy.com/img/menu2.gif

các nhân vật được nhấn mạnh trong menu chính, nhưng không đề cập đến trong menu file.

Nếu thay vào đó, tôi sử dụng phím Alt-F để mở File menu con, sau đó nó có vẻ đúng như thế này:

alt text http://www.beholdgenealogy.com/img/menu3.gif

và tất cả các Accelerator chữ chính được nhấn mạnh đúng cách.

Tôi đã chơi với tùy chọn AutoHotKeys nhưng đó không phải là vấn đề.

Có ai đó đã gặp sự cố này trước đây không? Ví dụ trong hành vi đúng của hình ảnh thứ 2 mà tôi không biết? Hoặc là có một số tùy chọn hoặc mã hóa sai lầm mà tôi có thể đã bị mất?


Tháng 11 năm 2009 (một năm sau): mghie dường như đã đến tận gốc rễ của vấn đề này và đã tìm ra vấn đề. Xem câu trả lời được chấp nhận của anh ấy bên dưới.

Trả lời

7

Có cài đặt Windows chuẩn (trong thuộc tính hiển thị) để thường ẩn các máy gia tốc đó trừ khi phím Alt được giữ. Điều đó sẽ giải thích tại sao mở menu bằng Alt + F10 hiển thị chúng cho bạn. Có lẽ đó là nguyên nhân?

[EDIT]: Không, không phải. Tôi vừa thử, và một TForm đơn giản với một mục trình đơn cho thấy máy gia tốc, nhưng ngay sau khi tôi thêm một TImageList và thiết lập ImageIndex của mục menu đơn, hoặc đơn giản là đặt OwnerDraw thành true, thì gạch chân tăng tốc biến mất. Tôi đoán đó thực sự là một lỗi trong VCL.

BTW, đây là trên Windows XP.

Cách giải quyết:

tôi đã sửa lỗi này bằng Delphi 2009 trên Windows XP 64, và nguyên nhân gốc rễ cho các máy gia tốc thiếu dường như là Windows sẽ gửi WM_DRAWITEM tin nhắn với các thiết lập ODS_NOACCEL cờ, mà nó shouldn' t nếu hệ thống được đặt để hiển thị bộ gia tốc ở mọi thời điểm. Vì vậy, bạn có thể nói rằng nó không phải là một lỗi VCL, nhưng một vấn đề Windows mà VCL không làm việc xung quanh.

Tuy nhiên, bạn có thể làm việc xung quanh nó trong mã của riêng bạn, bạn chỉ cần đặt lại cờ trước khi chuyển thông điệp tới VCL. Ghi đè lên các cửa sổ proc

protected 
    procedure WndProc(var Message: TMessage); override; 

như vậy:

procedure TYourForm.WndProc(var Message: TMessage); 
const 
    ODS_NOACCEL = $100; 
var 
    pDIS: PDrawItemStruct; 
    ShowAccel: BOOL; 
begin 
    if (Message.Msg = WM_DRAWITEM) then begin 
    pDIS := PDrawItemStruct(Message.LParam); 
    if (pDIS^.CtlType = ODT_MENU) 
     and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0) 
    then begin 
     if ShowAccel then 
     pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL; 
    end; 
    end; 
    inherited; 
end; 

Đây chỉ là đang trình diễn, bạn không nên gọi SystemParametersInfo() mỗi lần thư WM_DRAWITEM được nhận, nhưng một lần khi khởi động chương trình, và sau đó mỗi lần chương trình của bạn nhận được thông báo WM_SETTINGCHANGE.

+0

Tôi cũng đang sử dụng Windows XP. Sau khi những câu trả lời và suy nghĩ của tôi về điều này, và sự giúp đỡ của bạn, tôi đồng ý nó có thể là một lỗi trong VCL. Tôi sẽ báo cáo. – lkessler

+0

Được báo cáo là lỗi cho Embarcadero: http://qc.codegear.com/wc/qcmain.aspx?d=68816 – lkessler

+0

BTW, tôi nhận được cùng một hành vi với Delphi 2007. – mghie

1

Tôi không nghĩ đó là lỗi do Delphi tạo ra vì bạn có cùng hành vi với Notepad trên Vista. Cũng trong Delphi chính nó BTW ...
Tôi phải thú nhận rằng tôi đã không chú ý trước câu hỏi của bạn. Cảm ơn đã chỉ ra điều đó.

+0

No. Trong Delphi 2009 đối với tôi, tất cả các mục menu phụ đều hiển thị phím tăng tốc, ngay cả khi tôi chọn menu bằng chuột. Đó là lý do tại sao tôi nghĩ đó là một số cài đặt mà tôi có, thay vì Delphi hoặc Hệ điều hành. Nó chắc chắn là một trong những stramge, tôi đã dành khoảng 4 giờ đã cố gắng sửa chữa nó. – lkessler

6

Nó là một "tính năng" giới thiệu với Windows 2000:

The Old New Thing: Why does Windows hide keyboard accelerators and focus rectangles by default?

Nó sẽ xuất hiện mà Delphi 4 không hỗ trợ tính năng Windows này. Để có các menu 2000 và XP hiển thị các phím tăng tốc, bấm chuột phải vào một chỗ trống trên màn hình nền, chọn Thuộc tính, bấm tab Giao diện, và dưới Hiệu ứng, bỏ chọn Ẩn các chữ cái được gạch dưới cho điều hướng bàn phím cho đến khi tôi bấm phím Alt. Nhấp OK hai lần.

Không chắc chắn cách thực hiện trong Vista.

+0

Tôi nghĩ bạn đã có câu trả lời. Nhưng thật không may khi tôi nhìn vào tùy chọn "Hide Underlined Letters" (tôi chưa từng biết đến nó trước đây), tôi thấy nó không được chọn. – lkessler

+0

Hệ điều hành nào? Ảnh chụp màn hình của bạn trông giống XP. Tôi chỉ thử nó trên XP và nó hoạt động (bỏ chọn tùy chọn và nhấn mạnh phím tăng tốc hiển thị.) Có lẽ bạn cần phải khởi động lại. –

0

Như Jim McKeeth đã lưu ý ở trên (chính xác), đây là hành vi "do thiết kế". Nếu các menu được kích hoạt thông qua thao tác bàn phím, các bộ gia tốc sẽ được hiển thị, nhưng nếu được kích hoạt bởi chuột, các máy gia tốc sẽ không được hiển thị cố ý.

Tôi có XP được định cấu hình để hiển thị máy gia tốc mọi lúc, nhưng thử nghiệm nhanh với tùy chọn đó đã thay đổi xác nhận rằng các trình đơn không được gạch dưới (Visual Studio trả lời như tôi mong đợi, không gạch chân khi sử dụng chuột). Tuy nhiên, Microsoft Office bỏ qua cài đặt này và luôn hiển thị các gạch dưới. Vì vậy, nó trông giống như một lỗi trong cách trình đơn được rút ra trong Delphi (Tôi không có bất kỳ kinh nghiệm với Delphi bản thân mình).

Tôi tìm thấy tùy chọn cho Vista cũng như: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

Bạn có thể tắt chức năng này vào trong Dễ mới trong Access Center (vào Control Panel, bấm Ease of Access và sau đó nhấp vào Ease of Access Center). Trong Trung tâm dễ truy cập, hãy nhấp vào Làm cho bàn phím dễ sử dụng hơn và ở dưới cùng, hãy chọn hộp kiểm Phím tắt và truy cập phím.

Trong khi làm nghiên cứu sâu hơn tôi phát hiện lỗi liên quan này trên các diễn đàn Delphi: http://qc.codegear.com/wc/qcmain.aspx?d=37403

Dường như trong trường hợp của bạn các cửa sổ con (menu rút) không nhận được hoặc không được xử lý thông điệp từ WM_UIUPDATESTATE cửa sổ cha mẹ của họ, đó là những gì gây ra việc vẽ lại với máy gia tốc.

+0

"Có vẻ như trong trường hợp của bạn các cửa sổ con (các trình đơn vẽ) không nhận được hoặc không xử lý tin nhắn WM_UIUPDATESTATE từ cửa sổ cha mẹ của họ, đó là những gì gây ra vẽ lại với gia tốc" - Chính xác! Đó là lỗi! – lkessler

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