TConvType — Тип Delphi

Преобразование функцией Convert в Delphi

Случайно нашел встроенную функцию преобразования Convert. Это Unit под названием StdConvs. Этот файл имеет в себе данные типа:
// Distance Conversion Units
// basic unit of measurement is meters

cbDistance: TConvFamily;
duAngstroms: TConvType;
duMicrons: TConvType;
duMillimeters: TConvType;
duMeters: TConvType;
duKilometers: TConvType;
duInches: TConvType;
duMiles: TConvType;
duLightYears: TConvType;
duFurlongs: TConvType;
duHands: TConvType;
duPicas: TConvType;

Delphi Convert возвращает недопустимые типы

0 Revski [2020-12-05 18:55:00]

Я пытаюсь выполнить самую простую из Conversions в delphi, используя встроенную функцию Convert.

Просто конвертировать галлоны в литры.

Однако delphi возвращает недопустимый тип в единицах преобразования.

Галлоны и литры имеют форму TConvTypes

Однако, когда я пытаюсь выполнить код, Delphi возвращает следующее.

Это должна быть самая простая операция после прочтения документации Embarcadero, которая должна работать. На данный момент я не могу понять, что происходит.

Может кто-нибудь указать мне в правильном направлении?

Я редактировал сообщение, чтобы включить полный код устройства

1 ответ

Ваша программа должна изменять значения vuUKGallons и vuLiters или использовать разные. Эта программа:

Но эта программа:

Как и эта программа:

Вы должны использовать переменные vuXXX определенные в модуле System.StdConvs .

Обновить

Увидев ваш полный код, теперь ясно, что произошло.

content-type — Любой способ угадать тип mime на Delphi XE2?

Мне нужно угадать тип mime с целью заполнения заголовка Content-Type для некоторых загрузок файлов.

Я не нашел для него решения.

Я хочу называть что-то вроде: GetMimeType(C:File.jpg) и вернуться image/jpg .

Лучше, если это multipataform (для win/osx), но будет достаточно, если только для окон.

    2 4
  • 10 май 2020 2020-05-10 14:49:56
  • mamcx

4 ответа

Сколько типов файлов вы говорите? Возможно, вы можете просто создать список типов, которые хотите поддерживать.

Я могу представить, что эти списки также доступны в Интернете, например

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

  • 10 май 2020 2020-05-10 14:49:58
  • GolezTrol

IE использует GetClassFileOrMime и FindMimeFromData API для обнаружения типа/данных типа mime ( UrlMon unit в Delphi).

CLSID, возвращенный из GetClassFileOrMime , может быть расположен в реестре под HKEY_CLASSES_ROOTCLSID MimeTypes . (также FileExtensions , FriendlyName ).

В реестре также содержится база данных MIME: HKEY_CLASSES_ROOTMIMEDatabaseContent Type .

Но так как список известных типов MIME относительно невелик, вы можете сохранить это как XML-ресурс (или что-то еще) и просто извлечь его из там. Это будет поддерживать как Windows, так и OSX.

Для загрузки файлов вы всегда можете использовать application/octet-stream .
Indy имеет класс TIdMimeTable ( IdGlobal ) и использует фиксированный список плюс проверку реестра HKEY_CLASSES_ROOT (см. FillMimeTable ). Если совпадение не найдено, используется application/octet-stream .
Вероятно, вам нужно будет проверить содержимое файла на стороне сервера после загрузки файла и не полагаться на заголовки, поскольку ContentType может быть изменен на стороне клиента, а также не совпадает с реестром на стороне сервера.

Генерация HTTP запросов

В последнее время я все более часто наблюдаю в основном форуме РНРClub вопросы на тему создания POST и GET запросов, а так же вопросы на тему: «Как мне посредством функции header сформировать POST запрос». Я считаю, что уже давно назрела необходимость расставить точки над «и» в использовании данной технологии, поскольку начинающие программисты просто не понимают принципов работы веба, как такового. Итак, начнем наше путешествие по миру протокола HTTP.

1. Протокол HTTP. Введение

Сразу хочу уточнить одну маленькую вещь. Страшное слово протокол есть не что иное, как соглашение множества людей, просто в один прекрасный момент люди решили: «Давайте будем делать так, и тогда все будет в порядке». Бояться нечего, все просто до безобразия и это безобразие мы сейчас будем вскрывать. Итак, что же это такое протокол HTTP и с чем его едят?

