Главная страница ЕЖИдневника


Уроки по Delphi

Урок 6
Внеурочье
Урок 5 Графические часы
Урок 4
Внекласс-1
Урок 3
Урок 2
Урок 1
Урок 0
Уроки по Dephi

Урок 2. Выводим дату

Исходные тексты программы здесь


Работа с событиями в инспекторе объектов. Функция даты. Функция перевода формата даты в строку. Специальные символы в строке. Оператор присваивания.

Прежде чем украшать программу, давай всё-таки сделаем так, что бы от неё была хоть какая-то польза. Выведем на экран текущую дату. Не бог весть какая полезность, но лиха беда начало.

1. Выдели форму (если ты только что открыла программу, то форма у тебя и выделена, иначе кликни по пустому месту формы или выбери форму из списка в инспекторе объектов). Пока у тебя в проекте имеются только два компонента: форма и метка. Так вот, выделена должна быть форма.

2. В инспекторе объектов переключись на закладку Events (закладка Properties - свойства, а Events - события). Найди событие OnCreate и сделай на нём двойной щелчок. В тексте программы у тебя появятся строки:

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

Процедура TForm1.FormCreate называется обработчиком события OnCreate.

3. Обрати внимание, что в тексте программы у тебя написано довольно много. Всё это Delphi написала самостоятельно, пока не обращай внимания на всё остальное. Давай разберёмся с этими тремя строками.

Слово procedure обозначает, что начинается описание процедуры, то есть обособленного участка программы, который не будет исполняться до тех пор пока не будет вызван. Слово FormCreate - это имя нашей процедуры. Слово TForm1 означает, что эта процедура принадлежит нашей форме. Sender - имя параметра, который передаётся процедуре (при вызове процедуры надо будет обязательно указывать реально существующий объект в качестве такого параметра). TObject - тип параметра. Обрати внимание на синтаксис: хозяин процедуры отделяется от имени точкой, параметры процедуры указываются в круглых скобках, завершается заголовок процедуры точкой с запятой.

Между словами begin и end заключается тело процедуры. В конце обязательно ставится точка с запятой.

Внимание, сюрприз! Всё, что я сказал по поводу заголовка процедуры - это пока для общего развития. Delphi уже почти всё сделала за нас, прописала заголовок процедуры в описании формы, связала эту процедуру с событием OnCreate, позаботилась о передаче параметра. Нам нужно написать только тело процедуры.

4. Напишем между словами begin и end следующий текст:

  Label1.Caption := Label1.Caption+#13#10+DateToStr(Date);

