Convert — Функция Delphi


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

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

Функция преобразования в Delphi 2009/2010 (Unicode)

я медленно преобразования мой существующий код в Delphi 2010 и прочитал несколько статей на Embarcaedro веб-сайта, а также Марко Cantú документе.

Есть еще некоторые вещи, я не понял, что здесь есть две функции, чтобы показать на мой вопрос:

Для RemoveSpace функции, если нет unicode символ передается («aa bb», например), все хорошо. Теперь, если я передам текст ‘ab cd), то функция не работает так, как ожидалось (я получаю ab??cd в качестве вывода).


Как я могу учитывает возможные unicode символов на строку? с помощью Length(InStr) явно неправильный, а также Копии(InStr, I, 1).

Что лучшим способом конвертации в этом коде, так что на ее долю приходится символов unicode?

Convert — Функция Delphi

В этом уроке мы рассмотрим функции преобразования чисел в строки и строк в числа.
Давайте рассмотрим часто используемые функции StrToInt, IntToStr, FloatToStr, StrToFloat. Во многих случаях эти функции являются очень полезными в том плане, что они позволяют преобразовывать целочисленные и нецелочисленные переменные типов Integer, Byte, Double, Real и т.п. в их строковое представление в переменную типа String и обратно, если это возможно. Рассмотрим непосредственно сами функции по порядку.
[cc lang=»delphi»]var a: integer;
s: string;
begin
a := 12345;
s := IntToStr(a);
// в результате переменная s будет содержать в себе строку ‘12345’
end;[/cc]
Т.е. функция IntToStr позволяет преобразовывать целочисленную переменную типа integer или byte в ее строковое представление в переменную типа string;

Обратную возможность реализовывает функция StrToInt.
[cc lang=»delphi»]var a: integer;
s: string;
begin
s := ‘12345’; // В s должно быть введено обязательно целочисленное число без лишних символов!
// иначе программа, во время выполнения «конвертации» завершит свою работу
// с ошибкой.
a := StrToInt(s);
// в результате переменная a будет содержать в себе число 12345.
end;[/cc]

Те же возможности нам помогают реализовать функции FloatToStr и StrToFloat, однако они уже позволяют работать с нецелочисленными переменными типа Double, Real и т.п. Работа с ними абсолютно аналогична работе с функциями IntToStr и StrToInt.
[note]Стоит отметить одну важную особенность при переводе строки в нецелочисленное число. В качестве плавающей запятой в «строках-числах» нужно использовать символ «точка», а не символ «запятая». При переводе нецелочисленного числа в строку эта особенность учитывается функцией FloatToStr автоматически.[/note]

Delphi/Перевод переменных

Переменные можно перевести из одного типа в другой. Например, нужно в компоненте Edit отобразить число. Чтобы, изменить текст в Edit’e, нужно изменить его свойство Text. Что написано в Text, то отобразится в самом Edit’e. Тип свойтсва Text — string. Как отобразить число в Edit’e? Все очень просто. Существует команда IntToStr . Давайте мы её разберем.

Чтобы изменить свойство Text, нужно его «назвать». Общий вид вызова свойства какого-либо компонента имеет вид:

Теперь напишем простую программу, которая переводит переменную типа integer в тип string.

А как отобразить дробное число в Edit’e? Также как с целым числом, только команда другая — FloatToStr . Напишем такую же программу, только вместо integer — real.

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

Теперь усложним нашу программу — теперь она будет складывать числа в 2-х Edit’ах, а показывать результат в Edit 3-й. У вас появился вопрос: «Как сложить два числа из Edit’a?» Нужна обратная команда — StrToInt , она переводит string в integer.

Но мы поступили хитро — мы не использовали ни одной переменной. Можно было использовать их, но так было сложней. И напоследок про команду — StrToFloat , такая же как предыдущая, только вместо integer — real.

Приведение и преобразование типов Delphi

Приведение типов (typecasting) — эта технология, способная заставить компиля тор рассматривать переменную одного типа как переменную другого типа. Pascal является строго типизированным языком, который весьма требователен в отношении соответствия типов формальных параметров функции и реальных параметров, передаваемых ей при вызове. Поэтому в некоторых случаях пере менную одного типа необходимо привести к некоторому другому типу, чтобы требования компилятора были удовлетворены. Предположим, необходимо присвоить символьное значение переменной типа byte:

b := c; // здесь компилятор выдаст сообщение об ошибке

В приведенном выше примере требуется привести переменную с к типу byte. Фак тически выполнение приведения типа явно указывает компилятору, что программист точно знает, что он делает, требуя преобразовать один тип данных в другой:

b := byte(c); // Теперь компилятор доволен

Использовать приведение типов можно только при совпадении размеров данных обоих типов. Привести тип Double к типу Integer невозможно, поэтому для подобного преоб- разования придется воспользоваться функцией Trunc() или Round(). Но, чтобы преоб- разовать целое число в вещественное, можно пользоваться обычным оператором при- своения:

Object Pascal предоставляет широчайшие возможности приведения типов объек тов с помощью оператора as. Более подробная информация по данной теме приведе на далее в этой главе.

Источник: Тейксейра, Стив, Пачеко, Ксавье. Borland Delphi 6. Руководство разработчика. : Пер. с англ. — М. : Издательский дом “Вильямс”, 2002. — 1120 с. : ил. — Парал. тит. англ.

Преобразование функции с-заголовка для функции Delphi передать YUV изображение

Мне нужно перевести C заголовок обработки изображений SDK, содержащей эту функцию:

Эта функция используется для передачи в YUVJ420 кадр в SDK.

В моем коде, кадр сохраняется в записи PAVPicture (определенной в библиотеке компонентов FFVCL), с:

После декодирования видео кадра, FFVCL инициирует событие, в котором кадр доступен как APicture типа PAVPicture.

И использовал его так:

.. но этот путь я пропускаю некоторые указатели / адрес.

Документация SDK является Chinglish и устареть. У меня есть кусок примера C, который использует FFmpeg для декодирования, а когда кадр закончена часть PFRAME (типа AVFrame) передается в SDK:

Это декларация AVFrame (взято из frame.h из FFmpeg):


  • как правильно перевести это определение функции C
  • как вызвать эту функцию с помощью прилагаемого FFVCL типа PAVPicture

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

Прежде всего, давайте посмотрим на HANDLE тип. Это может быть тип Win32 HANDLE , в этом случае было бы перевести как THandle . Скорее это тип , определенный в библиотеке в вопросе. Может быть , это лучше всего переводится как Pointer или NativeInt . Я буду считать последним.

BYTE** Параметр представляет собой массив BYTE* . Это , как представляется, выделяются вызывающим. Вы, вероятно , перевести это в Delphi как PPByte . То есть указатель на указатель на Byte .

Следующий параметр LineSize , типы , как int* . Это массив int . Итак , еще раз дословный перевод был бы PInteger , указатель Integer .

Последние два параметра представляют собой простые целые числа.

Таким образом, функция будет объявлена ​​как:

Вам также необходимо перевести структуры. Это выглядит следующим образом:

Очевидно , что ваш код нужно будет получить за ручку дисплея. Я не могу сказать , как вы идти о выполнении этого. Предположительно , вы уже знаете , как сделать это. Точно так же вам необходимо создать кадр с вызовом av_frame_alloc . Опять же , я могу только предположить , что вы уже знаете , как сделать это.

Таким образом, если у вас есть следующие переменные правильно инициализированы:

Тогда вызов будет идти, как это:

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

convert function to delphi 2009/2010 (unicode)

I’m slowly converting my existing code into Delphi 2010 and read several of the articles on Embarcaedro web site as well as Marco Cantú whitepaper.

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

There are still some things I haven’t understood, so here are two functions to exemplify my question:

For the RemoveSpace function, if no unicode character is passed (‘aa bb’ for example), all is well. Now if I pass the text ‘ab cd’ then the function doesn’t work as expected (I get ab??cd as the output).

How can I account for possible unicode characters on a string? using Length(InStr) is obviously incorrect as well as Copy(InStr, I, 1).

What’s the best way of converting this code so that it accounts for unicode characters?

5 Answers 5

If those were your REAL functions and you’re just trying to get em working then :

(we do not use D10, at the moment, so beware!)

The problem in Delphi is with string literals that contain characters outside the basic ascii-range. When they are passed to string routines, the non-ascii-characters are replaced with question marks.

To avoid this, cast the text literals to WideStrings before passing them as a parameter to the function.

I do not know whether it applies to the StringReplace-routine, but Delphi’s search routine Pos/Posex does not handle Unicode correctly. We had to replace these routines with our own variant. For this improved routine it is important to make sure that the parameters are of the WideString type, not the normal string type.

We did this in D7 when handling Unicode, and all works well.

Although string is a Unicode type now, when you specify a length, you still get the non-Unicode ShortString type. The TestChar variable in your RemoveSpace function is a non-Unicode one-character string. What you should have been using all along is a real Char variable. I expect you came from the VB world, where one-character strings were the same as single characters. In Delphi, a string isn’t the same as a character, so when you call Copy , you get a string.