1.1 Клиент и сервер

Чудес в мире, а тем более в мире программизма и интернета не бывает! Усвойте это как незыблемую истину. И, если программа не работает или работает не так как хочется, то, значит, скорее всего, она либо написана не правильно, либо содержит ошибки. Итак, как же все-таки браузер просит сервер прислать ему хоть что-нибудь? Да очень просто! Надо только немного расслабиться и начать получать удовольствие от процесса :-)

1.2. Пишем наш первый HTTP запрос

Если Вы думаете, что все слишком сложно, то Вы ошибаетесь. Человек так устроен, что просто не способен создавать что-то сложное, иначе он сам в этом запутается :-) Итак, есть браузер и есть Web-сервер. Инициатором обмена данными всегда выступает браузер. Web-сервер никому, никогда просто так ничего не пошлет, чтобы он что-нибудь отправил браузеру — надо, чтобы браузер об этом попросил. Простейший HTTP запрос моет выглядеть, например, так:

GET http://www.php.net/ HTTP/1.0\r\n\r\n

  • GET (В переводе с английского означает «получить») — тип запроса, тип запроса может быть разным, например POST, HEAD, PUT, DELETE (часть из них мы рассмотрим ниже).
  • http://www.php.net/ — URI (адрес) от которого мы хотим получить хоть какую-нибудь информацию (естественно мы надеемся подучить HTML страницу).
  • HTTP/1.0 — тип и версия протокола, который мы будем использовать в процессе общения с сервером.
  • \r\n — конец строки, который необходимо повторить два раза, зачем, станет понятно немного позднее.

Вы можете выполнить данный запрос очень просто. Запустите программу telnet.exe, введите в качестве хоста www.php.net, укажите порт 80, и просто наберите данный запрос, нажав два раза Enter в качестве \r\n\r\n. В ответ вы получите HTML код главной страницы сайта www.php.net.

1.3 Структура запроса

Рассмотрим, из чего состоит HTTP запрос. Все достаточно просто. Начнем с того, что HTTP запрос — это вполне осмысленный текст. Из чего же он состоит в общем случае? Будем рассматривать протокол HTTP 1.0. Итак:

Request-Line [ General-Header | Request-Header | Entity-Header ]\r\n[ Entity-Body ]

    Request-Line — строка запроса

