Урок Delphi 3

События Delphi




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Операционная система Windows - многозадачная, т.е. несколько программ в ней могут функционировать одновременно. Когда, например, мы щёлкаем по кнопке в окне нашей программы, система Windows определяет, что произошло событие именно в нашей программе, и посылает ей сообщение об этом. Наша программа должна соответствующим образом отреагировать на него. Для этого мы, как программисты, должны написать код-обработчик этого события. Таким образом, структура программы для Windows представляет собой набор подпрограмм, каждая из которых ответственна за обработку конкретного события и вызывается только при его возникновении. Удобство Delphi состоит в том, что мы избавлены от необходимости получать сообщения от Windows сами, Delphi это делает за нас. Каждый компонент имеет впечатляющий набор событий, на которые он может реагировать. Программист сам определяет, какие события в программе требуется обрабатывать.

События Delphi

   Откройте наш проект из предыдущего урока. Щелкните на компоненте Edit1. Он "появится" в Инспекторе объектов. Посмотрите: в Инспекторе объектов две вкладки: Properties (свойства) и Events (события). Перейдите на вкладку Events. Чтобы создать обработчик нужного события, нужно дважды кликнуть по нему мышкой. А если раскрыть выпадающий список, в нём будут находиться уже готовые обработчики, которые могут подходить для этого компонента. Таким образом, один обработчик может вызываться для обработки событий нескольких компонентов.

   Изменим нашу программу так, чтобы текст на форме появлялся прямо в момент его ввода. В момент ввода у Edit1 меняется свойство Text - в нём появляется новая буква! Значит, воспользуемся событием onChange (change - изменение (англ.)), которое и происходит в этот момент. Итак:

  1. Кликаем дважды по onChange, и оказываемся внутри только что созданного обработчика.
  2. Присваиваем свойству Caption компонента Label1 значение свойства Text компонента Edit1, то есть делаем то же, что и в прошлом уроке:

       Label1.Caption := Edit1.Text;

    Или просто копируем из обработчика нажатия кнопки.
  3. Запускаем программу, всё работает. Как видим, всё очень просто.

   Теперь рассмотрим событие onClick. Как вы догадываетесь, это событие возникает при щелчке мышкой на компоненте. Воспользуемся им, чтобы очищать строку ввода от уже введённых символов. Вы сами уже должны сообразить, что сделать. В обработчике нужно присвоить свойству Text значение пустой строки. Строка в Delphi образуется заключением текста в одинарные кавычки (находятся на кнопке Э):
    'Так в Delphi образуется строка'
Значит, пустая строка - это кавычки без текста: ''. Не должно быть даже пробела, иначе он окажется в строке ввода:

   Edit1.Text:='';

Есть другой способ, воспользоваться специально предназначенным для этого методом компонента Edit, который так и называется Clear (очистка англ.):

   Edit1.Clear;

   Но подумайте о пользователе, который будет работать с вашей программой. Ему должно быть удобно. Если при вводе текста он захочет что-то исправить, и щёлкнет мышкой в том месте текста, где нужно внести изменение?! И всё сотрётся! Поэтому лучше использовать событие onEnter, которое происходит, когда вы "входите" в него и компонент получает фокус ввода, или использовать для очистки специальную кнопку и её событие onClick.
   Конечно, у каждого компонента свой набор событий. Мы познакомились с тремя из них:
  • onChange
  • onClick
  • onEnter
   Другие важные события, которые есть почти у каждого визуального компонента:
  • onExit - возникает, когда компонент теряет фокус ввода;
  • onDblClick - возникает при двойном щелчке мышкой по компоненту;
  • onKeyDown - когда при нажатии на кнопку на клавиатуре она оказалась в нижнем положении;
  • onKeyUp - когда при отпускании клавиатурной кнопки она оказалась в верхнем положении;
  • onKeyPress - возникает при нажатии на клавиатурную кнопку. От событий onKeyDown и onKeyUp оно отличается типом используемого параметра Key ;
  • onMouseDown - когда при нажатии кнопки мышки она оказалась в нижнем положении;
  • onMouseUp - когда при отпускании кнопки мышки она оказалась в верхнем положении;
  • onMouseMove - возникает при перемещении указателя мышки над компонентом.
   В начале работы любой программы происходит очень важное событие событие нашего основного компонента - Формы, onCreate. Оно происходит перед появлением Формы на экране. Это событие используется для задания свойств тех элементов программы, которые нуждаются в настройке, например, размеры и положение Формы на экране. Если вы захотите сделать невидимую программу, можно приравнять нулю ширину Width и высоту Height Формы. На этапе проектирования сделать этого нельзя, т.к. это помешает работе, поэтому делаем это по событию onCreate:

   Form1.Width := 0;
   Form1.Height := 0;