In Unicode Delphi, that one-character string gets reduced to a non-Unicode string, and if there’s no representation for that character in the current code page, you get a question mark instead. Fix it like this:

I got rid of Ans . As of Turbo Pascal 7, you can use the implicitly declared Result variable instead of declaring your own and then assigning it to the function name. Result is readable and writable. Also, you don’t need to worry about zero-length input. When the upper bound of a «for-to» loop is less than the lower bound, the loop simply doesn’t run, so you don’t need to check beforehand. Finally, I used the bracket operators on InStr to extract the character at the given index instead of getting a one-character-long string.

You say that your uses of Length and Copy are obviously incorrect, but you’re wrong. Those functions continue to work just fine in Unicode. They know that Char is two bytes wide now, so if you call them on UnicodeString variables, you’ll get the right characters. They also continue to work on AnsiString variables. In fact, they also work find on WideString variables, even in older Delphi versions.


The primary problem in your code was where you stored a Unicode character into a non-Unicode string type.

3 варианта работы с кодировками веб-страниц в Delphi.

Сколько постов написано в блогах, сколько вопросов задано на форумах о кодировках и ещё большее количество подобных вопросов осталось не отвеченными или ответом было что-то наподобие «Поиском пользовались?» или «Сто раз обсуждалось. ». Честно говоря, никогда не понимал таких «ответчиков», ИМХО не хочешь отвечать — лучше жуй и молчи, ответят те, кто захочет.
Понятное дело, что обучать иногда приходится не только с помощью пряника, но и с помощью кнута, но, раз уж такие вопросы всё время всплывают, следовательно они остаются актуальными.
Сегодня я попробую рассказать Вам всё, что мне известно о работе с кодировками в тексте. Вполне возможно, что эта статья поможет Вам при разработке своих проектов в Delphi да и у меня уже пару раз возникало желание немного систематизировать ту информацию. которая накопилась за время существования блога.

1. Delphi и Unicode

Если говорить о работе с Unicode в Delphi, то начать стоит с того, что полноценная поддержка unicode в Delphi стала возможна лишь после выхода Delphi 2009. Такое событие не могло пройти незамеченным, так как благодаря поддержке Unicode и, соответственно, для облегчения работы с кодировками текста в Delphi были реализованы новые возможности, методы, типы данных, о которых написано большое количество статей. На мой взгляд одной из лучших публикаций на эту темя является цикл из трех статей «Delphi и кодировка Unicode» где достаточно чётко и доступно рассказано о нововведениях Delphi 2009 для работы с unicod’ом. Думаю, что нет смысла подробно останавливаться на всех новшествах при наличии ссылки на целых три статьи на эту тему. Остается только упомянуть о том, с чем мы сегодня будем работать для представления веб-страницы в нормальном читаемом виде.
Для первого способа работы с кодировкой мы воспользуемся:

  1. Класс TEncoding, который и дает нам возможность без лишних хлопот работать с кодировками
  2. Тип данных TBytes — массива байтов строк
  3. RawByteString — тип для передачи строковых данных для любой кодовой страницы без каких-либо преобразований последней
Илон Маск рекомендует:  Dos fn 00h завершить программу

В одной из статей блога рассматривалась работа с MLang и сегодня, в качестве второго способа, я продемонстрирую Вам пример её применения при работе с кодировками.
Ну и в качестве третьего способа работы с кодировками, воспользуемся «штатными» методами модуля system. Все три варианта работы с кодировками приведут к одному и тому же результату — текст веб-страницы будет читаемым, без «кракозябров» и вопросительных знаков. Какой способ лучше — решать только Вам.

2. Подготовка исходных данных для работы

Прежде, чем начать что-то кодировать и перекодировать, необходимо это «что-то» получить. В нашем случае — текст веб-страницы. Чтобы не залезать слишком глубоко в вопросы, касающиеся новых типов данных будем сохранять все данные из Сети не в строки или TStringList’ы, как мы к этому привыкли, а воспользуемся типом TBytes.
Используя Synapse исходник любой страницы можно получить, например так:

Delphi-Help

Convert

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;