Формат: «Method Request-URI HTTP-Version\r\n»

  • Method — метод, которым будет обрабатываться ресурс Request-URI, может быть GET, POST, PUT, DELETE или HEAD.
  • Request-URI — относительная или абсолютная ссылка на страницу с набором параметров, например, /index.html или http://www.myhost.ru/index.html или /index.html?a=1&b=qq. В последнем случае серверу будет передан запрос с набором переменных a и b с соответствующими значениями, а знак «&» — амперсант служит разделителем между параметрами.
  • HTTP-Version — версия HTTP протокола, в нашем случае «HTTP/1.0».
  • Нам крайне интересны методы обработки GET и POST. Методом GET можно просто передать параметры в скрипт, а методом POST можно эмулировать submit формы.

    Для метода GET, Request-URI может выглядеть, например, так: «/index.html?param1=1&param2=2».

      General-Header — главная часть заголовка.
      Формат: [Date: value\n | Pragma: no-cache\n]
      Может иметь только два параметра: Date или Pragma. Date — дата по Гринвичу в формате «День недели, Число Месяц Год ЧЧ:ММ:СС GMT», например, «Tue, 15 Nov 1994 08:12:31 GMT» — дата создания запроса. Pragma может иметь одно значение no-cache, которое запрещает кэширование страницы.

    Илон Маск рекомендует:  Как сделать блок со скруглёнными уголками через CSS3

    Request-Header — часть заголовка, описывающая запрос.

    Request-Header может иметь следующие параметры: Allow, Authorization, From, If-Modified-Since, Referer, User-Agent.
    В данной главе мы не будем рассматривать параметр Autorization, так как он используется для доступа к закрытым ресурсам, что требуется не так уж часто. Вы можете самостоятельно изучить формирование заголовка для авторизованного доступа на сайте www.w3c.org.

    Allow — задает допустимые методы обработки.
    Формат: «Allow: GET | HEAD\n».
    Параметр игнорируется при указании метода обработки POST в Request-Line. Задает допустимые методы обработки запроса. Прокси сервера не модифицируют параметр Allow и он в неизменном виде доходит до сервера.

    From — e-mail адрес, пославшего запрос.
    Формат: «From: adderss\r\n».
    Например, «From: myname@mailserver.ru\r\n».

    If-Modified-Since — указывает, что запрос не модифицировался с такого-то времени.
    Формат: «If-Modified-Since: date\r\n»
    Используется только для метода обработки GET. Дата указывается по Гринвичу в таком же формате, как и для параметра Date в General-Header.

  • Referrer — абсолютная ссылка на страницу, с которой произошла инициация запроса, т. е. ссылка на страницу, с которой пользователь перешел на нашу.
    Формат: «Referrer: url\n».
    Пример: «Referrer: www.host.ru/index.html\n».
  • User-Agent — тип браузера.
    Например: «User-Agent: Mozilla/4.0\n»

    Entity-Header — часть заголовка, описывающая данные Entity-Body.
    В данной части запроса задаются параметры, которые описывают тело страницы. Entity-Header может содержать следующие параметры: Allow, Content-Encoding, Content-Length, Content-Type, Expires, Last-Modified, extension-header.

    Allow — параметр аналогичный Allow из General-Header.

    Content-Encoding — тип кодирования данных Entity-Body.
    Формат: «Сontent-Encoding: x-gzip | x-compress | другой тип\n».
    Пример: «Сontent-Encoding: x-gzip\n». Символ «|» означает слово «или», то есть то или то или то и.т.д.
    Другой тип может указывать на способ кодирования данных, например, для метода POST: «Сontent-Encoding: application/x-www-form-urlencoded\n».

    Content-Length — количество байт, пересылаемых в Entity-Body. Значение Content-Length имеет совсем другой смысл для данных, пересылаемых в формате MIME, где он выступает как параметр описания части данных — «external/entity-body». Допустимыми являются целые числа от нуля и больше.
    Пример: «Content-Length: 26457\n».

    Content-Type — тип передаваемых данных.
    Например: «Content-Type: text/html\n».

    Expires — Время, когда страница должна быть удалена из кэша браузера.
    Формат: «Expires: date\n». Формат даты алогичен формату даты для параметра Date из General-Header.

    Last-Modified — время последнего изменения пересылаемых данных.
    Формат: «Last-Modified: date\n». Формат даты алогичен формату даты для параметра Date из General-Header.

  • Extention-header — часть заголовка, которая может предназначаться, например, для обработки браузером, или другой программой, которая принимает документ. В данной части можно описывать свои параметры в формате «ParameterName: parametervalue\n». Данные параметры будут игнорироваться, если программа-клиент не знает, как их обработать.
    Например: «Cookie: r=1\r\n» — устанавливает всем известные печеньки для страницы.
  • А теперь после таких страшных слов давайте попробуем немного успокоиться и понять, что же нам надо? Понимать мы естественно будем на примерах.

    Давайте представим, что нам надо получить страницу с сайта, передав Cookies (Печеньки), иначе нас просто пошлют как незванных гостей, и более того, известно, что на данную страницу пускают только после того, как Вы побывали на главной странице сайта.

    2 Метод GET

    Напишем наш запрос.

    GET http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    \r\n

    Данный запрос говорит нам о том, что мы хотим получить содержимое страницы по адресу http://www.site.ru/news.html, использую метод GET. Поле Host говорит о том, что данная страница находится на сервере www.site.ru, поле Referer говорит о том, что за новостями мы пришли с главной страницы сайта, а поле Cookie говорит о том, что нам была присвоена такая-то кука. Почему так важны поля Host, Referer и Сookie? Потому что нормальные программисты при создании динамических сайтов проверяют данные поля, которые появляются в скриптах (РНР в том числе) в виде переменных. Для чего это надо? Для того, например, чтобы сайт не грабили, т.е. не натравливали на него программу для автоматического скачивания, или для того, чтобы зашедший на сайт человек всегда попадал бы на него только с главной страницы и.т.д.

    Теперь давайте представим, что нам надо заполнить поля формы на странице и отправить запрос из формы, пусть в данной форме будет два поля: login и password (логин и пароль),- и, мы естественно знаем логин и пароль.

    GET http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    \r\n

    Логин у нас «Petya Vasechkin» Почему же мы должны писать Petya%20Vasechkin? Это из=за того, что специальные символы могут быть распознаны сервером, как признаки наличия нового параметра или конца запроса и.т.д. Поэтому существует алгоритм кодирования имен параметров и их значений, во избежание оштбочных ситуаций в запросе. Полное описание данного алгоритма можно найти здесь, а в PHP есть функции rawurlencode и rawurldecode для кодирования и декодирования соответственно. Хочу отметеить, что декодирование РНР делает сам, если в запросе были переданы закодированные параметры. На этом я закону первую главу знакомства c протоколом HTTP. В следуючей главе мы рассмотрим построение запросов типа POST (в переводе с английского — «отправить»), что будет гораздо интереснее, т.к. именно данный тип запросов используется при отправке данных из HTML форм.

    3. Метод POST.

    В случае HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data. Различия между данными алгоритмами весьма существенные. Дело в том, что алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы. Итак, давайте рассмотрим эти алгоритмы на примерах.

    3.1 Content-Type: application/x-www-form-urlencoded.

    Пишем запрос, аналогичный нашему запросу GET для передачи логина и пароля, который был рассмотрен в предыдущей главе:

    POST http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    Content-Type: application/x-www-form-urlencoded\r\n
    Content-Length: 35\r\n
    \r\n
    login=Petya%20Vasechkin&password=qq

    Здесь мы видим пример использования Content-Type и Content-Length полей заголовка. Content-Length говорит, сколько байт будет занимать область данных, которая отделяется от заголовка еще одним переводом строки \r\n. А вот параметры, которые раньше для запроса GET помещались в Request-URI, теперь находятся в Entity-Body. Видно, что они формируются точно также, просто надо написать их после заголовка. Хочу отметить еще один важный момент, ничто не мешает, одновременно с набором параметров в Entity-Body, помещать параметры с другими именами в Request-URI, например:

    POST http://www.site.ru/news.html?type=user HTTP/1.0\r\n
    .
    \r\n
    login=Petya%20Vasechkin&password=qq

    3.2 Content-Type: multipart/form-data

    Как только интернет мир понял, что неплохо бы было через формы отсылать еще и файлы, так W3C консорциум взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

    Каковы же основные отличия этого формата от типа application/x-www-form-urlencoded?

    Главное отличие в том, что Entity-Body теперь можно поделить на разделы, которые разделяются границами (boundary). Что самое интересное — каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в Mail письме Вы одновременно с текстом можете передавать файлы).

    Итак, приступим. Рассмотрим опять все тот же пример с передачей логина и пароля, но теперь в новом формате.

    POST http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
    Content-Length: 209\r\n
    \r\n
    —1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name=»login»\r\n
    \r\n
    Petya Vasechkin\r\n
    —1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name=»password»\r\n
    \r\n
    qq\r\n
    —1BEF0A57BE110FD467A—\r\n

    Илон Маск рекомендует:  Атрибут manifest в HTML

    Теперь давайте разбираться в том что написано. :-) Я специально выделил некоторые символы \r\n жирным, чтобы они не сливались с данными. Присмотревшись внимательно можно заметить поле boundary после Content-Type. Это поле задает разделитель разделов — границу. В качестве границы может быть использована строка, состоящая из латинских букв и цифр, а так же из еще некоторых символов (к сожалению, не помню каких еще). В теле запроса в начало границы добавляется ‘—‘, а заканчивается запрос — границей, к которой символы ‘—‘ добавляются еще и в конец. В нашем запросе два раздела, первый описывает поле login, а второй поле password. Content-Disposition (тип данных в разделе) говорит, что это будут данные из формы, а в поле name задается имя поля. На этом заголовок раздела заканчивается и далее следует область данных раздела, в котором помещается значение поля (кодировать значение не требуется!).

    Хочу обратить Ваше внимание та то, что в заголовках разделов не надо использовать Content-Length, а вот в заголовке запроса надо и его значение является размером всего Entity-Body, стоящего после второго \r\n, следующего за Content-Length: 209\r\n. Т.е. Entity-Body отделяется от заголовка дополнительным переводом строки (что можно заметить и в разделах).

    А теперь давайте напишем запрос для передачи файла.

    POST http://www.site.ru/postnews.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/news.html\r\n
    Cookie: income=1\r\n
    Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
    Content-Length: 491\r\n
    \r\n
    —1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name=»news_header»\r\n
    \r\n
    Пример новости\r\n
    —1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name=»news_file»; filename=»news.txt»\r\n
    Content-Type: application/octet-stream\r\n
    Content-Transfer-Encoding: binary\r\n
    \r\n
    А вот такая новость, которая лежит в файле news.txt\r\n
    —1BEF0A57BE110FD467A—\r\n

    В данном примере в первом разделе пересылается заголовок новости, а во втором разделе пересылается файл news.txt. Внимательный да увидит поля filename и Content-Type во втором разделе. Поле filename задает имя пересылаемого файла, а поле Content-Type — тип данного файла. Application/octet-stream говорит о том, что это стандартный поток данных, а Content-Transfer-Encoding: binary говорит на о том, что это бинарные данные, ничем не закодированные.

    Очень важный момент. Большинство CGI скриптов написано умными людьми, поэтому они любят проверять тип пришедшего файла, который стоит в Content-Type. Зачем? Чаще всего закачка файлов на сайтах используется для получения картинок от посетителя. Так вот, браузер сам пытается определить что за файл посетитель хочет отправить и вставляет соответствующий Content-Type в запрос. Скрипт его проверяет при получении, и, например, если это не gif или не jpeg игнорирует данный файл. Поэтому при «ручном» формировании запроса позаботьтесь о значении Content-Type, чтобы оно было наиболее близким к формату передаваемого файла.

    image/gif для gif
    image/jpeg для jpeg
    image/png для png
    image/tiff для tiff (что используется крайне редко, уж больно емкий формат)

    В нашем примере формируется запрос, в котором передается текстовый файл. Точно так же формируется запрос для передачи бинарного файла.

    4. Постскриптум.

    Думаю, что о передаче запросов на сервер не стоит рассказывать подробно. Это уже дело чисто РНР техники :-). Достаточно внимательно прочитать раздел о функциях работы с сокетами, или о функциях модуля CURL в официальной документации РНР.

    Из выше сказанного, надеюсь теперь понятно, почему вопрос: «Как мне сформировать POST запрос, используя функцию header?» — бессмысленен. Функция header(string) добавляет запись только в заголовок запроса, но никак не в тело запроса.

    Есть еще один тип запросов — Content-Type: multipart/mixed, надеюсь после прочтения данной статьи Вы легко разберетесь с данным типом сами. Подробно изучить его можно Здесь

    О запросах других типов можно прочитать в официальной спецификации протокола HTTP 1.0 здесь.

    Как привести текст к нормальной кодировке в delphi?

    Коллеги, уже не смешно.
    3 дня меня гложет вопрос.

    Использую класс THttpClient.
    Установил правильные заголовки.

    В респонс прилетает

    Если вы обратили внимание на

    Здесь я указывал utf-8
    И да, текст нормально читается, но не стабильно работает, даже очень не стабильно.

    Исключение ‘No mapping for the Unicode character exists in the target multi-byte code page’

    Content Type в THTTPClient

    Вопрос

    Artem Zolotarevskiy 0

    Artem Zolotarevskiy 0

    • Новичок
    • Пользователи
    • 1 сообщение

    Пишу мобильное приложение на Delphi 10. Моя программа отправляет post и get запросы использую компонент THTTPClient. Скрипт на сервере принимает запросы в формате json, по этому при отправке запроса нужно обязательно указать в заголове «Content Type: application/json». Дело в том, что у меня не получается изменить Content Type. При отправке Get запроса он изменятся, а при отправке Post запроса — нет.

    Использую примерно такой код:

    Прошу объяснить, почему такое происходит и как это исправить.

    Клуб программистов

    Delphi programming

    Подписаться на рассылку:

    Convert

    преобразует одну величину измерения в другую

    || 1 function Convert ( const Measurement : Double; const FromType, ToType : TConvType ) : Double;

    || 2 function Convert ( const Measurement : Double; const FromType1, FromType2, ToType1, ToType2 : TConvType ) : Double;

    Описание:

    Delphi функция Convert является мощным средством преобразования одного типа измерения в другое.

    Преобразовывает простые величины, например, мили в километры.

    Преобразовывает сложные величины, например, мили за галлон на километры за литр.

    Все типы измерения являются типами TConvType, и могут иметь подходящую величину из TConvFamily ниже. Отмечу, что конвертируемые величины должны быть в одном и том же семействе.

    Пример кода:

    var
    gallons, litres : Double;

    begin
    // Define the gallons value
    gallons := 1;

    // Convert to litres
    litres := Convert(gallons, vuUKGallons, vuLiters);

    // Display both values
    ShowMessageFmt(‘%f UK gallons = %f litres’,[gallons, litres]);
    end;

    Результат выполнения:

    1.00 UK gallons = 4.55 litres

    Пример кода:

    var
    milesPerGallon, kilometresPerLitre : Double;

    begin
    // We have a very efficient car
    milesPerGallon := 58.5;

    // Convert to kilometres per litre
    kilometresPerLitre := Convert(milesPerGallon,
    duMiles,
    vuUKGallons,
    duKilometers,
    vuLiters);

    // Display both values
    ShowMessageFmt(‘%f UK miles per gallon = %f km per litre’,
    [milesPerGallon, kilometresPerLitre]);
    end;

    Результат выполнения:

    58.5 UK miles per gallon = 20.71 km per litre

    TConvType — Тип Delphi

    Delphi 6. Что нового? Преобразование значения или результата.
    Функция function ConvUnitSameValue (const AValue1: Double; const AType1: TConvType; const AValue2: Double; const AType2: TConvType): Boolean; — указывает, являются ли два значения эквивалентными.
    Эти значения могут использовать различные единицы измерения, но они должны быть в одном и том же конверсионном семействе.
    AValue1 и AValue2 — определяют единицы измерения для сравниваемых значений.
    AType1 — единица измерения для AVALUE1.
    AType2 — единица измерения для AVALUE2.
    Параметр ConvUnitSameValue возвращает True, если два значения эквивалентны, иначе возвращается значение False.
    Функция function ConvUnitToStr(const AValue: Double; const AType: TConvType): string; — форматирует измерение и его конверсионный тип в удобочитаемую строку.
    AValue — определяет значение.
    AType — определяет конверсионный тип (единицу измерения).
    ConvUnitToString форматирует результат в строку в соответствии с описанием, которое обеспечивает ATYPE.
    Например,
    ConvUnitToStr (3.5, duMiles)
    возвращает строку ‘ 3.5 Miles’
    Предупреждение: строковое значение может оказаться неудобочитаемым, в зависимости от описания, которое обеспечивает конверсионный тип. Например, ConvUnitToStr (53, duFahrenheit) возвращает строку ‘ 53 Фаренгейт ‘, а не ‘ 53 градуса по Фаренгейту ‘.
    Функция function ConvUnitWithinNext(const AValue, ATest: Double; const AType: TConvType; const AAmount: Double; const AAmountType: TConvType): Boolean; — указывает, превышает ли заданное измерение другое измерение на величину значения, указанного в AAmount.
    AValue — значение для сравнения с ATest.
    ATest — значение, сравниваемое с AValue.
    AType — единица измерения и для AVALUE, и для ATEST.
    AAmount — значение, на которое ATEST может превышать AVALUE.
    AAmountType — единица измерения для AAmount.
    ConvUnitWithinNext возвращает значение True или False в зависимости от результата.
    Функция function ConvUnitWithinPrevious(const AValue, ATest: Double; const AType: TConvType; const AAmount: Double; const AAmountType: TConvType): Boolean; — указывает, является ли заданное измерение меньше, чем другое измерение на величину, указанную в AAmount.
    Функция function DescriptionToConvFamily(const ADescription: string; out AFamily: TConvFamily): Boolean; — возвращает конверсионный идентификатор семейства для семейства с именем, указанным ADescription.
    ADescription — имя, определенное методом RegisterConversionFamily, когда конверсионное семейство было зарегистрировано.
    AFamily возвращаемый идентификатор для указанного конверсионного семейства.
    DescriptionToConvFamily возвращает значение True или False в зависимости от результата.
    Функции function DescriptionToConvType(const AFamily, TConvFamily; const ADescription: string; out AType: TConvType): Boolean; overload;
    function DescriptionToConvType(const ADescription: string; out AType: TConvType): Boolean; overload; — возвращают значение True, если идентификатор типа для конверсионного семейства был зарегистрирован под именем, указанным ADESCRIPTION, False в противном случае.
    AFamily — идентификатор конверсионного семейства, определенный функцией RegisterConversionType, когда конверсионный тип был зарегистрирован.
    ADescription — имя, определенное функцией RegisterConversionType, когда конверсионный тип был зарегистрирован. Как правило, это форма имени единицы измерения. Например, описание для auAcres конверсионного типа — ‘Acres’.
    AType определяет идентификатор конверсионного типа.
    Процедура procedure GetConvFamilies (out AFamilies: TConvFamilyArray); — возвращает список всех зарегистрированных конверсионных семейств.
    GetConvFamilies возвращает динамическое множество идентификаторов для всех конверсионных семейств, зарегистрированных в настоящее время. Каждый вход во множество представляет конверсионное семейство, зарегистрированное функцией RegisterConversionFamily.
    type TConvFamilyArray = array ofTConvFamily; — представляет динамическое множество конверсионных семейств.
    type
    TConvFamily = type Word; — представляет набор конверсионных типов, которые позволяют производить преобразования.
    TConvFamily определяет конверсионное семейство. Конверсионное семейство — это совокупность единиц измерения (TConvType). Если два TConvType зарегистрированы в одном и том же конверсионном семействе, то преобразующая функция может производить преобразования между измерениями, используя значения, представленные в TConvType.
    TConvFamily значения определяются во время регистрации конверсионного семейства с использованием функции RegisterConversionFamily
    Процедура procedure GetConvTypes(const AFamily: TConvFamily; out ATypes: TConvTypeArray); — возвращает список всех зарегистрированных конверсионных типов в указанном конверсионном семействе.
    Процедуры procedure RaiseConversionError(const AText: string; const AArgs: array of const); overload;
    procedure RaiseConversionError(const AText: string); overload; — поднимают ECONVERSIONERROR исключение.
    Вы не должны вызывать этот метод в своих приложениях.
    Однако вы можете вызывать исключение ECONVERSIONERROR для конверсионных типов, которые вы регистрируете. Например, если единица измерения не разрешает отрицательных значений, то вы можете проверять наличие таких значений и вызывать RaiseConversionError, если будет произведена попытка запрещенного преобразования.
    AText — определяет вид сообщения об ошибке для вашего исключения.
    AArgs — список аргументов для спецификаторов формата в AText.
    Функция function RegisterConversionFamily(const ADescription: string): TConvFamily; — регистрирует новое конверсионное семейство и возвращает его идентификатор.
    Когда вы регистрируете новое конверсионное семейство, то можете регистрировать единицы измерения, которые принадлежат семейству, используя функцию RegisterConversionType. RegisterConversionType использует конверсионный идентификатор семейства, возвращаемый RegisterConversionFamily как аргумент.
    ADescription — определяет название конверсионного семейства.
    RegisterConversionFamily возвращает идентификатор для нового конверсионного семейства.
    Функции function RegisterConversionType(const AFamily: TConvFamily; const ADescription: string, const AFactor: Double): TConvType; overload;
    function RegisterConversionType(const AFamily: TConvFamily; const ADescription: string, const AToCommonProc, AFromCommonProc: TConversionProc): TConvType; overload;
    function RegisterConversionType(AConvTypeInfo: TConvTypeInfo; out AType: TConvType): Boolean; overload; — производят регистрацию нового конверсионного типа и возвращают его идентификатор.
    Вызывая RegisterConversionType, вы можете добавить новый конверсионный тип единицы измерения к зарегистрированному конверсионному семейству.
    AFamily — идентификатор для конверсионного семейства, к которому новый конверсионный тип принадлежит. Это может быть одно из предопределенных конверсионных семейств в модуле StdConvs или значение, возвращаемое после запроса RegisterConversionFamily.
    Adescription — определяет имя конверсионного типа. Как правило, это форма названия единицы измерения. Например, описание для duMeters конверсионного типа — ‘Метры’.
    AFactor — фактор измерения, используя который, вы можете произвести умножение, чтобы произвести преобразование в единицы конверсионного семейства. Таким образом, например, фактор для duKilometers = 1000, так как единицей для конверсионного семейства является расстояние, т.е. метры.
    AToCommonProc и AFROMCOMMONPROC — функции, которые используются, когда происходят преобразования между новым конверсионным типом и единицами конверсионного семейства, и эти преобразования не могут быть выполнены простым умножением. Например, температурные измерения используют различные значения для точки отсчета от 0.
    AConvTypeInfo — представляет новый конверсионный тип, включая значение ConvFamily, к которому конверсионный тип принадлежит.
    Функция function StrToConvUnit(AText: string; out AType: TConvType): Double; — преобразует строковое значение в конверсионный тип.
    Функции function TryConvTypeTo Family(const AType: TConvType); out AFamily: TConvFamily): Boolean; overload;
    function TryConvTypeToFamily(const AFrom, ATo: TConvType; out AFamily: TConvFamily): Boolean; overload; — восстанавливают идентификатор для конверсионного семейства, с которым конверсионный тип или оба типа зарегистрированы.
    TryConvTypeToFamily определяет конверсионный идентификатор семейства для семейства указанного конверсионного типа или типов. Конверсионные типы связаны с конверсионным семейством функцией RegisterConversionType, когда конверсионный тип регистрируется.
    Функция function TryStrToConvUnit(AText: string; out AValue: Double; out AType: TConvType): Boolean; — полностью отменяет преобразование, выполненное функцией ConvUnitToStr.
    Функция procedure UnregisterConversionFamily(const AFamily: TConvFamily); — отменяет регистрацию конверсионного семейства, предварительно зарегистрированного с использованием функции RegisterConversionFamily.
    Функция procedure UnregisterConversionType(const AType: TConvType); — отменяет регистрацию конверсионного типа.

    Владимир Скуратов

    Илон Маск рекомендует:  Что такое код initgraph

    Delphi Convert возвращает недопустимые типы

    Я пытаюсь выполнить простейшие преобразования в delphi, используя встроенную функцию преобразования.

    Просто преобразовать галлоны в литры.

    Однако delphi возвращает недопустимый тип при преобразовании. единиц.

    Галлоны и литры имеют вид TConvTypes

    Однако delphi возвращает следующее, когда я пытаюсь выполнить code.

    Это должна быть самая простая операция после прочтения документации Embarcadero, следующие должны работать. На данный момент я не могу понять, что происходит.

    Может ли кто-нибудь указать мне правильное направление?

    Я отредактировал пост, чтобы включить полный код устройства

    Типы данных Delphi

    Теперь обсудим типы данных Delphi, которые программист использует при написании программы. Любая программа на Delphi может содержать данные многих типов:

    • целые и дробные числа,
    • символы,
    • строки символов,
    • логические величины.

    Целый тип Delphi

    Библиотека языка Delphi включает в себя 7 целых типов данных: Shortint, Smallint, Longint, Int64, Byte, Word, Longword, характеристики которых приведены в таблице ниже.

    Вещественный тип Delphi

    Кроме того, в поддержку языка Delphi входят 6 различных вещественных типов (Real68, Single, Double, Extended, Comp, Currency), которые отличаются друг от друга, прежде всего, по диапазону допустимых значений, по количеству значащих цифр, по количеству байт, которые необходимы для хранения некоторых данных в памяти ПК (характеристики вещественных типов приведены ниже). Также в состав библиотеки языка Delphi входит и наиболее универсальный вещественный тип — тип Real, эквивалентный Double.

    Символьный тип Delphi

    Кроме числовых типов, язык Delphi располагает двумя символьными типами:

    Тип Ansichar — символы c кодировкой ANSI, им ставятся в соответствие числа от 0 до 255;

    Тип Widechar — символы с кодировкой Unicode, им ставятся в соответствие числа от 0 до 65 535.

    Строковый тип Delphi

    Строковый тип в Delphi обозначается идентификатором string. В языке Delphi представлены три строковых типа:

    Тип Shortstring — присущ статически размещаемым в памяти ПК строкам, длина которых изменяется в диапазоне от 0 до 255 символов;

    Тип Longstring — этим типом обладают динамически размещаемые в памяти ПК строки с длиной, ограниченной лишь объемом свободной памяти;

    Тип WideString — тип данных, использующийся для того, чтобы держать необходимую последовательность Интернациональный символов, подобно целым предложениям. Всякий символ строки, имеющей тип WideString, представляет собой Unicode-символ. В отличие от типа Shortstring, тип WideString является указателем, который ссылается на переменные.

    Логический тип Delphi

    Логический тип соответствует переменным, которые могут принять лишь одно из двух значений: true, false. В языке Delphi логические величины обладают типом Boolean. Вам были представлены основные типы данных Delphi. Движемся дальше.

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL