пятница, 5 марта 2010 г.

Время работы Windows

Сегодня снова поговорим про IC, но сейчас я покажу функции, которых нет в стандартных компонентах HiAsm. Вы также узнаете, где хранятся такие функции и как их использовать.

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

Нужная нам функция - это GetCurrentTime. Она не имеет параметров. Именно так её и прописывают в коде.



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



Разберём этот код.

var gct,h,m,s:integer; - это объявление переменных. Все они идут через запятую, потому что принадлежат одному типу - integer, то есть целое число.

gct := GetCurrentTime; - это присваивание переменной gct результата функции GetCurrentTime.

h := gct div 3600000; - это математическая операция. DIV - это целочисленное деление, то есть деление без остатка. Например, 5 div 3 = 1. А здесь мы получаем количество часов, потому что в одном часе 3 600 000 миллисекунд.

gct := gct mod 3600000; - тут мы узнаём остаток, потому что MOD - это остаток от деления. Например, 5 mod 3 = 2. Нам это необходимо, чтобы исключить часы, которые уже записаны в переменную h, и теперь в переменной gct останутся уже минуты.

Следующие операции аналогичны вышеописанным, только происходит извлечение уже не часов, а минут и секунд. После последней операции mod в переменной gct содержатся только миллисекунды.


При выводе мы пользуемся функцией int2str, потому что нужно преобразовать числа в строки (при сложении чисел и сложении строк получаются разные результаты. Например, при сложении числе 23 и 56 получится 79, а при сложении строк 23 и 56 получится 2356). Также мы добавляем двоеточие между часами, минутами, секундами и миллисекундами.

Теперь программ уже неплохо отображает время, но осталась одна маленькая неприятность: если число однозначное, то оно так и выводится, например 33:1:560 вместо 33:01:560. Ведь ноль слева не нужен для чисел, а вот для нас он нужен.

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



Обратите внимание на изменения! Самое первое - изменился тип переменных h, m, s. Дело в том, что теперь мы присваиваем им не числа, а строки, потому что результаты математических операций сразу преобразовываем в строки. А затем идёт конструкция if…then…else, про которую я рассказывал в предыдущих статьях. Мы проверяем длину строки, и если она равна 1, то слева добавляем ноль. Помните, что ноль добавляется именно в виде строки, а не в виде числа, а потому заключён в кавычки.

И только переменная gct остаётся у нас числовой переменной, поэтому при выводе на событие мы преобразовываем её в строку.


Теперь о том, где можно найти разные функции. Как уже говорилось, WinAPI нужно искать в справочниках по WinAPI. Различные функции KOL можно найти в самом KOL (compiler\fpc\KOL.pas). Там к ним есть описание. Помните только, что для использования функций какой-либо библиотеки она должна быть подключена в разделе uses.






Заболела кошка - вам поможет вызов ветеринара на дом. На дому выполняются разные услуги, например ультразвуковое исследование органов.

14 комментариев:

  1. Админ а куда замечательные видео уроки пропали ? хотелось бы и к этому уроку видео.

    ОтветитьУдалить
  2. Они не пропали - они ещё не готовы. Скоро будут готовы новые видеоуроки, в том числе и для этого поста.

    ОтветитьУдалить
  3. Мне тоже очень хотелось бы поскорей увидеть новые видео уроки.
    Администратору большое спасибо!

    ОтветитьУдалить
  4. Подскажите пожалуйста, как сохранить все настройки созданной программы при выходе не обращаясь к диалогу сохранения.
    Например, такие настройки:
    выбранные пункты в выпадающих списках
    отмеченные галочки в чебоксах
    состояние счетчиков и т.д.
    Если этих настроек очень много?

    ОтветитьУдалить
  5. В конце этого урока я рассказывал про сохранение настроек. При выходе - у формы есть событие onClose.

    ОтветитьУдалить
  6. Почему то не получается, видимо делаю, что то не то.
    1. взял элемент INI подключил его к форме:
    2. подключил onCloce к doWrite
    3. подключил onCreate к doRead
    4. установил параметры элемента INI:
    FileName - param.ini
    Section - пусто (не знаю, что писать)
    Key - .ini
    Type - string
    Файл param.ini создается в каталоге с программой но не читается, настройки не сохраняются.
    Пожалуйста, что делать? Я тупой.

    ОтветитьУдалить
  7. Section - это секция, здесь люое название.
    Key - ключ, любое.

    Когда файл первый раз создастся, то вы всё увидите, где и что там записано.

    ОтветитьУдалить
  8. Ещё нужно записать в Value значение ключа, это любое ваше значение.

    ОтветитьУдалить
  9. Спасибо большое все получилось, хотя пока разобрался чуть голову не сломал.
    Для тех кто незнаком с элементом INI поясню:
    1. Элемент INI ставится на каждый элемент который необходимо сохранить.
    2. Если хотите, чтобы все настройки сохранялись в одном ini файле имя в свойствах FileName должно быть одинаковым.
    3. Key это номер строки в файле откуда читаются и сохраняются данные. Если данные разного типа то Key не должен иметь одинакового имени.
    4. Value это верхняя точка элемента INI куда "заливаются" данные.
    Есть один нюанс: если при сохраненых настройках вы открыли программу, ничего не выбрали и закрыли, то настройки которые были сохранены до этого пропадут. Чтобы этого не происходило нужно, чтобы данные с INI файла при открытии считывались и поступали вновь в элемент INI

    ОтветитьУдалить
  10. Кто может подсказать вот какой вопрос:
    При выборе рисунка в качестве фона формы он почему то отображается не корректно. В редакторе формы в hiasm отображается нормально, но когда запускаешь приложения - часть рисунка либо невидно, либо он загораживает заголовок окна.
    Это недоработки программы или в настройках что то не то? Можно ли как нибудь это исправить? Хочется красивый интерфейс.

    ОтветитьУдалить
  11. Огромнейшее спасибо!
    Все оказалось элементарно просто!
    Только пришлось дать согласие в этом варианте тоскать окно за любое место. Иначе его не сдвинуть с места.
    Еще раз спасибо!!!

    ОтветитьУдалить
  12. а не подскажите, в программе сделано, чтобы настройки сохранялись в ini файл, настройки вида file=file.doc
    при вводе в программе вводится все нормально, но в ини файле вместо этого сохраняются только 0. если вводить цифры. то они сохраняются в ини правильно... как сделать, чтобы сохранялись буквенные значения??

    ОтветитьУдалить
  13. Свойство Type=String, и всё будет ОК.

    ОтветитьУдалить