2012-04-14 1 views
2

Когда я создаю новое приложение VCL в Delphi 2006 и запускаю его (без добавления моего собственного кода или ссылки на любые мои собственные устройства), приложение не будет иметь все пункты меню, которые можно было бы ожидать в контекстном меню это кнопка панели задач. Однако в системном меню приложения (меню, которое вы получаете при щелчке левой кнопкой мыши на значке формы) есть все обычные пункты меню. Как вы можете видеть в следующих скриншотах, Move (Verschieben), Size (Größe ändern) и Maximize (Maximieren) отсутствуют бывшегоПочему контекстное меню кнопки панели задач моего приложения Delphi 2006 не завершено?

enter image description hereenter image description here

Я не мог воспроизвести это в Delphi XE (только другие vesion of Delphi, к которому я имею доступ), и я не нашел никого, кто бы сообщил об этом поведении.

Я также просмотрел свойства TForm и TApplication, был ли один, чтобы управлять этими меню, но так и не нашел.

Все приложения, которые я знаю, имеют один и тот же набор элементов меню в этих двух меню, и я также хотел бы, чтобы мое приложение тоже делало это. Как получить эти два меню для отображения одного и того же набора элементов?

+0

Я бы ожидал увидеть меньшее меню, если приложение было максимально. Это так? –

+1

Это то, что делает [Application.MainFormOnTaskBar] (http://docwiki.embarcadero.com/VCL/en/Forms.TApplication.MainFormOnTaskBar). – NGLN

+0

@KeithMiller Нет, это не максимизировано. – PersonalNexus

ответ

6

Разница заключается в Application.MainFormOnTaskBar, свойство, введенное в D2007, которое устанавливается автоматически True.

Чтобы получить тот же эффект в более ранних версиях, я всегда использую следующий подход:

Project.dpr:

uses 
    Windows, 
    ... 

    Application.CreateForm(TMainForm, MainForm); 
    ShowWindow(Application.Handle, SW_HIDE); 
    Application.Run; 

FMain.pas:

TMainForm = class(TForm) 
    private 
    procedure WMSysCommand(var Message: TWMSysCommand); 
     message WM_SYSCOMMAND; 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    ... 

procedure TMainForm.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 
    with Params do 
    begin 
    ExStyle := ExStyle or WS_EX_APPWINDOW; 
    WndParent := GetDesktopWindow; 
    end; 
end; 

procedure TMainForm.WMSysCommand(var Message: TWMSysCommand); 
begin 
    if Message.CmdType = SC_MINIMIZE then 
    ShowWindow(Handle, SW_MINIMIZE) 
    else 
    inherited; 
end; 

Это работает только тогда, когда установлен MainForm.VisibleTrue design ti меня.

1

В D2006 кнопка панели задач принадлежит окну TApplication. Нажатие на кнопку «Панель задач» отображает системное меню TApplication, которое изменено VCL, чтобы всегда удалять пункты меню «Максимизировать, размер и перемещение». С другой стороны, при нажатии на TForm вместо этого отображается системное меню формы, которое изменяется VCL согласно свойствам BorderStyle формы и BorderIcon. Таким образом, вы действительно имеете дело с двумя отдельными меню для двух отдельных окон.

В современных версиях Delphi, с новым TApplication.ShowMainFormOnTaskbar собственности установлен в true, панель задач принадлежит TForm вместо TApplication, поэтому нажатие на кнопку на панели задач появится системное меню в форме вместо данного меню TApplication системы. Таким образом, в этом случае вы действительно имеете дело с одним меню для одного окна.

 Смежные вопросы

  • Нет связанных вопросов^_^