Delphi - форма сообщения как окно другой задачи

У нас есть приложение, которое обрабатывает наше собственное сообщение - процедура с таймером читает для них базу данных. Если находим запись, то показываем форму модально.

Это не очень хорошее решение, потому что пользователь может вводить текст, видеть что-либо и т. д., а форма прерывает эту операцию.

Мне показалось, что я иногда видел, что диалоги, окна оторваны от приложения, и это как бы другие задачи (панель задач на этот раз состоит из двух элементов). Но такие вещи случаются нечасто, и это баги...

Но затем я хочу найти способ вызвать то же самое.

Таймер проверяет БД, и если в ней найдена запись, то мы покажем форму в фоновом режиме, что, похоже, является другой задачей, и она мигает, и периодически меняет заголовок. Когда пользователь щелкает по нему, он уничтожает себя и показывает исходную форму «сообщения» как модальную.

Можем ли мы сделать это с помощью трюков Win32? И как?

Спасибо: дд


Спасибо за первые ответы.

Я попытался создать простой пример. Вы можете увидеть здесь:

type
    TC = class(TPanel)
        private
        protected
            procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;

        public
            procedure CreateParams(var Params: TCreateParams); override;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
    t : TC;
begin
    t := TC.Create(Self);
    t.Width := 100;
    t.Height := 100;
    t.Caption := 'aaaa';
    ShowWindow(t.Handle, sw_SHOW);
end;


{ TC }

procedure TC.CreateParams(var Params: TCreateParams);
begin
    inherited;
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    Params.WndParent := GetDesktopwindow;
end;

procedure TC.WMActivate(var Message: TWMActivate);
begin
    if Message.Active <> WA_INACTIVE
        then begin
            SHowMessage('b');
            SHowWindow(Self.Handle, sw_HIDE);
        end;
end;

Это работает, но у меня есть одна проблема. Иконка задачи такая же, как у приложения. Если кто-то случайно щелкнул по нему, возможно, щелкнул не тот элемент. Как можно переопределить иконку подокна?

Спасибо: дд


person durumdara    schedule 24.02.2011    source источник
comment
Если вы хотите показать что-то на экране, но не украсть фокус, вам нужна подсказка.   -  person David Heffernan    schedule 24.02.2011
comment
Я работаю над чем-то подобным. Я настоятельно рекомендую вам перенести все чтение БД и обработку диалогов сообщений в отдельный поток, потому что, например. когда что-то происходит с вашим соединением с БД, и вы не останавливаете таймер обновления, вы будете с вашей основной формой в бесконечном цикле тайм-аутов соединения, и с точки зрения пользователя это задержка программы.   -  person    schedule 24.02.2011
comment
И поскольку он будет у вас в отдельном потоке, вы можете отобразить форму сообщения, которую вы создали в методе синхронизации этого потока.   -  person    schedule 24.02.2011


Ответы (1)


Не полное решение, но часть головоломки, которая вам, вероятно, понадобится: чтобы отобразить форму с собственной кнопкой на панели задач, вы можете переопределить CreateParams.

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
person Kcats    schedule 24.02.2011
comment
Params.WndParent := GetDesktopWindow? это когда-нибудь мудро? - person David Heffernan; 24.02.2011
comment
@David Heffernan Это позволяет форме оставаться открытой, даже если основная форма скрыта. Управление формами в Delphi не делает эти вещи простыми, и именно так мне удалось обойти это. Конечно, может быть лучший способ. OP, вероятно, не понадобится, поэтому я просто отредактирую его. - person Kcats; 24.02.2011
comment
Проблема в том, что формы крадут фокус. Я думаю, что подсказка - это то, что нужно для уведомления. - person David Heffernan; 24.02.2011
comment
С всплывающей подсказкой у меня проблема, что это связано с элементом управления. Но у нас нет обычно используемого контроля. Нам нужна отдельная форма. Но это не слишком простое дело... - person durumdara; 24.02.2011
comment
@durumdara Я думал, что есть Windows API для отображения таких подсказок инструментов уведомлений, но чем больше я ищу, тем больше я думаю, что вы должны делать это самостоятельно, не отвлекаясь на воровство. - person David Heffernan; 24.02.2011