Учебник по Delphi 4.0
- Название:Учебник по Delphi 4.0
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Учебник по Delphi 4.0 краткое содержание
Учебник по Delphi 4.0 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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;
end.
Глава 5. Создание элементов управления ActiveX
Большинству пользователей услышавших термин АсtiveX на ум сразу приходят элементы управления ОСХ по-новому названные в очередном маркетинговом трюке компании Microsoft. В некотором смысле это так Microsoft действительно использует термин ActiveX для обозначения технологии базирующихся на модели СОМ. Но аббревиатура OLE уже не охватывает всех этих технологий. Microsoft настолько расширила определение OLE, что разработчики уже давно считают сопутствующие технологии чем-то отдельным от OLE. Поэтому в профессиональную лексику был введен термин ActiveX, используемый для обозначения всех базирующихся на СОМ технологии, которые существуют на данный момент и будут созданы в будущем. На сегодняшний день ActiveX включает следующие технологии:
Читать дальшеИнтервал:
Закладка: