About Box

Vadik(R)

Well-known member
12.12.2007
469
0
#1
Люди, как сделать в программе окно "О программе"? Точнее как сделать, я его знаю, нужно только внести кое-какие штрихи. Я хочу сделать его таким, чтобы оно при нажатии клавиши Esc закрывалось. В общем, таким же, например, как и в "Блокноте". Проблема в том, что нету такого стандартного компонента, чтобы его добавить и у тебя было это окошко. Тогда я решил написать его сам, но проблема получилась такая, что надо всем элементам, расположенным на на форме делать обработчик события onKeyPress. Меня это не устраивает, что-то мне подсказывает, что окно "О программе" делается как то по-особому, более профессионально, раз оно почти у всех одинаково. Вопрос только как сделать?
 
Z

zubr

#3
1. Вызываешь свой About Box модально (ShowModal)
2. У формы About Box свойство KeyPreview устанавливаешь в True.
3. Для формы About Box делаешь обработчик OnKeyDown.
 
E
#4
zubr Зачем? мой первый пост + OKButton.Cancel := true; и все.
 

Vadik(R)

Well-known member
12.12.2007
469
0
#5
etc, zubr Спасибо вам!
Но больше понравился первый ответ, сглупил я, не посмотрев во вкладке Forms.
Как выяснилось, во всем виновата кнопка. Сейчас по изучал этот компонент, в чем он отличается от моей формы, оказывается только значинием свойства кнопки Cancel. А без кнопки на Esc форму не закрыть, тут уже надо делать так, как писал zubr.
 
E
#7
Кнопку выкинуть в область невидимости и отрубить табстопы. :)
 

Vadik(R)

Well-known member
12.12.2007
469
0
#8
Почему, если я показываю какую-то форму в модальном режиме, и человек кликает вне области модальной формы, то происходит противный звук и больше ничего. А если открыть блокнот, там нажать о программе, и попытаться кликнуть в сам блокнот, то издается противный звук, и модальная форма как-бы мерцает. Как сделать самому такое мерцания для своих модальных форм?
 
Z

zubr

#9
Хмм... Тут мне видится решение в виде внутреннего хука, который будет перехватывать сообщения мыши, определять координаты мыши и вызывать при появлении условия API-функцию FlashWindowEx. Хотя, может есть и проще вариант.
 
Z
#10
А вот вариант попроще:
Код:
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;
 

Vadik(R)

Well-known member
12.12.2007
469
0
#11
zubr, спасибо за код.
Хотя мне с трудом верится, что мелкомягкие так вымораживались с написание блокнота, я думал есть еще какой-нибудь более простой метод, ну и этот сойдет. Осталось подобрать значения uCount и dwTimeout, для полного совпадения. Ну это уже я сам :) Ещё раз спасибо!
 
Z
#12
Vadik® еще не так вымораживаются. Когда ты создаешь в Delphi форму, при этом не написав ни строчки кода, это не значит что его нет и в винде все делается автоматически, ну или на крайняк одной функцией.
К примеру, выставив у кнопки OKButton.Cancel, не написав при этом ни строчки кода, это не значит, что в системе есть такие автоматические кнопки, за этой строчкой кода (или клика в инспекторе объектов) стоят как минимум десятки строк кода.
 

Vadik(R)

Well-known member
12.12.2007
469
0
#13
zubr, нашёл ещё такое:
Заставить мерцать заголовок модального окна при щелчке народительской форме
{
Under windows 2000/XP,if user open a modal dialog,
when the user click the modal form's parent form,
windows can flash the modal form title bar,how to do it by delphi?
you may create base form,let you modal form inherite from the base form,
and add under codes to the base form source:
}

Код:
type
TFrmBase = class(TForm)
protected
procedure CreateParams(var Para: TCreateParams); override;
{....}
end;

{.....}

implementation

procedure TFrmBase.CreateParams(var Para: TCreateParams);
begin
inherited;
Para.WndParent := GetActiveWindow;
end;
Вот, только у меня это не работает. Вот что я делаю.
Создаю новый проект, вставляю туда AboutBox. На основную форму кидаю кнопку, в ней на Онклик пишу AboutBox.ShowModal; Добавляю в uses Unit2. Потом пишу в Unit1:
Код:
protected
procedure CreateParams(var Para: TCreateParams); override;
{....}
end;

{.....}

implementation

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

you may create base form,let you modal form inherite from the base form
тут говорят сделать базовую с этим функционалом, а модальные от нее наследовать, тогда все модальные так будут делать

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

Vadik(R)

Well-known member
12.12.2007
469
0
#16
Странно как-то они запутали... зачем тогда они предлагали написать процедуру для базовой (основной) формы?
Тогда бы логичнее было бы написать ModalForm.CreateParams...
zubr, как всегда выручаешь. Ну я просто не могу не поставиьт тебе плюсика :eek: