|
Компонент Timer. неотображаемые компоненты. Копирование/вставка компонент на форме. Автоматическое удаление обработчиков событий. Если ты сделала домашнее задание, то знаешь, что текущее время можно получить с помощью функции Time, а перевести его в строковый формат функцией TimeToStr. А функцией DateTimeToStr у тебя получилось воспользоваться? Если ты подставляешь в эту функцию только время, то она выводит на экран правильное время, а дату 30.12.1899. Если же подставить только дату, то дата будет выведена правильно, а время программа вообще выводить не будет. Какой выход? Да нужно просто сложить дату и время: Label1.Caption := Label1.Caption+#13#10+DateTimeToStr(Date+Time); Если в обработчик события OnCreate формы поместить эту строку, то при запуске наша программа будет выводить текущую дату и время. Но это ведь не часы! Через секунду время изменится, а программа будет по-прежнему глупо выводить то время, когда она была запущена. Нужно найти событие, которое будет происходить каждую секунду (или чаще), и задать ему обработчик, в котором выводить новое время. Таким событием обладает компонент Timer. 1. В палитре компонет переключись на закладку System, найди и положи на форму компонент Timer (самая первая кнопочка с часиками). Это так называемый неотображаемый компонент. Во время разработки программы он рисуется в виде маленького квадратика, а при исполнении программы перестаёт отображаться, поэтому его можно положить в любое место формы, не переживая так сильно по поводу столь важной для тебя эстетики. 2. Создаём обработчик события OnTimer (закладка Events в инспекторе объектов, двойной клик на этом событии, не забудь выделить Timer, а то будешь полдня искать это событие у формы или у метки). Копируем в обработчик (в тело процедуры, между begin и end) строку: Label1.Caption := Label1.Caption+#13#10+DateTimeToStr(Date+Time); Внимание, вопрос! Что мы сделали не правильно? Запусти программу - увидишь. В самом деле, каждую секунду к нашей надписи прибавляется новая строка. А нам-то ведь надо что бы старое значение времени затиралось и на его месте писалось новое значение. Возможный выход: сделать ещё одну метку, и время и дату выводить уже в неё. 1. Выделяем метку Label1, копируем её в буфер (Ctrl+C), вставляем из буфера (Ctrl+V). Теперь у нас имеются две одинаковые метки Label1 и Label2, частично перекрывающие друг друга. Расположи их аккуратненько одна под другой. 2. Строку в обработчике события OnTimer таймера измени таким образом: Label2.Caption := DateTimeToStr(Date+Time); То есть, теперь мы будем каждый раз просто присваивать свойству Caption второй метки дату и время. 3. Обработчик события OnCreate формы теперь не нужен. Вспомни, что Delphi написала сама, а что писала ты. Так вот, удалять нужно только то, что ты набрала между словами begin и end. Если ты приведёшь процедуру к первозданному (пустому) виду, то при следующем сохранении Delphi сама удалит все неиспользуемые процедуры (можно, конечно, удалить и в ручную, но тогда придётся чистить в трёх местах). Часы практически готовы, есть только один ньюанс. Событие OnTimer происходит раз в секунду начиная с момента запуска программы. То есть, часы всё время запаздывают на то количество миллисекунд которое отделяет момент запуска программы от предыдущего «тика» часов. Конечно, на практике это мало актуально (часы на твоём компьютере могут врать гораздо сильнее), но всё-таки стоит уменьшить этот разрыв. 1. За то, как часто происходит событие OnTimer отвечает свойство Interval таймера. Это время в миллисекундах. По умолчанию стоит 1000 миллисекунд, разумно будет уменьшить это число до 100 или 200 миллисекунд. Разумеется при этом несколько возрастёт нагрузка на процессор, но для современных машин это совершенно не заметное увеличение нагрузки и пока мы не станем обращать на это внимания. Домашнее задание. Изменить внешний вид второй метки так, что бы было красиво. На следующем уроке сделаем так, что бы надписи автоматически изменяли размер подстраиваясь под ширину экрана. «Внимание, вопрос! Что мы сделали не правильно? Запусти программу - увидишь». К сожалению, я эту фразу прочитала уже после того, как запустила программу. То будет впредь мне наука: сначала читать урок до конца, а уж потом обходить десятой дорогой ту услужливо подсунутую тобой тропинку, на которой ты заботливо подкладываешь мне грабли (вместо того, чтобы подстелить соломки). Что мы сделали не так? Да комп не проапгрейдили перед тем, как посадить меня за программинг! Что я увидела? Пресловутый «синий экран смерти» - не больше и не меньше! Комп повис наглухо, пришлось сделать ему жестокий жёсткий перезагруз. :( Кстати, ты мог бы и объяснить мне, чайнику ламерному, что такое «метка», которой надо было сделать сначала «Ctrl+C», а потом «Ctrl+V». С меня семь потов сошло, эти фразы «-Здравствуй…» и иже с нею я набирала раз 15 в разных реинкарнациях проги, пока, наконец, додумалась выделить щелчком левой кнопки мыши собственно саму надпись «Спасибо…» на форме и сделать ей эту харакирю. Прокатило. Заработало. Но мои мозги к тому моменту сварились вкрутую… Когда меня заглючило в другом месте проги, хотела уж было позвонить тебе на трубу, но обнаружила, что забыла бросить на неё денег. :( Короче, метро закрыто, в такси не содють, пришлось самой выяснять, что глупый Дельфин отказывается понимать вполне нормальное слово Data. Зато теперь меня можно разбудить даже среди ночи, и я на полном автопилоте расскажу тебе по памяти эту строчку: Label2.Caption := Label2.Caption+#13#10+DateTimeToStr(Date+Time) Правда, я не понимаю, на кой она мне нужна, если есть гораздо более короткие пути? Типа нормальные герои всегда идут в обход? Чем в конечном итоге закончилось дело, вы можете узнать, скачав этот архив и откомпилировав мою программу самостоятельно… Немного о том, как я это сделала… Программа учитывает все основные требования дяди Саши, но есть и немного самоуправства (и правильно, будет знать, как уезжать и оставлять меня без присмотра наедине с Дельфинчиком!). Компонентов Label у меня уже 5: А откуда взялась ещё одна строка с текстом «Тебе не кажется, зайка, что ты слишком долго спишь? ;(»? А вот это и есть моё мелкое хулиганство. :) В палитре «Standart» есть такой компонент - TMemo. Если по нему дважды щёлкнуть мышкой, то на форме появляется страшноватое на вид окошко для ввода достаточного большого текста. Путём нехитрых манипуляций я привела его в божеский вид: 1. Поменяла цвет фона со стандартного белого на цвет фона всей формы (Color); 2. Избавилась от ненужной объёмной рамки (Properties - BorderStyle - bsNone). Затем там, в Properties, же нашла меню Lines, активизировала его и нажала на кнопочку с троеточием рядом с (TStrings), во всплывшем окошке ввела нужный мне текст и нажала «ок». Настроила внешний вид этого компонента. Затоптала кнопочку копиляции и насладилась результатом. А теперь жду порции ругачек от дяди Саши за то, что лезу поперёк батьки в пекло и нарушаю его далеко и надолго продуманный план моего обучения. ;) Пока он не начал ругаться, задам ему несколько вопросов (авось, забудет о воспитательной беседе за ответами). Вопросы: 1.На кой это глупое водоплавающее млекопитающее создаёт такое огромное количество файлов (кажется, 9, да?), ей что, больше заняться больше нечем? 2.Я в своих лучших традициях «криворукого чайника» за вечер успела сделать две глупости: 3. И ещё один вопрос-наблюдение: в промежуток между 23:59 одного дня и 00:00 другого наступает промежуток безвременья - остаётся только дата, таймер времени исчезает, очень хорошо это заметно, когда цвет формы и цвет метки различаются - метка по ширине на какую-то секунду укорачивается в два раза. Что это за шайтан? Хе! Ну вот синего экрана смерти я никак не ожидал. Это уже самоуправство твоего компьютера... Я полагал, что даже если ты не знаешь, что «метка» и «label» это одно и то же, то ты откроешь словарь и переведёшь. На счёт самостоятельного выяснения отчего Дельфин не понимает «Data» мой тебе респект. Как мы и договаривались с самого начала, с такими проблемами тебе надо справляться самостоятельно. Да и вообще ругать тебя не за что. Наоборот, я чувствую, что взял слишком слабый темп, можно загружать тебя гораздо сильнее. Отвечаю на вопросы: 1. В нашем проекте имеется 10 файлов: 2. Что-то я не догоняю, что ты сумела сделать. Вроде всё правильно: копируешь все файлы в новую папку в WindowsCommander'е, затем в Delphi открываешь проект уже из нового места... Всё работает. По такой же схеме мы делаем и архивы программ для наших читателей. 3. Действительно «век живи - век учись». В полночь дробная часть даты/времени становится равна нулю и DateTimeToStr срабатывает некорректно. Очевидно придётся использовать функции DateToStr и TimeToStr. :-( Все комментарии (цензурные и по возможности грамотные) рассматриваются в порядке живой очереди, принимаются к сведению и даже публикуются на сайте. Так что если тебе есть что сказать по поводу вышепрочитанного - мыль сюда!!! ;) |
||