Дополнительно нужно убрать и заголовок Формы, выбрав в Инспекторе Объектов параметр BorderStyle равным None. Теперь Форма на экране не появится. Единственным визуальным признаком останется появление её "значка" на панели задач. В дальнейшем я расскажу, как избавиться и от него.


Знакомство с компонентами Delphi            В начало урока          Переменные, константы и их типы

Уроки Delphi начинающим



Вопросы и комментарии (48)      Решение задач в Delphi

Vincent, добавлено 17.09.09, 02:26:41 
Нифига не понял с этого урока.. Тормоз наверно
CLICK_X01(icq - 481255015), добавлено 27.09.09, 16:21:48 
Красавчик,всё классно объяснил...
Noein, добавлено 22.10.09, 23:19:41 
Спасибо. Очень познавательно :)
шура, добавлено 12.11.09, 16:23:26 
даже до меня доперло))).
Andrush, добавлено 24.11.09, 14:35:04 
OnMouseMove понятно,а есть ли событие обратное этому,то есть когда мышь \"ушла\"?(на форме TLabel,при наведении мыши меняет размер)или придётся обрабатывать событие OnMouseMove формы, TLabel1.Height:=минус столько то;?
Автор, добавлено 24.11.09, 17:03:21 
В Delphi7 у компонента TLabel есть событие onMouseLeave, которое как раз и происходит в момент, когда мышь выходит за пределы метки.
Валентин, добавлено 15.01.10, 17:47:54 
хм странно вроде пишу Label1.Caption := Edit1.Clear; выдает что тут есть ошибка хотя я даже копировал все ровно ошибка непонятно
Валентин, добавлено 15.01.10, 17:50:50 
аааааааааааааааааааа ну я и мавр!! доперло наконец надобыло так Label1.Caption := Edit1.text;Edit1.Clear!!!!! да уж хех все не так то и просто насамом деле)) ещё раз спс автор!
Ольга, добавлено 27.01.10, 23:35:53 
Автор! Поясните, пожалуйста, подробнее смысл onKeyDown, onKeyUp, onKeyPress, onMouseDown, onMouseUp.
onKeyPress - нажатие на любую кнопку?
onKeyDown, onKeyUp, onMouseDown, onMouseUp - выделение?
Автор, добавлено 28.01.10, 09:25:59 
Как ответить на вопрос? Я открываю Delphi (чего и Вам советую). Пустой проект. В инспекторе Объектов - Form1. Перехожу на Events. Нахожу нужное событие, например OnKeyDown. Создаю обработчик (двойной щелчёк по строчке). В нём пишу:
Caption:=IntToStr(Key);// так как Key - тип Word, то есть число (написано в заголовке обработчика)
Компилирую и щёлкаю по клавишам. В данном случае заголовок формы реагирует на нажатие всех клавиш, кроме некоторых служебных, в нижнем положении клавиши. Аналогично OnKeyUp, только при её отпускании!
В OnKeyPress Key имеет тип Char, то есть это символ. Поэтому этот обработчик реагирует на нажатия только клавиш с символами в нижнем положении клавиши.
Тот же смысл и для OnMouseDown и OnMouseUp - срабатывание на щелчёк в нижнем или верхнем положении. Обработчик дополнительно содержит переменные для указания какой именно кнопки, и точки на Форме - координаты щелчка.
Мастер, добавлено 19.10.10, 14:49:15 
Почему ошибка выбевает?? вам задали вопрос ранее.. ответьте пожалуйста - у меня такая же проблемка
Автор, добавлено 19.10.10, 15:25:57 
Какая ошибка? Ранее вопрос был про

