About Box

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 12 окт 2009.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Люди, как сделать в программе окно "О программе"? Точнее как сделать, я его знаю, нужно только внести кое-какие штрихи. Я хочу сделать его таким, чтобы оно при нажатии клавиши Esc закрывалось. В общем, таким же, например, как и в "Блокноте". Проблема в том, что нету такого стандартного компонента, чтобы его добавить и у тебя было это окошко. Тогда я решил написать его сам, но проблема получилась такая, что надо всем элементам, расположенным на на форме делать обработчик события onKeyPress. Меня это не устраивает, что-то мне подсказывает, что окно "О программе" делается как то по-особому, более профессионально, раз оно почти у всех одинаково. Вопрос только как сделать?
     
  2. etc

    etc Гость

    File->New->Other->Forms->About Box
     
  3. zubr

    zubr Гость

    1. Вызываешь свой About Box модально (ShowModal)
    2. У формы About Box свойство KeyPreview устанавливаешь в True.
    3. Для формы About Box делаешь обработчик OnKeyDown.
     
  4. etc

    etc Гость

    zubr Зачем? мой первый пост + OKButton.Cancel := true; и все.
     
  5. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    etc, zubr Спасибо вам!
    Но больше понравился первый ответ, сглупил я, не посмотрев во вкладке Forms.
    Как выяснилось, во всем виновата кнопка. Сейчас по изучал этот компонент, в чем он отличается от моей формы, оказывается только значинием свойства кнопки Cancel. А без кнопки на Esc форму не закрыть, тут уже надо делать так, как писал zubr.
     
  6. zubr

    zubr Гость

    А если About Box вообще без кнопки?
     
  7. etc

    etc Гость

    Кнопку выкинуть в область невидимости и отрубить табстопы. :)
     
  8. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Почему, если я показываю какую-то форму в модальном режиме, и человек кликает вне области модальной формы, то происходит противный звук и больше ничего. А если открыть блокнот, там нажать о программе, и попытаться кликнуть в сам блокнот, то издается противный звук, и модальная форма как-бы мерцает. Как сделать самому такое мерцания для своих модальных форм?
     
  9. zubr

    zubr Гость

    Хмм... Тут мне видится решение в виде внутреннего хука, который будет перехватывать сообщения мыши, определять координаты мыши и вызывать при появлении условия API-функцию FlashWindowEx. Хотя, может есть и проще вариант.
     
  10. zubr

    zubr Гость

    А вот вариант попроще:
    Код (Text):
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    oldWindowProc: TWndMethod;

    procedure NewWindowProc(var Message: TMessage);
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    AboutBox := TAboutBox.Create(Application);
    AboutBox.ShowModal;
    end;

    procedure TForm1.NewWindowProc(var Message: TMessage);
    var
    fi: FLASHWINFO;
    begin
    oldWindowProc(Message);
    if (Message.Msg = 32) and (Message.LParam = 33685502) then
    begin
    ZeroMemory(@fi, SizeOf(FLASHWINFO));
    fi.cbSize := SizeOf(FLASHWINFO);
    fi.hwnd := AboutBox.Handle;
    fi.dwFlags := FLASHW_CAPTION;
    fi.uCount := 3;
    fi.dwTimeout := 500;
    FlashWindowEx(fi);
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    oldWindowProc := WindowProc;
    WindowProc := NewWindowProc;
    end;
     
  11. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    zubr, спасибо за код.
    Хотя мне с трудом верится, что мелкомягкие так вымораживались с написание блокнота, я думал есть еще какой-нибудь более простой метод, ну и этот сойдет. Осталось подобрать значения uCount и dwTimeout, для полного совпадения. Ну это уже я сам :) Ещё раз спасибо!
     
  12. zubr

    zubr Гость

    Vadik® еще не так вымораживаются. Когда ты создаешь в Delphi форму, при этом не написав ни строчки кода, это не значит что его нет и в винде все делается автоматически, ну или на крайняк одной функцией.
    К примеру, выставив у кнопки OKButton.Cancel, не написав при этом ни строчки кода, это не значит, что в системе есть такие автоматические кнопки, за этой строчкой кода (или клика в инспекторе объектов) стоят как минимум десятки строк кода.
     
  13. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    zubr, нашёл ещё такое:
    Вот, только у меня это не работает. Вот что я делаю.
    Создаю новый проект, вставляю туда AboutBox. На основную форму кидаю кнопку, в ней на Онклик пишу AboutBox.ShowModal; Добавляю в uses Unit2. Потом пишу в Unit1:
    Код (Text):
    protected
    procedure CreateParams(var Para: TCreateParams); override;
    {....}
    end;

    {.....}

    implementation

    procedure TForm1.CreateParams(var Para: TCreateParams);
    begin
    inherited;
    Para.WndParent := GetActiveWindow;
    end;
    И ничего у меня не работает, форма не флашит. Что я не так сделал? Или это вообще левый вариант?
     
  14. etc

    etc Гость

    1. не в той форме
    2. эбаут надо создавать динамически
    3. либо перед показам енто делать эбауту

    тут говорят сделать базовую с этим функционалом, а модальные от нее наследовать, тогда все модальные так будут делать

    ну и опятьже это если создавать по мере, иначе это батва
     
  15. zubr

    zubr Гость

    Vadik® сделай в форме About Box:
    Код (Text):
    procedure TAbout.CreateParams(var Param: TCreateParams);
    begin
    inherited;
    Param.WndParent := Form1.Handle;
    end;
    Где Form1 - форма с которой ты вызываешь About Box. В Form1 ничего не надо прописывать.
     
  16. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Странно как-то они запутали... зачем тогда они предлагали написать процедуру для базовой (основной) формы?
    Тогда бы логичнее было бы написать ModalForm.CreateParams...
    zubr, как всегда выручаешь. Ну я просто не могу не поставиьт тебе плюсика :eek:
     
Загрузка...

Поделиться этой страницей