Не забудь отступить на два пробела от левого края. Здесь мы вызываем функцию Date, которая возвращает текущую дату в специальном формате, с помощью функции DateToStr переводим дату в строковый формат. Формируем строку путём сложения строк Label1.Caption (да, да это то самое свойство Caption нашей метки, которое на прошлом уроке мы правили в инспекторе объектов), двух специальных символов «перевод строки» (#13) и «возврат каретки» (#10) - их нам приходится задавать указывая соответствующие номера после символа диеза, и той строки, которую нам вернула функция DateToStr. Результат сложения присваиваем свойству Caption метки. Обрати внимание, что для присваивания используется последовательность символов «:=». В конце ставим точку с запятой.

5. Запустив программу, мы увидим, что теперь после строки «Здравствуй, Alёna!» печатается текущая дата. У тебя возник вопрос почему это происходит? Мы ведь нигде не вызывали процедуру TForm1.FormCreate! Она вызывается автоматически при возникновении события OnCreate, а оно в свою очередь при исполнении программы происходит один раз, сразу после создания формы.

Домашнее задание. Аналогично дате выведи время. Для определения времени служит функция Time, перевести время из специального формата в строку можно с помощью функций DateTimeToStr и TimeToStr.

В следующем уроке мы соорудим из нашей программы простенькие часы.

«Я не дурак, я всё ловлю на лету,
Но я не понял, что ты конкретно имела в виду…»

Во-первых, не Label1, а Label2. Поскольку у меня, как ты можешь видеть, две текстовые строки, логически взаимосвязанные друг с другом, поэтому разбивать их, вклинивая между ними указание временные указатели как минимум нелогично. Верно?

Во-вторых, я чего-то не догоняю… DateTimeToStr - насколько я понимаю, это функция для того, что программа одновременно выводила дату и время? А как она оформляется? При попытке написать вот такую команду:

Label2.Caption := Label2.Caption+#13#10+ DateTimeToStr (DateTime);

Изучаем Delphi. Рис.2.0.Дельфинчик сказал мне: «Сама дура» и начал подчёркивать красным (объясни, что такого жутко глупого я ему сказала?)… В результате имеем то, что имеем: две строки, одна из которых с датой, другая - с временем. Это смотрится неэстетично. :( А ещё мне не нравится то, что дата и время наследуют свойства Label2.Caption - если ты понимаешь, что я имею в виду. Мне бы хотелось, чтобы дата-время были в одну строку и печатались нормальным, неярким шрифтом. Не знаю, как вывести часы отдельной строкой, а не «присваивая» их к тексту второй текстовой строки? :о( Кстати, ИМХО, строка дата-время была бы гораздо более к месту в самом верху формы, до этого импровизированного «диалога» раздвоенной личности. ;о)

Зарубка на память (попрошу поправить, если поняла неверно значение):
#13 - это означает, что какая-то переменная будет выводиться с новой строки.
Я права?
#10 - это что-то типа выравнивания по левому краю? Этакий align="left"?
Кстати, а как сделать, например, по центру или справа?

Ну, поскольку этот урок я написал задолго до того, как ты засела за программирование, то я не мог знать, что ты используешь две метки. Да и должна же ты проявлять творческую самостоятельность?

DateTimeToStr действительно возвращает в текстовом виде дату и время. Если ты ей передашь в качестве параметра дату и время во внутреннем формате Delphi, который так и называется TDateTime и определяет количество суток, прошедшее с полуночи 30 декабря 1899. Функция Date возвращает целое число суток, а функция Time - дробь - часть суток. Таким образом, что бы получить дату и время «в одном флаконе» нужно сложить Date+Time.

Если ты не хотела чтобы дата и время печатались в рамках второй метки, то кто тебе мешал создать третью метку? И поместить её в верху формы?

А вот с символами #10 и #13 ты похоже не совсем поняла. :-( Это просто символы, такие же как и символы «-», «Д», «о», «б», «р» и т.д. Каждый символ имеет свой код, например символ «-» имеет код 189. Всего в таблице символов ANSI (которой мы пользуемся) имеется 256 символов. Символы с кодами от 32 до 255 являются отображаемыми символами и могут быть вставлены в любую строку программы как в виде самих себя так и в виде своего кода (со знаком диеза в начале), неотображаемые символы с кодами от 1 до 31 могут быть вставлены в строку только в виде кода, а символ с кодом 0 служит для того, что бы пометить конец строки. Когда твоя программа рисует метку, она перебирает все символы, которые ты присвоила свойству Caption и, если встречает символ с кодом 189, то рисует горизонтальную чёрточку с текущей позиции и смещает текущую позицию вправо, если встречает символы с кодами 13 и 10, то ничего не рисует и в первом случае смещает позицию вниз, а во втором - влево в самое начало строки. То есть это не аналог align="left", а скорее аналог отсутствия align и выравнить текст по центру или по правому краю таким способом нельзя.


Все комментарии (цензурные и по возможности грамотные) рассматриваются в порядке живой очереди, принимаются к сведению и даже публикуются на сайте. Так что если тебе есть что сказать по поводу вышепрочитанного - мыль сюда!!! ;)

пользовательское соглашение, политика конфиденциальности