Функция Convert является мощным средством преобразования одного типа измерения в другой.
Вариант 1
Преобразовывает простые величины, например, мили в километры.
Вариант 2
Преобразовывает сложные величины, например, мили на каждый галлон в километры на каждый литр.
Все типы измерения являются типами TConvType, и могут иметь подходящую величину из TConvFamily ниже. Отметим, что конвертируемые величины должны быть в одном и том же семействе.
семейство cbArea
auSquareMillimeters
auSquareCentimeters
auSquareDecimeters
auSquareMeters
auSquareDecameters
auSquareHectometers
auSquareKilometers
auSquareInches
auSquareFeet
auSquareYards
auSquareMiles
auAcres
auCentares
auAres
auHectares
auSquareRods
семейство cbDistance
duMicromicrons
duAngstroms
duMillimicrons
duMicrons
duMillimeters
duCentimeters
duDecimeters
duMeters
duDecameters
duHectometers
duKilometers
duMegameters
duGigameters
duInches
duFeet
duYards
duMiles
duNauticalMiles
duAstronomicalUnits
duLightYears
duParsecs
duCubits
duFathoms
duFurlongs
duHands
duPaces
duRods
duChains
duLinks
duPicas
duPoints
семейство cbMass

muNanograms
muMicrograms
muMilligrams
muCentigrams
muDecigrams
muGrams
muDecagrams
muHectograms
muKilograms
muMetricTons
muDrams
muGrains
muLongTons
muTons
muOunces
muPounds
muStones
семейство cbTemperature
tuCelsius
tuKelvin
tuFahrenheit
tuRankine
tuReamur
семейство cbTime
tuMilliSeconds
tuSeconds
tuMinutes
tuHours
tuDays
tuWeeks
tuFortnights
tuMonths
tuYears
tuDecades
tuCenturies
tuMillennia
tuDateTime
tuJulianDate
tuModifiedJulianDate
семейство cbVolume
vuCubicMillimeters
vuCubicCentimeters
vuCubicDecimeters
vuCubicMeters
vuCubicDecameters
vuCubicHectometers
vuCubicKilometers
vuCubicInches
vuCubicFeet
vuCubicYards
vuCubicMiles
vuMilliLiters
vuCentiLiters
vuDeciLiters
vuLiters
vuDecaLiters
vuHectoLiters
vuKiloLiters
vuAcreFeet
vuAcreInches
vuCords
vuCordFeet
vuDecisteres
vuSteres
vuDecasteres
vuFluidGallons
vuFluidQuarts
vuFluidPints
vuFluidCups
vuFluidGills
vuFluidOunces
vuFluidTablespoons
vuFluidTeaspoons
vuDryGallons
vuDryQuarts
vuDryPints
vuDryPecks
vuDryBuckets
vuDryBushels
vuUKGallons
vuUKPottles
vuUKQuarts
vuUKPints
vuUKGills
vuUKOunces
vuUKPecks
vuUKBuckets
vuUKBushels

Пример кода

Пример кода : Конвертируем британские галлоны в литры

var
gallons, litres : Double;
begin
// Определение значения галона
gallons := 1;
// Конвертируем в литры
litres := Convert (gallons, vuUKGallons, vuLiters);
// Показываем оба значения
ShowMessageFmt(‘%f UK галонов = %f литрам’,[gallons, litres]);
end;

1.0 UK галонов = 4.55 литрам

Пример кода : Конвертируем мили на каждый галлон в километры на каждый литр

var
milesPerGallon, kilometresPerLitre : Double;
begin
// Мы имеем очень эффективный автомобиль
milesPerGallon := 58.5;
// Преобразуйте в километры на каждый литр
kilometresPerLitre := Convert (milesPerGallon,
duMiles,
vuUKGallons,
duKilometers,
vuLiters);
// Показываем оба значения
ShowMessageFmt(‘%f UK милей на каждый галон = %f км на каждый литр’,
[milesPerGallon, kilometresPerLitre]);
end;

58.5 UK милей на каждый галон = 20.71 км на каждый литр

Функция преобразования в Delphi 2009/2010 (Unicode)

я медленно преобразования мой существующий код в Delphi 2010 и прочитал несколько статей на Embarcaedro веб-сайта, а также Марко Cantú документе.

Есть еще некоторые вещи, я не понял, что здесь есть две функции, чтобы показать на мой вопрос:

Для RemoveSpace функции, если нет unicode символ передается («aa bb», например), все хорошо. Теперь, если я передам текст ‘ab cd), то функция не работает так, как ожидалось (я получаю ab??cd в качестве вывода).

Как я могу учитывает возможные unicode символов на строку? с помощью Length(InStr) явно неправильный, а также Копии(InStr, I, 1).

Что лучшим способом конвертации в этом коде, так что на ее долю приходится символов unicode?

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