Label1.Caption := Edit1.Clear;

Но это результат ошибочного прочтения текста. Читайте, там так:

Label1.Caption := Edit1.Text;
Edit1.Clear;

Или приведите вашу ошибку, посмотрим, что не получается.
Егор, добавлено 11.12.10, 17:16:49 
С уроком разобрался сразу, попробовал сделать без подсказок, все получилось!
Лютый, добавлено 27.12.10, 15:13:55 
я пишу все как здесь, программа не запускается!!!
Лютый, добавлено 27.12.10, 15:49:05 
а не, все получилось,
Антон, добавлено 27.01.11, 20:52:32 
А есть какая-нибудь команда ожидания? А то у меня события происходят очень быстро, а мне необходимо, что бы я мог видеть, что у меня высвечивается на экране.
Автор, добавлено 27.01.11, 21:20:48 
Например, оператор sleep(ms: Integer) вызывает задержку выполнения очередного оператора на ms миллисекунд. Но, при этом, почитайте про метод ProcessMessages (ссылка под меню на этой станичке).
Аноним, добавлено 4.04.11, 21:42:54 
если у меня курсовая на тему события в Delphi, могу ли я использовать этот материал или это не то?
Автор, добавлено 4.04.11, 21:55:08 
Для курсовой-то материала маловато, я бы сказал... Но если поможет, то ради бога.
Горю желанием научиться, добавлено 2.06.11, 13:35:28 
Спасибо автор уроки полезные и понятные, но вот вопрос:

*В момент ввода у Edit1 меняется свойство Text - в нём появляется новая буква!*- Смысле что за буква

Что должно быть изменено в *Label1.Caption := Edit1.Text ;* в этот момент
Автор, добавлено 2.06.11, 13:43:52 
Edit - компонент для ввода текстовой однострочной информации. Нажмите клавишу - эта буква появится в окошке. В этот момент меняется свойство Text у компонента. Я хочу сказать, как нам узнать в программе, что содержится в окне ввода? Нужно посмотреть значение свойства Text.
Горю желанием научиться, добавлено 2.06.11, 14:17:00 
Хотя нет я понял там все просто
Азамат, добавлено 25.06.11, 16:00:51 
Сайт хороший, задумки неплохие, но для гуманитариев ( таких как я) написано все равно сложновато. Некоторые моменты я так и не понял ( фокус ввода-что это?, событие onEnter-как его применять?). Что надо делать и как, до сих пор "втянуть" не могу. Конечно, для мозга с рациональной (математической, структурированной) системой мышления это просто семечки, но для тех, кто в танке здесь надо кучу нервов потратить, прежде чем дойдет. А так хочется научиться...
Автор, добавлено 25.06.11, 17:09:23 
Спасибо за ваш комментарий. Учту в будущей переработке. Но учиться нужно на практике. Какую программу нужно получить? Спрашивайте, что для этого нужно, пробуйте, и так далее. А так, чтобы сначала всё выяснить, а потом начать, наверное, не выйдет.

Кирилл, добавлено 21.11.11, 11:30:23 
В программировании новичок по вашим урокам можно быстро научиться)))
Стас, добавлено 24.12.11, 01:49:31 
Какая функция очистки экрана в консольном приложении?

Автор, добавлено 24.12.11, 10:31:56 
Нигде на сайте нет ничего про консольные приложения. Я их не изучал изначально, и помочь с ними не могу... Прощения просим.
Макс, добавлено 4.02.12, 13:31:46 
Кажется CLRSCR
Не думаю что работать с консолью так сложно и так нужно

Аннушка, добавлено 26.03.12, 16:33:20 
для чего,например, может пригодиться создание невидимой программы?)
Автор, добавлено 26.03.12, 16:39:04 
Для всяких пакостей! Вот сидит такая программа, и ждёт наступления некоторого события... Шутка.

