Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

Передовые технологии программирования

 

    Сейчас, когда вы ближе познакомились с тремя типами приложений и разобрались в концепции повторного использования форм и приложений, пришла пора поговорить "о сургуче и башмаках", а точнее, о двух очень полезных компонентах— TApplication и TScreen. Они снабжают вас информацией об операционной среде выполнения программы и предоставляют возможность повысить профессионализм вашего приложения

Компонент TApplication
    Компонент TApplication инкапсулирует приложения при выполнении. Delphi автоматически создает экземпляр Application класса TApplication при выполнении приложения. Для использования этого объекта включите модуль Forms в раздел uses.

Свойства TApplication
    TApplication предоставляет несколько свойств, с помощью которых можно отслеживать состояние приложения и контролировать некоторые аспекты его поведения.

Active
    Это свойство возвращает значение True, если в приложении в текущий момент содержится фокус ввода. Если Active приложения имеет значение True, то и свойство Active для одной из форм также равно True. Обычно оно используется для определения, имеет ли приложение фокус ввода, перед выводом строки состояния или прорисовкой объекта TCanvas.


Совет: Даже будучи неактивным, приложение продолжает получать сообщения о перемещении мыши.

EXEName
    Это свойство представляет собой строку, содержащую полный путь выполняемого файла (аналог в С— argv[0]). Чаще всего оно используется для определения рабочего каталога приложения, в котором могут находиться файлы данных или инициализации программы.
 


Совет: Для получения из EXEName рабочего каталога используйте функцию ExtractFilePath или Extract-FileDir из модуля SysUtils.

Hint и ShowHint
    В свойстве Hint содержится текст, который будет выведен после запуска события OnHint.
    Свойство ShowHint используется для определения, выводится ли подсказка "на лету". Установка свойства равным False отключает систему подсказок для всех элементов в приложении независимо от их индивидуальных установок. Обычно оно используется совместно с пунктом меню, включающим или отключающим подсказки. Вот примерный код.

    procedure TFormI.mnuToggleHintsClick(Sender: TObject);
    begin
        {Переключение текущего состояния.}
        mnuToggleHints.Checked:= not mnuToggleHintsChecked;
        {Обновление свойства ShowHint.} Application.ShowHint:= mnuToggleHints.Checked;
    end;

HintColor, HintPause, HintHidePause и HintShortPause
    HintColor определяет цвет окна всплывающей подсказки, например

