MessageForm - класс для вывода сообщений
Класс используетмя примерно следующим образом:
procedure TSomeForm.SomeActionExecute ;
begin
try
MessageForm.Show('Какое-то действие', 'Начало...');
{ ... }
MessageForm.Text('В процессе...');
{ ... }
MessageForm.Text('Конец операции...');
{ ... }
finally
MessageForm.Close ;
end ;
end ;
Вызовы Show и Close могут быть вложенными, но должна соблюдаться парность. Это позволяет вызывать одну подпрограмму, использующую класс, из другой подпрограммы, также использующей класс.
При каждом вызове подпрограмм выполняется также Application.ProcessMessages. Существующие на момент первого (самого внешнего) вызова Show формы блокируются тем же механизмом, что и в случае TCustomForm.ShowModal; таким образом, несмотря на обработку сообщений, их кнопки и другие элементы управления остаются недоступными.
Вызов подпрограммы Close следует размещать в секции finally, так как в противном случае окно сообщений может остаться на экране, в то время как другие формы будут недоступны.
unit Splash ;
interface
uses Classes, SysUtils, Forms, Controls, ExtCtrls ;
type
{ Статический класс "окна сообщений" }
MessageForm = class
public
class procedure Show ( const ACaption, AMessage : string ) ;
class procedure Text ( const AMessage : string ) ;
class procedure Close ;
end ;
implementation
var
{ Окно и необходимые ему переменные }
MsgForm : TForm ;
MsgPanel : TPanel ;
MsgDepth : integer = 0 ;
ListDisabled : pointer = nil ;
{ Инициализация окна }
procedure CreateMessageForm ;
begin
MsgForm := TForm.Create ( nil ) ;
with MsgForm do
begin
BorderIcons := [] ;
BorderStyle := bsDialog ;
Position := poScreenCenter ;
ClientHeight := 40 ;
ClientWidth := 350 ;
end ;
MsgPanel := TPanel.Create ( nil ) ;
with MsgPanel do
begin
Align := alClient ;
BevelInner := bvLowered ;
Parent := MsgForm ;
end ;
end ;
{ Запуск окна с сообщением }
class procedure MessageForm.Show ( const ACaption, AMessage : string ) ;
begin
Text ( AMessage ) ;
if MsgDepth > 0
then Inc ( MsgDepth )
else
begin
MsgForm.Caption := ACaption ;
MsgForm.Show ;
ListDisabled := DisableTaskWindows ( MsgForm.Handle ) ;
MsgDepth := 1 ;
Application.ProcessMessages ;
end ;
end ;
{ Изменение текста в окне }
class procedure MessageForm.Text ( const AMessage : string ) ;
begin
MsgPanel.Caption := AMessage ;
Application.ProcessMessages ;
end ;
{ Закрытие формы }
class procedure MessageForm.Close ;
begin
if MsgDepth > 1
then Dec ( MsgDepth )
else
begin
EnableTaskWindows ( ListDisabled ) ;
ListDisabled := nil ;
MsgForm.Close ;
MsgDepth := 0 ;
end ;
end ;
initialization
CreateMessageForm ;
finalization
FreeAndNil ( MsgForm ) ;
end.
Комментарии