Вот у меня есть прога, она следит за содержимым буфера обмена. И мне не приходится например некоторый текст постоянно копировать - глянул в трей, и вижу: данные в буфере.
Иван, добавлено 4.04.12, 08:44:47 
Подскажите, пожалуйста. Мне нужно процедуру обработки события нажатия кнопки вставить внутрь цыкла. Как это можно организовать? Спасибо.
Автор, добавлено 4.04.12, 11:52:15 
У кнопки есть метод Clik: Button1.Click; выполняющий щелчок по кнопке. Вот его и вставляйте внутрь цикла.
Иван, добавлено 4.04.12, 13:03:07 
Все равно не совсем понимаю как это сделать(( Попробую поподробней описать свою проблему.
Есть некая форма, на ней объекты Edit1, Button1 и StringGrid1 с k столбцами и n строками. Необходимо чтобы по нажатию кнопки с числом в поле Edit1 совершались некие действия и результат записывался в в ячейку i-го столбца j-й строки ("некие действия" связаны с предыдущими ячейками), за тем в Edit записывается новое число и при нажатии кнопки... и т.д.
Иван, добавлено 4.04.12, 14:12:38 
Или вот, сформулировал. Как сделать чтобы следующая итерация цикла происходила после нажатия кнопки?
Автор, добавлено 4.04.12, 16:56:49 
В начале цикла делайте задержку до нажатия кнопки. while Click do sleep(10); Click:=True; А в обработчике кнопки вставьте Click:=False;
Иван, добавлено 4.04.12, 17:33:23 
Спасибо!
александр, добавлено 26.04.12, 07:46:07 
Подскажите пожалуйста, что должно надо сделать, что-бы при нажатии для едит на инспектроре обектов у евентс очистился текст, или сто должно произойти. Вот нажимаю я на onclick два раза пишу edit1.text := ''; и ничего не изменяется
Автор, добавлено 26.04.12, 10:05:21 
Вы всё правильно делаете. Но очистка произойдёт не в Инспекторе объектов при проектировании, а уже при работе программы. Нажмите F9, и в программе щёлкните по едиту, всё и очистится. А чтобы очистить сразу, в Инспекторе сотрите текст в строке Text.
Александр, добавлено 26.04.12, 19:04:35 
спасибо
Тимур, добавлено 10.09.12, 21:27:23 
И снова спасибо автору. Замечательное разъяснение!
Виктор, добавлено 25.03.13, 20:37:39 
Подскажите, пожалуйста...что нужно написать в onEnter,чтобы текст не стирался при исправлении?
Автор, добавлено 25.03.13, 21:26:14 
Не совсем понятно - что за исправление?В статье я писал что не нужно стирать текст по щелчку (если вы уже редактируете текст), а лучше стирать при входе в компонент. А вы что имеете в виду?
Виктор, добавлено 26.03.13, 19:14:36 
Ну когда я пишу текст в Edit и хочу в нём например исправить ошибку,то при редактировании текст полностью стирается...
какую команду надо писать и где,чтоб продолжить редактирование без утери информации?

 
Автор, добавлено 27.03.13, 07:30:38 
Почему у вас текст полностью стирается? Вы используете пример из статьи?

Так там и написано - стереть. Для собственно редактирования вообще ничего не нужно - удалите операторы из обработчика, он пропадёт, и ничего стираться не будет.
Эдуард, добавлено 13.04.13, 14:41:58 
Азат прав несмотря что все получается (не с первого раза конечно)я таки и не понял по поводу var и переменых. Но не смотря НА ЭТО автору БОЛЬШОЕ СПАСИБО.
Александр, добавлено 19.04.13, 14:43:09 
Скажи а где все это можно скачать (текст)
Автор, добавлено 19.04.13, 16:34:14 
Чтобы смотреть страницу целиком, нужен локальный веб-сервер. А просто текст - копируй да сохраняй, если не лень. Лично мне проще зайти на сайт и прочитать.
начинающий програмист, добавлено 10.12.13, 20:11:01 
ничево не понятно
Оставить комментарий:

Имя  

Текст комментария

  





Интернет-магазин электрооборудования