Application.HintColor:= cILime;
    HintPause и HintHidePause определяют временные задержки при показе подсказок следующим образом.

  • Указатель мыши помещается над потомком TControl. Событие OnHint вызывается сразу же после установки указателя мыши на TControl.
  • Delphi ожидает HintPause миллисекунд перед выводом окна подсказки.
  • Указатель остается над TControl.
  • Delphi ожидает HintHidePause миллисекунд перед закрытием окна подсказки.

  •     Свойство HintShowPause определяет задержку перед отображением подсказки, если активна подсказка другого элемента.

    Icon
        Свойство Icon позволяет изменить пиктограмму, представляющую приложение в панели задач во время работы. Это полезно, если необходимо отмечать, таким образом, изменение состояния приложения. Следующий код назначает пиктограмму из файла INACTIVE.ICO:

        Application.Icon.LoadFromFile('INACTIVE.ICO');

    Title
        Определяет заголовок приложения в панели задач.

    Методы TApplication

    Minimize и Maximize
        Эти методы заставляют приложение принять свернутый и развернутый вид. Вы можете удивиться, зачем это необходимо при наличии свойства WindowState объекта TForm. Однако так вы можете минимизировать форму на рабочем столе, но не в панели задач. Описываемый здесь метод осуществляет эту операцию более корректно.

    ProcessMessages
        Этот метод вынуждает приложение обработать ожидающие сообщения. Это полезно делать, например, в длинном цикле, чтобы приложение могло реагировать на поступающие сообщения. Предположим, ваше приложение состоит из цикла

        while not Application.Terminated do

        При этом оно не сможет обрабатывать сообщения, а вы не сможете перемещать окна и воздействовать на его элементы управления. Одним словом, несмотря на деятельность в цикле, приложение оказывается мертвым для внешнего мира. Однако все изменяется при таком варианте кода:

        while not Application.Terminated do
        Application.ProcessMessages;
     


    Совет: Программисты часто предпочитают использовать для длительных вычислений отдельную подзадачу, реализуемую классом TThread.


     

    Terminate
        Этот метод— предпочтительный способ закрытия приложения. Terminate не закрывает приложение немедленно, а дожидается обработчика события и завершения всех других процессов. Обычно оно используется в меню File/Exit.

        procedure TFormI.mnuFileExitClick(Sender: TObject);
        begin
            Application.Terminate;
        end;
     

    События TApplication

    Обработка событий TApplication
        Поскольку при создании TApplication недоступен, установка его обработчика события затруднена из-за невозможности использования инспектора объектов (Object Inspector).
        Сначала опишем обработчик события. Поскольку событие распознается и запускается объектом, обработчик должен быть методом объекта. Он также должен соответствовать соглашению о вызовах события, которое обычно описано в системе справки. Например, из файлов справки можно узнать, что событие OnActivate типа TNotifyEvent является наиболее общим типом. Его описание его выглядит так:

        TNotifyEvent = procedure (Sender: TObject) of Object;

        Это описание говорит о том, что ваш обработчик должен получать параметр TObject, который позволяет определить, какой именно объект распознал и отослал событие.
        Создадим новое приложение и модифицируем описание TForm1.

            type
                TForm1 = class(TForm)
                private
                    {Закрытые объявления.}
                    procedure OnActivateHandler(Sender: TObject);
                public
                    {Открытые объявления.}
                end;

        Описание обработчика как protected не несет особой нагрузки и принято по умолчанию. Важно лишь, чтобы он был методом класса.
        Теперь, когда мы описали обработчик, определим его. Добавьте следующий код в раздел implementation вашего модуля.

        procedure TFormI.OnActivateHandler(Sender: TObject);
        begin
            {Код вашего обработчика.}
        end;


    Совет: Определение процедуры или функции не требует перечисления списка параметров, так как он был дан при описании. Вы можете его повторить для повышения удобочитаемости и ясности программы.


        Наконец, назначим обработчик событию. Обычно это выполняется в событии OnCreate главной формы. Измените обработчик события OnCreate класса Tform1 следующим образом.

        procedure TFormI.FormCreate(Sender: TObject);
        begin
            Application.OnActivate:= OnActivateHandler;
        end;

    OnActivate и OnDeactivate
        Эти события оповещают программу об изменении свойства Active.

    OnException
        Событие вызывается при необработанной исключительной ситуации.

    OnHint
        Событие генерируется при перемещении указателя мыши над объектом— потомком TControl, если его свойство Hint равно значению, которое отличается от пустой строки.

    Onldle
        Событие генерируется, когда приложение ожидает ввода и не занято обработкой события. Обычно оно используется для выполнения фоновых задач наподобие загрузки базы данных или обработки изображения.
        Обработчик получает логический параметр Done, по умолчанию равный True. Если вы оставляете его равным True, обработчик не запустится до тех пор, пока не будет получено и обработано очередное сообщение. Если вы установили Done равным False, обработчик будет запускаться во время ожидания сообщения.
    Поскольку во время работы обработчика приложение не отрабатывает сообщения, делайте его более коротким либо не забывайте запускать из него процедуру ProcessMessages.
        Ниже приведен код использования обработчика для вывода текущего времени в объекте TPanel.

        procedure TFormI.OnIdleHandler(Sender: TObject; var Done: Boolean);
        begin
            pnlTime.Caption:= TimeToStr(Now);
        end;
     

    Компонент TScreen
        Класс TScreen инкапсулирует состояние экрана или выводимой области. Delphi во время работы автоматически создаст экземпляр класса Screen. Для его использования в раздел uses нужно включить модуль Forms.

    Свойства TScreen

    ActiveControl
        Это свойство возвращает объект TWinControl, имеющий фокус ввода. Обычно оно используется для реализации команд Copy, Cut и Paste для текстовых управляющих элементов. Следующий код, помещенный в обработчик TMenuItem, выполняет функцию Copy.

        procedure TFormI.mnuEditCopyClick(Sender: TObject);
        begin
            Screen.ActiveControl.Perform(WM_COPY,0,0);
        end;

        Все, что происходит в мире Windows, базируется на сообщениях. Для выполнения какой-либо функции управляющие элементы часто отсылают сообщения самим себе. Так и в этом примере управление происходит путем передачи сообщения WM_COPY.

    ActiveForm
        Это свойство возвращает объект TForm, имеющий фокус ввода. Если приложение неактивно, свойство указывает, какая именно форма будет иметь фокус ввода при активизации приложения. В качестве примера используем свойство для создания мигающего заголовка формы, чтобы привлечь внимание пользователя. Функция Windows API, предназначенная для этой цели, должна получить дескриптор окна:

        FlashWindow(Screen.Active Form.Handle,False);

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

        {Придать курсору форму песочных часов.}
         Screen.Cursor:= crHourglass;
         try
                {Попытаемся ничего не делать какое-то время.}
                for iCount:=1 to 1000000000 do;
         finally
                {Восстановим форму указателя.}
                Screen.Cursor:= crDefault;
         end;

        Форму указателя можно изменить для каждого потомка TControl (включая ТForm) отдельно.

    Forms и FormCount
        Эти свойства возвращают список форм и их количество. Работа с ними ничем не отличается от работы со списком дочерних окон, описанных в разделе "MDIChildren и MDIChildCount".

    Height и Width
        Это наиболее полезные свойства, возвращающие высоту и ширину экрана в пикселях. Они могут применяться во многих ситуациях, например при определении местоположения формы. Вот как поместить форму в центре экрана.

        Left:= (Screen.Width - Width) div 2;
       Top:= (Screen.Height - Height) div 2;

    События TScreen
        TScreen предоставляет два основных события, извещающие программу об изменении фокуса ввода. Подобно возможностям класса TApplication, возможности класса TScreen доступны лишь при выполнении.

    OnActiveControlChange
        Это событие возникает при передаче фокуса ввода от одного управляющего элемента к другому. Свойство
    ActiveControl обновляется непосредственно перед вызовом события. Вы можете использовать событие, например, для вывода текста подсказки в строке состояния.

        procedure TFormI.ActiveControlChangeHandler(Sender: TObject);
        begin
            if (not Application.Terminated) then
            pnlStatus.Caption:= ActiveControl.Hint;
        end;

        Проверка связана с тем, что событие генерируется и при закрытии приложения, а при этом обращение к уже уничтоженному объекту вызовет исключительную ситуацию.

    OnActiveFormChange
        Событие генерируется при создании новой формы или передаче фокуса ввода от одной формы к другой. Обычно это событие используется в MDI-приложениях для обновления доступных функций меню и кнопок-ускорителей. Ниже приведен пример из шаблона MDI-приложения.

        procedure TMainForm.UpdateMenuItems(Sender: TObject);
        begin
            FileCloseItem.Enabled:= MDIChildCount 0;
            FileSaveItem.Enabled:= MDIChildCount 0;
            FileSaveAsItem.Enabled:= MDIChildCount 0;
        end;

        Процедура UpdateMenuItems назначена в качестве обработчика событию OnActiveFormChange в обработчике
    OnCreate.

        procedure TMainForm.FormCreate(Sender: TObject);
        begin
            Application.OnHint:= ShowHint;
            Screen.OnActiveFormChange:= UpdateMenuItems;
        end;

    Разделяемые обработчики событий
        Как вы уже знаете, каждый класс способен генерировать свои собственные события. Каждое из них имеет определенный тип, как, например, TNotifyEvent у OnClick и TCloseEvent у OnClose. Delphi позволяет написать один обработчик события и назначить его нескольким событиям одновременно.
        Представьте себе объект TEdit, генерирующий события OnKeyDown и OnKeyUp. Поскольку оба события — одного типа, можете написать одну процедуру и назначить ее обоим событиям. Процедура будет вызываться дважды при каждом нажатии клавиши (при нажатии и отпускании). Или, например, вы можете создать один обработчик для событий OnCreate и OnClick.
        Еще одно общее назначение разделяемых обработчиков — обработка событий от двух различных управляющих элементов, которые могут и не быть экземплярами одного класса.
        Вот как создать разделяемый между классами TButton и TEdit обработчик OnClick.

  • Выберите из меню File/New Application для создания приложения.
  • Поместите TButton в форму и введите в обработчик OnClick следующий код.

  •         procedure TFormI.ButtonlClick (Sender: TObject);
            begin
                Editl.SetFocus;
                Editl.SelectAll;
            end;
  • Поместите TEdit в форму. В Object Inspector выберите в списке для события OnClick обработчик ButtonClick.

  •     Теперь после щелчка на кнопке и на объекте TEdit будут выполняться одни и те же действия, фокус ввода будет передаваться управляющему элементу TEdit, и весь текст в нем будет выделяться.

    Параметр Sender
        Поскольку множество объектов может разделять один обработчик событий, необходимо уметь выяснять, какой именно обработчик его сгенерировал. Для этого предназначен параметр Sender, передаваемый в каждый обработчик, который указывает на объект, сгенерировавший событие. Часто этот параметр используется для различных действий обработчика в зависимости от того, кто именно породил событие.

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

    Поиск по заголовкам окон
        При создании экземпляра окна Windows требует зарегистрировать имя класса окна (window class name). Delphi использует класс формы в качестве имени класса окна, например, когда Delphi создает экземпляр Form1 класса TForm1, TForm1 используется в качестве имени для регистрации окна Form1. Каждая форма имеет свойство Caption, известное как заголовок окна (window title). Эти два параметра позволяют искать окно с помощью функции Windows API FindWindow, возвращающей дескриптор найденного окна.
        Эту функцию нельзя вызывать из класса TForm1, так как к тому времени окно уже будет создано, и вы окажетесь в глупом положении, найдя сами себя. Вот код, который должен находиться в файле проекта.

    begin
            Application.Initialize;
            if FindWindow('TFormi','Formi') о 0 then Application.Terminate;
            Application.Create Form(TForm1,Form1);
            Application.Run;
         end.

        Поскольку вы используете функцию Windows API, проследите, чтобы был подключен модуль Windows.
    Если вы запускаете это приложение из Delphi, учтите, что Form Designer уже создал такое окно, и вы всегда сможете его найти. Это приложение следует запускать отдельно, закрыв Delphi.
        Изменив свойство Caption или Name, вы рискуете не найти своего окна и придется повозиться с кодом программы, чтобы отследить эти изменения. Может возникнуть ситуация, когда простое совпадение приведет к тому, что окно будет найдено в совсем другом приложении, которое будет опознано как свое.

    Активизирование существующей копии
        Все-таки, сказать пользователю "Ты уже запустил одну копию, теперь иди и ищи ее!"— как-то негуманно... Более профессиональным решением будет активизировать существующую копию с помощью другой функции Windows API — SetForegroundWindow. Измените проект следующим образом.

        var
            hwndPrev: HWND;
        begin
            Application.Initialize;
            hwndPrev:= FindWindow('TFormi','Formi');
            if hwndPrev < 0 then
            begin
                SetForegroundWindow(hwndPrev);
                Application.Terminate;
            end;
            Application.CreateForm(TFormi,Formi);
            Application.Run;











    helloworld.ru © 2001-2021
    Все права защищены