Chr — Функция Delphi


Разностная функция Char / Chr в Delphi 2007 и XE3

Я использую функции Char и Chr с параметром 130 и в Delphi 2007 e XE3 ведет себя иначе.

Delphi 2007: Char (130) или Chr (130) — Результат: запятая

Delphi XE3: Char (130) или Chr (130) — Результат: # $ 0082

Я решил проблему с помощью AnsiChar (130).

У меня вопрос, есть ли у меня проблемы с использованием AnsiChar. Должен ли я менять Chr / Char на AnsiChar на протяжении всего проекта?

1 ответ

Эти два немного отличаются:

  • Char (130) является значением типа, а не вызовом функции. Целое число со значением 130 преобразуется в Char с этим порядковым номером.
  • Chr (130) действительно является вызовом функции. Он вызывает встроенную функцию Chr() .

В версиях Delphi до и после Юникода вы можете использовать версии Char() и Chr() взаимозаменяемо. Однако результаты могут отличаться в зависимости от используемой версии Delphi.

Для Delphi до Unicode Char — это 8-битный символ ANSI. Для пост-Unicode Delphi Char — это 16-битный символ UTF-16.

Как именно вы должны решить эту проблему, зависит от того, чего вы пытаетесь достичь. Если вы хотите уткнуться головой в песок и сделать вид, что символы Юникода не существуют, то, возможно, вы захотите заменить все использование Char на AnsiChar . И вам также захочется надеяться, что ваша программа когда-либо запускается только на машине с локалью, которая отображает символ 130 на этот символ. Имейте в виду, что не все локали Windows ANSI делают это.

Тем не менее, я подозреваю, что правильным решением вашей проблемы, каким бы оно ни было, будет использование Unicode и использование кодировки UTF-16 для этого символа. Это ЕДИНСТВЕННАЯ НИЗКАЯ-9 ЦИТОВАЯ МАРКА U + 201A . Напишите это в Unicode Delphi следующим образом:

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

Если вы хотите запятую ( COMMA U + 002C ), это легко:

Некоторое обязательное чтение для вас: Delphi и Unicode от Marco Cantù .

Borland Delphi 4.0 для начинающих — Типы данных — Простые типы данных

Любой реально существующий тип данных, каким бы сложным он ни казался на первый взгляд, представляет собой простые составляющие, которыми процессор может манипулировать. В Object Pascal эти простые типы данных разбиты на две группы: порядковые, представляющие данные разных объемов, которыми процессор может легко манипулировать, и действительные, представляющие приближенно математические действительные числа. Разделение типов на порядковые и действительные несколько условно. Точно так же простые данные можно было бы разделить на числа и не числа. Однако в языке Object Pascal порядковые и действительные данные трактуются по-разному, и такое разделение даже полезно.

Порядковые типы

Из простых типов данных порядковые — самые простые. В этих типах информация представляется в виде отдельных элементов. Связь между отдельными элементами и их представлением в памяти определяет естественные отношения порядка между этими элементами. Отсюда и название порядковые.

В Object Pascal определены три группы порядковых типов и два типа, определяемых пользователем. Группы — это целые, символьныеи булевы типы. Порядковые типы, задаваемые пользователем, — это перечисления и поддиапазоны.

Все значения любого порядкового типа образуют упорядоченную последовательность, и значение переменной порядкового типа определяется его местом в этой последовательности. За исключением переменных целых типов, значения которых могут быть как положительными, так и отрицательными, первый элемент любого порядкового типа имеет номер 0, второй элемент — номер 1 и т.д. Порядковый номер целого значения равен самому значению. Отношение порядка определяет общие для данных всех порядковых типов операции. Некоторые стандартные функции такого вида встроены в Object Pascal. Они представлены в табл. 1.1.

Для всех порядковых типов в Object Pascal существует операция задания типа для преобразования целых значений в значения соответствующих порядковых типов. Если Т — имя порядкового типа, а Х — целое выражение, то Т (X) воз-вращает значение Т с порядковым номером X.

Совет:

Программисты, работающие на С и C++, для приращения или уменьшения значений переменных привыкли заметку использовать операторы «++» и «—«, возвращающие следующее и предыдущее значения. Программисты Delphi всегда разбивают эти операции на более простые составляющие с помощью функций Pred, Succ. Dec и Inc.

Операция Описание
Low (T) Минимальное значение порядкового типа Т
High(T) Максимальное значение порядкового типа Т
Ord(X) Порядковый номер значения выражения порядкового типа. Для целого выражения — просто его значение. Для остальных порядковых типов Ord возвращает физическое представление результата выражения, трактуемое как целое число. Возвращаемое значение всегда принадлежит одному из целых типов
Pred(X) Предыдущее по порядку значение. Для целых выражений эквивалентно Х-1
Succ(X) Следующее по порядку значение. Для целых выражений эквивалентно Х+1
Dec(V) Уменьшает значение переменной на 1. Эквивалентно V := Pred(V)
Inc(V) Увеличивает значение переменной на 1. Эквивалентно V := Succ(V)

Целые типы

В переменных целых типов информация представляется в виде целых чисел, т.е. чисел не имеющих дробной части. Определенные в Object Pascal целые типы подразделяются на физические (фундаментальные) и логические (общие). При программировании удобнее использовать логические целые типы, которые задают объем переменных в зависимости от типа микропроцессора и операционной среды таким образом, чтобы достигалась максимальная эффективность. Физические целые типы следует применять лишь в тех случаях, когда в первую очередь важны именно диапазон значений и физический объем переменной. В Object Pascal определены следующие целые типы.

Обратите внимание, что один из этих целых типов назван именно целым (integer). Это может иногда приводить к путанице, но мы легко сможем ее избежать, применяя термин целый к. группе типов, a integer — к конкретному типу, определяемому в программе этим ключевым словом. Переменные физических целых типов имеют разные диапазоны значений в зависимости от того, сколько байтов памяти они занимают (что равно значению, возвращаемому функцией SizeOf для данного типа). Диапазоны значений для всех физических типов перечислены в табл. 1.2.

Таблица 1.2. — Физические целые типы

Тип Диапазон значении Физический формат
Shortint -128-127 8 бит, со знаком
Smallint -32 768-32 767 16 бит, со знаком
Longint -2 147 483 648-2 147 483 647 32 бит, со знаком
Byte 0-255 8 бит, без знака
Word 0-65 535 16 бит, без знака

Диапазоны значений и форматы физических целых типов не зависят от микропроцессора и операционной системы, в которых выполняется программа. Они не меняются (или, по крайней мере, не должны меняться) с изменением реализации или версии Object Pascal.

Диапазоны значений логических целых типов (Integer и Cardinal) определяются совершенно иным образом. Как видно из табл. 1.3, они никак не связаны с диапазонами соответствующих физических типов. Обратите внимание, что в Delphi по умолчанию задано 32-разрядное представление.

Таблица 1.3. — Логические целые типы

Тип Диапазон значений Физический формат
Integer -32 768-32 767 16 бит, со знаком (SmalIInt)
Integer -2 147 483 648-2 147 483 647 32 бит, со знаком (Longint)
Cardinal 0-65 535 16 бит, без знака (Word)
Cardinal 0-2 147483647 32 бит, без знака (Longint)

Совет:

В С и C++ для целых значений определены типы int, short int (или просто short) и long int (или просто long). Тип int из C/C++ соответствует типу Integer из Delphi, a long из C/C++ — Longint из Delphi. Однако Shortint из C/C++ соответствует в Delphi не Shortint, a Smalltlnt. Эквивалент Shortint из Delphi в C/C++— это signed char. Тип unsigned char в C/C++ соответствует типу Byte из Delphi. В C/C++ существует еще тип unsigned long, аналога которому в Delphi нет.

Над целыми данными выполняются все операции, определенные для порядковых типов, но с ними все же удобнее работать как с числами, а не с «нечисленными порядковыми типами». Как и «живые» числа, данные целых типов можно складывать (+), вычитать (-) и умножать (*). Однако некоторые операции и функции, применяемые к данным целых типов, имеют несколько иной смысл.

Операция Результат
Abs (X) Возвращает абсолютное целое значение Х
Х Div Y Возвращает целую часть частного деления Х на Y
Х Mod Y Возвращает остаток частного деления Х на Y
Odd (X) Возвращает булево True (истина), если Х — нечетное целое, и False (ложь) — в противном случае
Sqr (X) Возвращает целый квадрат Х (т.е. Х*Х)

Совет:

Будьте внимательны при перенесении численных выражений из одного языка в другой. В Basic, например,vфункция SQR вычисляет квадратный корень. В C/C++ целое деление обозначается косой чертой (/). В Delphi косая между двумя целыми даст действительный результат с плавающей запятой.

Символьные типы

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

В реализациях языка Pascal для первых микропроцессоров была применена 7-битовая схема, названная ASCII (American Standard Code for Information Interchange — Американский стандартный код для обмена информацией). Эта схема и поныне широко распространена, но информация хранится, как правило, в 8-битовых участках памяти. Дополнительный бит удваивает число возможных представлений символов, но реализации расширенного набора символов ASCII часто бывают далеки от стандарта. В данной версии Delphi определен набор 8-битовых символов, известный как расширенный (extended) ANSI (American National Standards Institute — Американский национальный институт стандартов). Как бы то ни было, символьную схему приходится воспринимать так, как ее воспринимает операционная система. Для оконных операционных систем фирмы Microsoft это схема ANSI, включающая ограниченное число предназначенных для вывода международных знаков. В стремлении же применить более обширный набор международных знаков весь компьютерный мир переходит к 16-битовой схеме, именуемой UNICODE, в которой первые 256 знаков совпадают с символами, определенными в схеме ANSI.

Для совместимости со всеми этими представлениями в Object Pascal определены два физических символьных типа и один логический.

Физические типы перечислены ниже.

AnsiChar Однобайтовые символы, упорядоченные в соответствии с расширенным набором символов ANSI
WideChar Символы объемом в слово, упорядоченные в соответствии с международным набором символов UNICODE. Первые 256 символов совпадают с символами ANSI

Символьные типы объемом в двойное слово (32 бит) отсутствуют.

Логический символьный тип именуется char. В классическом языке Pascal char— единственный символьный тип. В Delphi char всегда соответствует физическому типу данных AnsiChar. У американских программистов ассоциация символа с однобайтовой ячейкой памяти укоренилась за долгие годы настолько, что им зачастую просто не приходит в голову, что можно использовать другие схемы кодирования. Однако дискуссии по интернационализации программ в Internet и World Wide Web могут существенно изменить их отношение к проблеме объема символьных данных. Применяя логический тип char, следует делать реализации для других микропроцессоров и операционных систем, в которых char может определяться как WideChar. При написании программ, которые могут обрабатывать строки любого размера, для указания этого размера рекомендуется применять функцию SizeOf, не задавая ее жестко постоянной. Функция Ord (С), где С — любая переменная символьного типа, возвращает целое значение, которым символ С представлен в памяти.

Chr (X) Преобразует целую переменную в переменную типа char с тем же порядковым номером. В Delphi это эквивалентно заданию типа Char (X)
UpCase Преобразует строчную букву в прописную

Совет:

Процессор не различает типы char, определенные в C/C++ и Delphi. Однако функционально каждый из этих языков трактует данный тип совершенно по-разному. В C/C++ это целый тип, переменной которого можно присваивать целые значения. Переменной int можно присвоить символьное значение, а переменной char — целое. В Delphi символьные типы жестко отделены от численных. Для присвоения численному значению символьного здесь необходимо воспользоваться функцией Ord. В языке Basic один символ представляется так же, как и строка символов. Функция Chr из Delphi эквивалентна функции CHR$ из Basic. Функция Ord из Delphi, возвращающая код ANSI символьной переменной, подобна функции A3 С из Basic, аргумент которой представляет односимвольную строку.

Булевы типы

На ранней стадии обучения программисты осваивают понятие бита, два состояния которого можно использовать для записи информации о чем-либо, представляющем собой одно из двух. Бит может обозначать 0 или 1, ДА или НЕТ, ВКЛЮЧЕНО или ВЫКЛЮЧЕНО, ВЕРХ или НИЗ, СТОЯТЬ или ИДТИ. В Object Pascal информация о чем-либо, что можно представить как ИСТИНА (True) или ЛОЖЬ (False), хранится в переменных булевых типов. Всего таких типов че-тыре, и они представлены в табл. 1.4.

Таблица 1.4. — Размеры переменных булевых типов

Тип Размер
Boolean 1 байт
ByteBool 1 байт
WordBool 2 байт (объем Word)
LongBool 4 байт (объем Longint)

По аналогии с целыми и символьными типами, подразделяющимися на физические и логические, естественно предположить, что ByteBool, WordBool и LongBool — физические типы, Boolean — логический. Но в данном случае это не совсем так. Все четыре типа различны. Для Object Pascal предпочтителен тип Boolean, остальные определены для совместимости с другими языками программирования и операционными системами.

Переменным типа Boolean можно присваивать только значения True (истина) и False (ложь). Переменные ByteBool, WordBool и LongBool могут принимать и другие порядковые значения, интерпретируемые обычно как False в случае нуля и True — при любом ненулевом значении.

Совет:

Булевы типы в Delphi можно сравнить с типом LOGICAL языка FORTRAN. В Basic, С и C++ булевы типы как таковые отсутствуют. Булевы выражения в этих языках применяются точно так же, как во всех остальных, однако результаты этих выражений интерпретируются не как значения отдельного типа, а как целые числа. Как в Basic, так и в C/C++ булевы выражения дают численные результаты, интерпретируемые как False в случае 0 и True — в случае любого ненулевого значения. Это совместимо с порядковыми значениями булевых выражений в Delphi. В C/C++ простые сравнения дают результат 1 (True) или 0 (False). Это эквивалентно булевым значениям Delphi. Только результат сравнения в Delphi выводится как булевый, а не целый. В большинстве случаев типу Boolean из Delphi соответствует тип char в C/C++. В Basic зарезервированы слова TRUE (эквивалентно константе -1) и FALSE (эквивалентно константе 0). В Basic TRUE меньше FALSE, в Delphi, наоборот, False меньше True.

Перечислимые типы

Обычно данные перечислимых типов содержат дискретные значения, представляемые не числами, а именами. Тип Boolean— простейший перечислимый тип в Object Pascal. Булевы переменные могут принимать два значения, выражаемые именами True и False, а сам тип определен в Object Pascal так, как будто он объявлен следующим образом:

С помощью типа Boolean в Object Pascal выполняются сравнения, большинство же перечислимых типов — это просто списки уникальных имен или идентификаторов, зарезервированных с конкретной целью. Например, можно создать тип MyColor (мой цвет) со значениями myRed, myGreen и myBlue (мой красный, мой зеленый, мой синий). Это делается совсем просто:

В этой строке объявлены четыре новых идентификатора: MyColor, myRed, myGreen и myBlue. идентификатором MyColor обозначен порядковый тип, следовательно, в синтаксисе Object Pascal можно применять этот идентификатор везде, где разрешены перечислимые типы. Остальные три идентификатора— это значения типа MyColor. Подобно символьным и булевым типам перечислимые не являются числами, и использовать их наподобие чисел не имеет смысла. Однако перечислимые типы относятся к порядковым, так что значения любого такого типа упорядочены. Идентификаторам в списке присваиваются в качестве порядковых номеров последовательные числа. Первому имени присваивается порядковый номер 0, второму — 1 и т.д.

Совет:

В С и C++ есть тип enema, аналогичный перечислимому типу Delphi. Но в этих языках можно произвольно присваивать идентификаторам постоянные значения. В Delphi же соответствие имен и их значений фиксировано: первому имени присваивается значение 0, каждому последующему — на единицу больше. В С тип enum применяется лишь как средство быстрого определения набора целых постоянных. В C++ объявленные в перечислимом типе идентификаторы можно присваивать только переменным того же типа.

Поддиапазонные типы

Переменные поддиапазонного типа содержат информацию,соответствующую некоторому pаданному диапазону значений исходного типа, представляющего любой порядковый тип, кроме поддиапазонного. Синтаксис определения поддиапазонного типа имеет следующий вид:

Поддиапазонные переменные сохраняют все особенности исходного типа. Единственное отличие состоит в том, что переменной поддиапазонного типа можно присваивать только значения, входящие в заданный поддиапазон. Контроль за соблюдением этого условия задается командой проверки диапазона (range checking).

Необходимость явно определять поддиапазонный тип возникает нечасто, но все программисты неявно применяют эту конструкцию при определении массивов. Именно в форме поддиапазонной конструкции задается схема нумерации элементов массива.

Действительные типы

В переменных действительных типов содержатся числа, состоящие из целой и дробной частей. В Object Pascal определено шесть действительных типов. Все типы могут представлять число 0, однако они различаются пороговым (минимальным положительным) и максимальным значениями, которые могут представлять, а также точностью (количеством значащих цифр) и объемом. Действительные типы описываются в табл. 1.5.

Таблица 1.5. Действительные типы.

Тип Порог Максимальное значение Количество значащих цифр Объем (байт)
Real 2.9E-39 1.7Е38 11-12 6
Single 1.5E-45 3.4Е38 7-8 4
Double 5.0E-324 1.7Е308 15-16 8
Extended 3.4E-4932 1.IE4932 19-20 10
Comp 1.0 9.2Е18 19-20 8
Currency 0.0001 9.2Е14 19-20 8

Совет:

Тип Real предназначен для совместимости с ранними версиями Delphi и Borland Pascal. Формат этого типа неудобен для семейства процессоров Intel, поэтому операции с типом Real выполняются несколько медленнее операций над остальными действительными типами.

Целые типы представляют целые числа, т.е. числа, дробная часть которых равна нулю. Разница между двумя неодинаковыми целыми числами не может быть меньше единицы. Именно благодаря этому целые числа применяются для обозначения дискретных величин, независимо от того, имеют ли реальные объекты какое-либо отношение к числам. Действительные типы предназначены для представления чисел, которые могут иметь дробную часть, поэтому они полезны для представления величин, которые могут быть довольно близкими, почти непрерывными.

Заметьте, именно почти. Несмотря на название действительные, переменные этих типов отличаются от математических действительных чисел. В Object Pascal действительный тип — это подмножество математических действительных чисел, которые можно представить в формате с плавающей запятой и фиксированным числом цифр. Для невнимательных программистов ситуация усугубляется тем, что в стандартных форматах IEEE (Institute of Electrical and Electronic Engi-neers — Институт инженеров- электриков и электронщиков), применяемых в программах Delphi и вообще в большинстве программ для Windows, возможно точное представление только чисел с фиксированным числом бит в дробной части. Удивительно, но такое простое число, как 0,1, записывается в расширенном формате IEEE с некоторой погрешностью, пусть очень небольшой. Из-за этого представление с плавающей запятой оказывается несколько неудобным для программ, в которых сохраняется и выводится фиксированное число десятичных разрядов численных значений. Это относится и к программам, работающим с »живыми» деньгами.

Для частичного решения этой проблемы в Object Pascal определены два формата с фиксированной запятой. Тип Comp (computational — вычислительный) содержит только целые числа в диапазоне от -2 63 +1 до 2 63 -1, что примерно соответствует диапазону от —9,2х10 18 до 9,2х10 18 . При программировании операций с американской валютой разработчикам обычно приходится искать естественный способ записи денежных сумм, в котором целая часть числа определяет количество долларов, дробная — центов. Если такие значения записывать в переменные типа Comp, придется представлять их в виде целого числа центов. В этом случае следует умножать значение на 100 для обращения центов в доллары, а затем делить на 100, чтобы снова получить центы.

Илон Маск рекомендует:  Iis проверка идентификации компьютера

Этих забот можно избежать, если воспользоваться типом Currency. В этом случае задачу выбора масштаба возьмет на себя компилятор. Физически значения Currency записываются в память того же объема, что и Comp, как целые числа, однако компилятор не забывает вовремя разделить значение на 10 000 (не на 100!) для его приведения в соответствие с денежным знаком и умножить на 10 000 перед записью в память. Это обеспечивает абсолютную точность в четыре десятичных знака после запятой.

В Delphi есть модуль System, содержащий ряд процедур обработки данных действительных типов. Наиболее распространенные из них перечислены в табл. 1.6. Много полезных процедур содержится также в модулях SysUtils и Math.

Таблица 1.6 — Функции действительных типов

Функция Возвращаемое значение
Abs (x) Абсолютная величина х
АгсТаn(х) Арктангенс х
Cos (х) Косинус х (х выражается в радианах, а не в градусах)
Ехр (х) Экспоненциальная функция от х
Frac(x) Дробная часть х
Int (х) Целая часть х. Несмотря на название, возвращает действительное значение (с плавающей запятой), т.е. просто устанавливает нуль в дробной части
Ln (х) Натуральный логарифм от х
Pi Число Пи (3.1416. )
Round (х) Ближайшее к х целое значение. Возвращает значение целого типа. Условие «ближайшее к х» не работает, если верхнее и нижнее значения оказываются равноудаленными (например, ес-ли дробная часть точно равна 0,5). В этих случаях Delphi перекладывает решение на опера-ционную систему. Обычно процессоры Intel решают эту задачу в соответствии с рекоменда-цией IEEE округлять в сторону ближайшего четного целого числа. Иногда такой подход на-зывают «банкирским округлением»
Sin(x) Синус х
Sqr(x) Квадрат х, т.е. X*X
Sqrt (х) Квадратный корень от х
Тrunc (х) Целая часть х. В отличие от Int, возвращающей действительное значение, Trunc возвращает целое

Совет:

Будьте внимательны при переносе численных выражений из одного языка в другой. В Basic функция SQR вычисляет квадратный корень, а функция Sqr из Delphi — квадрат числа. Для вычисления квадратного корня в Delphi применяется функция Sqrt.

Chr — Функция Delphi

От Delphi 4 к Delphi 5
Программный модуль Delphi состоит из раздела interface (интерфейс) и раздела implementation (реализации).

Идентификаторы, которые объявляются в разделе интерфейса, доступны всем другим модулям и программам, использующим данный модуль. Такие элементы программы, как константы, переменные, функции и процедуры, могут использоваться в области видимости, которая зависит от того места, в котором определен элемент.

Перед рассмотрением вопроса доступности идентификаторов в разделах программного модуля определимся кратко с константами, переменными и типами данных.

Константы (постоянные величины), или константные выражения, – это имена для фиксированных значений, на которые происходит ссылка в программах. Константа дает возможность обращаться к этим значениям по имени. Значение их не меняется в течение выполнения вашего приложения.

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

Синтаксис объявления констант следующий:


Const
ИмяКонстанты1=значение константы;
ИмяКонстанты2=константное выражение;

ИмяКонстантыN=значение константы;

Ключевое слово const стоит вначале блока. После него следует объявление констант. Оно состоит из имени константы, знака равенства и значения константы. В конце объявления ставится точка с запятой. В одном блоке может быть объявлена одна или несколько констант. Таких блоков объявлений может быть несколько.

Примеры объявления констант:

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

Примеры константных выражений:

Имеются предопределенные константы: True — истина, False — ложь, Nil — нулевой указатель.

Константное выражение может использовать константы, ранее объявленные именованные константы, арифметические операции, значения переменных типов, конструкторы множеств, а также следующие встроенные функции: Abs, Addr, ArcTan, Chr, Cos, Exp, Frac, Hi, High, Int, Lenght, Ln, Lo, Low, Odd, Ord, Pi, Pred, Round, Sin, SizeOf, Sqr, Sqrt, Succ, Swap, Trunc.

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

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

Значения строковых констант заключаются в одинарные кавычки и содержат последовательность любых символов. При включении в текст строки одинарной кавычки необходимо кавычки повторить дважды.

Имеется такой вид констант, как строки ресурсов. Они включаются в проект с помощью ключевого слова resourcestring вместо const.

Пример строки ресурсов:


resourcestring
ThisGoodText=’
Это хороший текст ‘;
Константы записи.

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

TPoint=record
X, Y: Single;
end;
TVector=array[0..1] of TPoint;
TMonth=(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TDate=record
D: 1..31;
M: TMonth;
Y: 1900..1999;
end;
const
Origin: TPoint=(X: 0.0; Y: 0.0);
Line: TVector=((X: -3.1; Y: 1.5), (X: 5.8; Y: 3.0));
SomeDay: TDate=(D: 2; M: Dec; Y: 1960);

При объявлении констант массива величины элементов массива разделяются запятыми и заключаются круглыми скобками. Эти величины должны представляться постоянными выражениями. Например,


const Digits: array[0..9] of Char=(‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’);

объявляется типизированная константа, с именем «цифры», которая содержит массив символов.

Более удобно это объявление можно представить как:


const Digits: array[0..9] of Char=’0123456789′;

Многомерные константы можно представить следующим образом:


type TCube=array[0..1, 0..1, 0..1] of Integer;
const Maze: TCube=(((0, 1), (2, 3)), ((4, 5), (6,7)));

Переменная – это именованный тип данных заранее определенного типа. С точки зрения технических подробностей, это область памяти, определенная программистом, где можно сохранять значения. Тип переменной определяет виды значений, которые вы можете там хранить.

Переменная имеет следующие характеристики.


Имя переменной –
идентифицирует ее, дает возможность ссылаться на место памяти, где хранится переменная.


Тип переменной –
определяет, какие виды значений являются для нее возможными и операции, которые допускаются для работы с переменными.

Перед тем, как использовать переменные, их необходимо объявить. Объявление сообщает компилятору размер области памяти, резервируемой для каждой переменной.

Объявление переменных производится с использованием ключевого слова var.

Синтаксис объявления имеет вид:

Блок объявлений переменных начинает ключевое слово var.

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


Пример объявления переменных:


var
Summa: Integer;
Divident,
Divisor: Real;
BinaryNamber: Byte;
SurmameOfAuthor: String;

Переменные можно разделить на локальные и на глобальные.


Локальными переменными
являются переменные, объявленные в процедурах и функциях. Они существуют только во время выполнения соответствующей процедуры или функции. Выделение памяти под локальные переменные происходит только при вызове процедуры или функции и освобождается при возврате в вызвавшую процедуру или функцию.

Переменные, которые объявляются вне процедур или функций, называются глобальными переменными.

Глобальные переменные можно инициализировать в их объявлениях, т.е. задавать им начальные значения.

Пример инициализации глобальной переменной:

Локальные переменные инициализировать нельзя.

Можно создавать динамические переменные, выделяя для них место в динамически распределяемой области памяти heap (куча), с использованием процедур GetMem и New. Освобождение памяти производится процедурами FreeMem и Dispose. Можно также использовать для динамических переменных функции ReallocMem, Initialize, StrAlloc, StrDispose.

Типы данных в Object Pascal можно разделить на предопределенные (встроенные) типы данных и типы данных, определяемые пользователем.


Данные —
это информация, с которой работают компьютеры. На самом низком, машинном уровне это последовательность нулей и единиц. Языки высокого уровня позволяют работать с данными более абстрактным способом, игнорируя подробности реализации и физического хранения.


Тип данных —
это множество значений вместе со всеми операциями, которые могут выполняться с этими значениями. Определение переменной связывает ее с уникальным типом. Т.е. значения, которые переменная может содержать, ограничиваются ее типом.

Язык программирования Object Pascal определяет ряд типов данных, называемых стандартными типами данных. К ним относятся следующие типы: целые, действительные или вещественные, символы, строки, указатели, булевы, variant.

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

Это слово начинает раздел объявления типов, синтаксис объявления которых следующий:


type <
Когда один идентификатор типа объявлен, используем другой идентификатор типа, без определения типа, оба обозначают тот же тип >
T1=Integer;
T2=T1;
T3=Integer;
T4=T2;
type TMyString=string;
Объявление типа можно использовать для создания псевдонима встроенного типа >
type TMyInteger=type Integer; <
Для того чтобы создавать четкий тип, повторите слово type в описании >
type MyString=string[10]; <
определение переменных для введенного пользователем типа >
var
S1: MyString;
S2: MyString;

Целые типы данных.

Целые типы данных используются для представления целых чисел. Они относятся к целым порядковым типам.

Целые числа состоят только из цифр и знака «+» или «-«. Если знак опущен и число не равно 0, то оно рассматривается как положительное, например:

Ниже приведены значения, которые определены для Delphi 5.

Тип Byte, диапазон значений 0 255, размер 1 байт.

Тип Word, диапазон значений 0 65535, размер 2 байта.

Тип Longword, диапазон значений 0 4294967295, размер 4 байта

Тип ShortInt, диапазон значений -128 127, размер 1 байт.

Тип SmallInt, диапазон значений -32768 32767, размер 2 байта.

Тип Cardinal, диапазон значений 0 4294967295, размер 4 байта.

Тип Integer, диапазон значений -2147483648 2147483647, размер 4 байта.

Тип LongInt, диапазон значений -2147483648 2147483647, размер 4 байта.

Тип Int64, диапазон значений -2 63 (2 63 – 1), размер 8 байт.

Родовыми типами (т.е. обеспечивающими максимальную производительность) среди перечисленных выше являются Integer и Cardinal . В настоящий момент тип Integer эквивалентен типу LongInt, но в последующих версиях это может быть изменено.

Приведенные затраты памяти могут изменяться от версии к версии и от системы к системе. Поэтому если требуется достоверно знать затраты памяти для того или иного типа, следует пользоваться функцией SizeOf.

Попытка увеличения значения переменной, уже имеющей максимальное для данного типа значение, приведет к циклическому переходу на минимальное значение. Это произойдет, если не включена директива проверки диапазона целочисленных значений и не установлена опция Range Checking в окне опций проекта. Иначе в процессе выполнения будет генерироваться исключение с сообщением «Range check error».

Рассмотрим пример использования целых типов в приложениях.

В данном примере объявляется четыре целые переменные Minute, Hour, Day, Year. После ключевого слова begin производится инициализация переменной Minute со значением 60, столько секунд содержится в минуте. Следующая строка вычисляет, сколько секунд содержится в часе, переменная Hour присваивается результат вычисления Minute * 60, т.е. увеличивается в 60 раз значение, хранящееся в переменной Minute. Результат помещается в переменную Hour, и так далее .

Булевы типы данных.

Переменные булевых типов данных представляют логические значения, например, true (истина) и false (ложь). Булевы типы относятся к целым порядковым типам. Ниже приведены основные булевы типы для Delphi 5 . Столь большое число одинаковых по смыслу типов связано с желанием обеспечить совместимость Delphi с другими системами. Предпочтительнее всегда использовать тип Boolean, кроме обращений к каким-нибудь процедурам, явным образом требующим другой тип.

Тип Boolean — булева величина в один байт.

Тип ByteBool — булева величина в один байт.

Тип WordBool — булева величина в одно слово.

Тип LongBool — булевая величина в два слова.

Булевы типы с определенным размером обычно используются для совместимости со средой Windows на низком уровне. Как правило, вы не будете испытывать в них потребности, пока не станете иметь дело с интерфейсами низкого уровня для Windows.

Рассмотрим пример использования булевых переменных.


var
Cell, Cell1: Boolean;
Result: Boolean;
begin
Cell:=True;
Cell1:=not Cell;
Result:=Cell and Cell1;
end;

В данном примере объявляется три переменные булевого типа. Переменные Cell и Cell1 объявлены вместе. Переменная Result объявлена отдельно. В первой строке после ключевого слова begin переменной Cell присвоено значение True. Во второй строке переменной Cell1 присвоено значение логически противоположное тому, которое имеет переменная Cell. Выражение not Cell значит: возьмите значение Cell и проинвертируйте его, т.е. сделайте отрицание. Следующая строка Result:=Cell and Cell1 означает: возьмите значение Cell и объедините его со значением Cell1, используя логический оператор and. Результат этого выражения присвойте значению Result.

Действительные типы данных.

Действительные типы данных предназначены для хранения чисел, имеющих дробную часть. Ниже приведены значения действительных типов данных для Delphi 5 и даются диапазоны их изменений.

Действительные или вещественные числа содержат целую и дробную части, например:

Вещественные числа могут быть представлены в двух формах: с фиксированной и плавающей точкой.

Форма с фиксированной точкой совпадает с обычной записью чисел: 299 <точка в конце числа опущена>, 3.14

Форма с плавающей точкой используется при работе с очень большими или малыми числами. В этой форме число, стоящее перед Е, умножается на 10 в степени, указанной в Е.

Тип Real 48, диапазон значений 2.9*10 –39 1.7*10 38 , число значащих разрядов 11–12, размер 6 байт.

Тип Real, диапазон значений 5.0*10 -324 1.7*10 308 , число значащих разрядов 15–16, размер 8 байт.

Тип Single, диапазон значений 1.5*10 -45 3.4*10 38 , число значащих разрядов 7–8, размер 4 байта.

Тип Double, диапазон значений 5.0*10 -324 1.7*10 308 , число значащих разрядов 15–16, размер 8 байт.

Тип Extended, диапазон значений 3.6*10 -4932 1.1*10 4392 , число значащих разрядов 19–20, размер 10 байт.

Тип Comp, диапазон значений, -2 63 2 62 , число значащих разрядов 19–20, размер 8 байт.

Тип Currency, диапазон значений -922337203685477.5808 922337203685477.5807, число значащих разрядов 19–20, размер 8 байт.

Родовым (т.е. обеспечивающим максимальную производительность) является тип Real, который в настоящий момент эквивалентен типу Double, но в последующих версиях это может быть изменено.

Наименьшую производительность обеспечивает тип Real48, сохраняемый только для обратной совместимости с более ранними версиями языка.

Рассмотрим пример использования действительных (вещественных) чисел.


const
DefaultDaily=300.00;
var
Form1: TForm1;
implementation
<$R *.DFM>
procedure TForm1.Button1Click(Sender: TObject);
var
Hour: Real;
Day, Month: Single;
Annually: Double;
begin
Day :=DefaultDaily;
Hour :=Day/8;
Month:=Day*20;
Annually:=Month*12;
end;
end.

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

Объявлены четыре переменные действительного типа Real, Single, Double.

Символьные типы данных.

Символьные типы предназначены для хранения одного символа. Они относятся к целым порядковым типам. Ниже приведены значения символьных типов данных. Наличие двух разных типов — ANSIChar и WideChar связано с двумя различными множествами символов: ANSI, каждый символ которого занимает 1 байт, и Unicode, каждый символ которого занимает 2 байта. Первые 256 символов в этих множествах одинаковы и соответствуют символам ASCII от 0 до 255.

Тип ANSIChar, размер 1 байт, хранит один символ ANSI.

Тип WideChar, размер 2 байта, один символ Unicode.

Тип Char, размер 1 байт, хранит один символ. Сейчас эквивалентен ANSIChar . В будущих версиях Delphi, может быть, будет эквивалентен WideChar .

Родовым (т.е. обеспечивающим максимальную производительность) является тип Char . Именно тип Char имеет смысл использовать во всех случаях, кроме обращений к функциям, требующим другой тип символьных данных.

Для символьного типа предопределена функция Chr, возвращающая символ любого целого значения в пределах AnsiChar или WideChar. Например, Chr (65) возвращает букву «A». Поскольку символьные типы относятся к порядковым типам, для них предопределены такие функции и процедуры, как Ord, Pred, Succ, Inc, Dec и др. Функция Ord, возвращающая номер символа, противоположна по смыслу функции Chr . Т.е. Ord (Chr(65)) вернет 65, а Chr (Ord(‘A’)) вернет символ «A».

Рассмотрим пример использования символов в приложении.

Он иллюстрирует, как необходимо объявлять и присваивать различные значения символьной переменной.

В программе объявлены две символьные переменные, Tetta и Etta. Переменной Tetta присвоено значение f. Переменной Etta присвоено значение F.

Тип данных строки.

Строки представляют собой последовательность символов. Ниже приведены значения типов строк.

Тип ShortString, максимальная длина 255, используется для обратной совместимости.
Тип AnsiString, максимальная длина 2 31 (2 Гб) символов ANSI .
Тип String, максимальная длина или 255, или до 2 Гб символов ANSI или Unicode .
Тип WideString, максимальная длина 2 30 (1 Гб) символов Unicode, используется в серверах COM и интерфейсах.

Родовым является тип String, который имеет разный смысл в зависимости от директивы компилятора $H. Если включена директива (она включена по умолчанию), то String интерпретируется компилятором как тип AnsiString — длинная строка с нулевым символом в конце. Если же включить директиву <$H->, то String интерпретируется компилятором как тип ShortString — короткая строка без нулевого символа в конце. Если в объявлении типа после ключевого слова String следует число символов в квадратных скобках (например, String[4]), то, независимо от директив компилятора, тип трактуется как строка без нулевого символа в конце с указанным числом символов.

Рассмотрим пример использования строк в приложении.

Когда вы объявляете переменную типа String, компилятор резервирует память достаточную для размещения в строке 255 символов. Однако вы можете определить длину вашей строки с целью сохранения памяти. Таким образом, вы должны внимательно подходить к определению длины строк и не резервировать большее количество памяти, чем это необходимо.

Пример иллюстрирует использование строк различной длины в операторах присваивания и выражениях.


var
SurName,
Name,
PatronymicName: String[15];
Buffer: String [45];
begin
SurName:=’Skuratow’;
Name :=’Wladimir’;
PatronymicName:=’Petrowich’;
Buffer:=Surname + Name + PatronymicName;
end;

Компонент Image предназначен для размещения на форме одного из поддерживаемых Delphi типов изображений: пиктограммы, растровой картинки или метафайла.

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

Поместите компонент Image со страницы Additional на форму. Центральное свойство этого компонента, которое может содержать изображение, — свойство Picture. Д ля того чтобы поместить изображение на форму, необходимо произвести двойной щелчок по компоненту Image или щелкнуть по кнопке с тремя точками справа от свойства Picture на странице Properties инспектора объекта. Откроется диалоговое окно Picture Editor, позволяющее загрузить в свойство Picture какой-нибудь графический файл. Для загрузки изображения щелкните по кнопке Load. Откроется диалоговое окно Load Picture (рисунок 1) . При перемещении по открытым графическим файлам в правом окне отображаются содержащиеся в них картинки, а над ним — цифры, характеризующие размер картинки (рисунок 2). Как видите, в Delphi 5 появилось удобное загрузочное окно, позволяющее предварительно просмотреть изображения картинок. Графические файлы в Delphi 4 расположены в каталоге Program Files \ Common Files \ Borland Shared. Графические файлы в Delphi 5 расположены в каталоге Program Files \ Common Files \ Borland \ Borland Shared. Можно использовать изображения из каталога Program Files \ Microsoft Office \ Clipart \ Popular.

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

Вы можете создать рисунок самостоятельно, используя уже имеющиеся рисунки, например с использованием редактора Word . Редактор Word предлагает воспользоваться рисунками, которые уже созданы. Но просто вставленный рисунок может не удовлетворять вас по своему виду, цвету или по наличию или отсутствию отдельных элементов. Редактор Word предлагает вам преобразовывать рисунки к виду, которые могут быть очень далеки от их оригиналов, причем в лучшую сторону. Чтобы использовать имеющиеся рисунки, необходимо запустить текстовый редактор Word. В строке главного меню Microsoft Word выберите кнопку Вставка, щелкните по ней, из раскрывшегося меню выберите Рисунок и далее Картинки. Щелкните по команде Картинки. Раскроется диалоговое окно Microsoft Clip Gallery 3.0 (рисунок 3). Из предложенного раздела Графика выберите подраздел Хозяйство. Активизируйте, например, рисунок Часы и щелкните по кнопке Вставить. После этого рисунок Часы импортируется в ваш документ на место, указанное курсором (рисунок 4).

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

Ваше первое преобразование может быть сразу сведено, возможно, к уменьшению его размера. Произведите выделение рисунка: подведите курсор к значкам, выделяющим данный рисунок. И в момент превращения курсора в двойную стрелку, нажмите левую кнопку мыши и, изменяя положения мыши на коврике, измените размер вашего рисунка. На импортируемом рисунке часы показывают 7 часов 52 минуты, измените время, показываемое часами, на 9 часов. Измените положение часов в текстовом документе и цвет. Для этого подведите курсор к меню Microsoft Word, щелкните правой кнопкой мыши и из раскрывшегося меню выберите команду Рисование . Над панелью задач появится панель Рисование. Подведите маркер к рисунку Часы, и после того как он превратится в четырехстороннюю стрелку, щелкните кнопкой для выделения нашего рисунка. Не снимая выделения, нажмите кнопку Действия. В раскрывшемся меню выберите команду Разгруппировать. Данную процедуру повторите несколько раз, пока команда Разгруппировать не перестанет быть активной. Для данного рисунка необходимо 8 раз проделать данную процедуру, после чего рисунок будет разбит на отдельные составные части, с которыми вы и будете работать дальше.

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

Как видно из вновь полученного рисунка (рисунок 5), проведены изменения цветовой гаммы рисунка, изменен наклон часов, изменен цвет тени. А также устранена ошибка, так как на исходном рисунке, на часах цифра девять повторена два раза, удалено светлое пятно с изображения рисунка.

Возможно также преобразование рисунков, взятых из файлов. Для этого необходимо выйти на кнопку меню Microsoft Word, выбрать команду Рисунок и в раскрывшемся меню выбрать команду Из файла . Раскроется диалоговое окно Добавить рисунок с предложением выбрать папку с содержанием различных рисунков, которые можно преобразовывать способом, рассмотренным выше.

После преобразования рисунка произведите группирование отдельных элементов. Выделите созданный рисунок, скопируйте его в буфер обмена. Далее запустите графический редактор Paint, вставьте рисунок. Здесь можете произвести дополнительные преобразования, далее сохраните рисунок в выбранной папке с расширением . bmp.

Рассмотрим свойства компонента Image.

Если вы установите свойство AutoSize в True, то размер компонента Image будет автоматически подгоняться под размер помещенной картинки. Если свойство AutoSize установлено в False, то изображение может не поместиться в компонент, или наоборот, размер компонента может быть больше размера картинки.

Свойство Center указывает, нужно ли центрировать изображение в границах компонента. Игнорируется, если свойство AutoSize равно True или если свойство Stretch равно True и изображение не является пиктограммой (ICO).

Свойство Stretch позволяет подгонять не компонент под размер рисунка, а рисунок под размер компонента. Для этого установите свойство AutoSize в False, растяните или сожмите размер компонента Image и установите Stretch в True. Вы увидите, что рисунок займет всю площадь компонента, но здесь возможно искажение рисунка. Поэтому устанавливать размеры Image точно пропорционально размеру рисунка может иметь смысл только для изображений не подверженных искажениям (узоры, линии). Свойство Stretch не распространяется на пиктограммы, которые не изменяют своих размеров.

Свойство Transparent (прозрачность). Если свойство установлено в True, то изображение в Image становится прозрачным. Данное свойство можно использовать для наложения изображений друг на друга. Чтобы это увидеть, поместите два компонента Image на форму, загрузите в них картинки. Передвиньте компоненты друг на друга, установите для верхнего компонента Image свойство Transparent равное True. Вы увидите, верхняя картинка перестала заслонять нижнюю картинку (рисунок 6). Вы можете поэкспериментировать с данным свойством, возможно, получите оригинальные совмещенные изображения для вашего приложения.

  1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО «Малип». 1997 г.
  2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
  3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
  4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
  5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО «Издательство Бином». 2000 г.

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

Chr — Функция Delphi

Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.5.2005

Репутация: нет
Всего: нет

Переписываю код с delphi на С под линукс, встретилась функция chr, а ее аналога для С найти не могу

Вот ее описание для delphi:

Цитата
Function Chr(X: Byte): Char;
Возвращает символ с порядковым номером Х в ASCII-таблице.

Как ее пожно переписать на С?

Это сообщение отредактировал(а) kирилл — 18.7.2006, 11:39

Профиль
Группа: Участник
Сообщений: 57
Регистрация: 22.5.2004
Где: Мытищи

Репутация: нет
Всего: нет

Orthenner
Дата 18.7.2006, 12:22 (ссылка) | (нет голосов) Загрузка .
Код
#include «stdio.h»
#include «stdlib.h»

int main(int argc, char** argv)
<
char x=atoi(argv[1]);
printf(«%c\n»,x);
return 0;
>

Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.5.2005

Репутация: нет
Всего: нет

kирилл
Дата 18.7.2006, 12:29 (ссылка) | (нет голосов) Загрузка .
Код
for i := 0 to Length(Data) div 2 — 1 do
begin
x := Pos(Data[i * 2 + 1], ss) — 1;
if x

По идее должно получиться что-то вроде:

Код
for (i = 0; i

Это сообщение отредактировал(а) kирилл — 18.7.2006, 12:31

Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14

ptr
Дата 18.7.2006, 14:54 (ссылка) | (нет голосов) Загрузка .
Цитата(kирилл @ 18.7.2006, 16:29 )
По идее должно получиться что-то вроде:


На первый взгляд вроде так.

Цитата(Orthenner @ 18.7.2006, 16:22 )
char x=atoi(argv[1]);

Масло масляное. Из char в int, а потом опять в char.

Это сообщение отредактировал(а) ptr — 18.7.2006, 14:57

Профиль
Группа: Участник
Сообщений: 57
Регистрация: 22.5.2004
Где: Мытищи

Репутация: нет
Всего: нет

Orthenner
Дата 18.7.2006, 15:40 (ссылка) | (нет голосов) Загрузка .
Цитата(ptr @ 18.7.2006, 15:54)
Цитата(Orthenner @ 18.7.2006, 16:22 )
char x=atoi(argv[1]);

Масло масляное. Из char в int, а потом опять в char.

Профиль
Группа: Завсегдатай
Сообщений: 3030
Регистрация: 9.11.2003

Репутация: 8
Всего: 58

Не парни, ну вы гоните

kирилл,
char и BYTE
в Си есть суть одно и тоже. Учи Си Фэйс контроль (контроль типов) в данном случае отсутствует напрочь.

GrayCardinal
Дата 18.7.2006, 18:13 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.5.2005

Репутация: нет
Всего: нет

Вопрос остается открытым, так как совершенно не ясно, как же заменить функцию chr

GrayCardinal, посмотрел Ваши посты в других топиках. Что не пост, то флуд и не более. Надо учиться выражаться по сути вопроса !.

kирилл
Дата 24.7.2006, 11:13 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: нет
Всего: 8

HappyLife
Дата 24.7.2006, 11:58 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 4
Всего: 181

nickless
Дата 24.7.2006, 15:38 (ссылка) | (нет голосов) Загрузка .
Цитата(kирилл @ 24.7.2006, 10:13)
Вопрос остается открытым, так как совершенно не ясно, как же заменить функцию chr

Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies
— Linus Torvalds

Профиль
Группа: Завсегдатай
Сообщений: 3030
Регистрация: 9.11.2003

Репутация: 8
Всего: 58

GrayCardinal
Дата 26.7.2006, 11:44 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Difference function Char / Chr in Delphi 2007 and XE3

I am using function Char and Chr with parameter 130 and has behave different in Delphi 2007 e XE3.

Delphi 2007: Char( 130 ) or Chr( 130 ) — Result: Comma

Delphi XE3: Char( 130 ) or Chr( 130 ) — Result: #$0082

I problem resolve using AnsiChar( 130 ).

My question is if I have problems using the AnsiChar. Should I change Chr / Char by AnsiChar throughout the project?

1 Answer 1

These two are slightly different:

  • Char(130) is a value typecast rather than a function call. An integer with value 130 is converted to a Char with that ordinal.
  • Chr(130) is indeed a function call. It invokes the intrinsic function Chr() .

In both pre and post Unicode versions of Delphi, you can use the Char() and Chr() versions interchangeably. However, the results differ depending on the Delphi version you use.

For pre-Unicode Delphi, Char is an 8 bit ANSI character. For post-Unicode Delphi, Char is a 16 bit UTF-16 character.

Exactly how you should resolve this depends on what you are trying to achieve. If you wish to bury your head in the sand, and pretend that Unicode characters don’t exist, then perhaps you want to replace all your use of Char with AnsiChar . And you’ll also want to hope that your program is only ever run on a machine with a locale that maps character 130 onto that character. Do be aware that not all Windows ANSI locales do so.

However, I suspect that the right solution to your problem, whatever it is, will be to embrace Unicode, and use the UTF-16 encoding for that character. It is SINGLE LOW-9 QUOTATION MARK U+201A. Write it like this in Unicode Delphi:

On the other hand, perhaps you actually do want a comma, noting that AnsiChar(130) is not a comma but is in fact a quotation mark.

If you want a comma (COMMA U+002C), well that’s easy:

delphi chr

Oracle chr

Автор Nick Brown задал вопрос в разделе Другие языки и технологии

Люди,объясните подробно,пожалуйста,что значит в Паскале функция ord(x) и ей обратная chr(x) ? и получил лучший ответ

Ответ от Georgiy Prokopenko[гуру]
Есть специальная таблица символов (расширенного кода ASCII, когда каждому символу принадлежит числовое значение, всего в таблице имеется 255 значений, то есть каждому символу присвоено число,
chr(0..254) преобразует число (один байт) в символ которому принадлежит данное число, например chr(71) результатом будет буква «G», так же нажатие клавиш на клавиатуре выдаёт свой код вот как раз этот код при постановке в данный оператор и выдаст результатом какая клавиша нажата, это я к примеру. А вот оператор ORD(x) делает данный процесс в обратном порядке.
Задаём значение символ и получаем число от 0 до 254 (один байт)
например ORD(«G») даст нам результат 71 (в десятичном формате)
Вот вроде и всё .

Chr — Функция Delphi

От Delphi 4 к Delphi 5
Программный модуль Delphi состоит из раздела interface (интерфейс) и раздела implementation (реализации).

Идентификаторы, которые объявляются в разделе интерфейса, доступны всем другим модулям и программам, использующим данный модуль. Такие элементы программы, как константы, переменные, функции и процедуры, могут использоваться в области видимости, которая зависит от того места, в котором определен элемент.

Перед рассмотрением вопроса доступности идентификаторов в разделах программного модуля определимся кратко с константами, переменными и типами данных.

Константы (постоянные величины), или константные выражения, – это имена для фиксированных значений, на которые происходит ссылка в программах. Константа дает возможность обращаться к этим значениям по имени. Значение их не меняется в течение выполнения вашего приложения.

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

Синтаксис объявления констант следующий:


Const
ИмяКонстанты1=значение константы;
ИмяКонстанты2=константное выражение;

ИмяКонстантыN=значение константы;

Ключевое слово const стоит вначале блока. После него следует объявление констант. Оно состоит из имени константы, знака равенства и значения константы. В конце объявления ставится точка с запятой. В одном блоке может быть объявлена одна или несколько констант. Таких блоков объявлений может быть несколько.

Примеры объявления констант:

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

Примеры константных выражений:

Имеются предопределенные константы: True — истина, False — ложь, Nil — нулевой указатель.

Константное выражение может использовать константы, ранее объявленные именованные константы, арифметические операции, значения переменных типов, конструкторы множеств, а также следующие встроенные функции: Abs, Addr, ArcTan, Chr, Cos, Exp, Frac, Hi, High, Int, Lenght, Ln, Lo, Low, Odd, Ord, Pi, Pred, Round, Sin, SizeOf, Sqr, Sqrt, Succ, Swap, Trunc.

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

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

Значения строковых констант заключаются в одинарные кавычки и содержат последовательность любых символов. При включении в текст строки одинарной кавычки необходимо кавычки повторить дважды.

Имеется такой вид констант, как строки ресурсов. Они включаются в проект с помощью ключевого слова resourcestring вместо const.

Пример строки ресурсов:


resourcestring
ThisGoodText=’
Это хороший текст ‘;
Константы записи.

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

TPoint=record
X, Y: Single;
end;
TVector=array[0..1] of TPoint;
TMonth=(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TDate=record
D: 1..31;
M: TMonth;
Y: 1900..1999;
end;
const
Origin: TPoint=(X: 0.0; Y: 0.0);
Line: TVector=((X: -3.1; Y: 1.5), (X: 5.8; Y: 3.0));
SomeDay: TDate=(D: 2; M: Dec; Y: 1960);

При объявлении констант массива величины элементов массива разделяются запятыми и заключаются круглыми скобками. Эти величины должны представляться постоянными выражениями. Например,


const Digits: array[0..9] of Char=(‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’);

объявляется типизированная константа, с именем «цифры», которая содержит массив символов.

Более удобно это объявление можно представить как:


const Digits: array[0..9] of Char=’0123456789′;

Многомерные константы можно представить следующим образом:


type TCube=array[0..1, 0..1, 0..1] of Integer;
const Maze: TCube=(((0, 1), (2, 3)), ((4, 5), (6,7)));

Переменная – это именованный тип данных заранее определенного типа. С точки зрения технических подробностей, это область памяти, определенная программистом, где можно сохранять значения. Тип переменной определяет виды значений, которые вы можете там хранить.

Переменная имеет следующие характеристики.


Имя переменной –
идентифицирует ее, дает возможность ссылаться на место памяти, где хранится переменная.


Тип переменной –
определяет, какие виды значений являются для нее возможными и операции, которые допускаются для работы с переменными.

Перед тем, как использовать переменные, их необходимо объявить. Объявление сообщает компилятору размер области памяти, резервируемой для каждой переменной.

Объявление переменных производится с использованием ключевого слова var.

Синтаксис объявления имеет вид:

Блок объявлений переменных начинает ключевое слово var.

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

Пример объявления переменных:


var
Summa: Integer;
Divident,
Divisor: Real;
BinaryNamber: Byte;
SurmameOfAuthor: String;

Переменные можно разделить на локальные и на глобальные.


Локальными переменными
являются переменные, объявленные в процедурах и функциях. Они существуют только во время выполнения соответствующей процедуры или функции. Выделение памяти под локальные переменные происходит только при вызове процедуры или функции и освобождается при возврате в вызвавшую процедуру или функцию.

Переменные, которые объявляются вне процедур или функций, называются глобальными переменными.

Глобальные переменные можно инициализировать в их объявлениях, т.е. задавать им начальные значения.

Пример инициализации глобальной переменной:

Локальные переменные инициализировать нельзя.

Можно создавать динамические переменные, выделяя для них место в динамически распределяемой области памяти heap (куча), с использованием процедур GetMem и New. Освобождение памяти производится процедурами FreeMem и Dispose. Можно также использовать для динамических переменных функции ReallocMem, Initialize, StrAlloc, StrDispose.

Типы данных в Object Pascal можно разделить на предопределенные (встроенные) типы данных и типы данных, определяемые пользователем.


Данные —
это информация, с которой работают компьютеры. На самом низком, машинном уровне это последовательность нулей и единиц. Языки высокого уровня позволяют работать с данными более абстрактным способом, игнорируя подробности реализации и физического хранения.


Тип данных —
это множество значений вместе со всеми операциями, которые могут выполняться с этими значениями. Определение переменной связывает ее с уникальным типом. Т.е. значения, которые переменная может содержать, ограничиваются ее типом.

Язык программирования Object Pascal определяет ряд типов данных, называемых стандартными типами данных. К ним относятся следующие типы: целые, действительные или вещественные, символы, строки, указатели, булевы, variant.

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

Это слово начинает раздел объявления типов, синтаксис объявления которых следующий:


type <
Когда один идентификатор типа объявлен, используем другой идентификатор типа, без определения типа, оба обозначают тот же тип >
T1=Integer;
T2=T1;
T3=Integer;
T4=T2;
type TMyString=string;
Объявление типа можно использовать для создания псевдонима встроенного типа >
type TMyInteger=type Integer; <
Для того чтобы создавать четкий тип, повторите слово type в описании >
type MyString=string[10]; <
определение переменных для введенного пользователем типа >
var
S1: MyString;
S2: MyString;

Целые типы данных.

Целые типы данных используются для представления целых чисел. Они относятся к целым порядковым типам.

Целые числа состоят только из цифр и знака «+» или «-«. Если знак опущен и число не равно 0, то оно рассматривается как положительное, например:

Ниже приведены значения, которые определены для Delphi 5.

Тип Byte, диапазон значений 0 255, размер 1 байт.

Тип Word, диапазон значений 0 65535, размер 2 байта.

Тип Longword, диапазон значений 0 4294967295, размер 4 байта

Тип ShortInt, диапазон значений -128 127, размер 1 байт.

Тип SmallInt, диапазон значений -32768 32767, размер 2 байта.

Тип Cardinal, диапазон значений 0 4294967295, размер 4 байта.

Тип Integer, диапазон значений -2147483648 2147483647, размер 4 байта.

Тип LongInt, диапазон значений -2147483648 2147483647, размер 4 байта.

Тип Int64, диапазон значений -2 63 (2 63 – 1), размер 8 байт.

Родовыми типами (т.е. обеспечивающими максимальную производительность) среди перечисленных выше являются Integer и Cardinal . В настоящий момент тип Integer эквивалентен типу LongInt, но в последующих версиях это может быть изменено.

Приведенные затраты памяти могут изменяться от версии к версии и от системы к системе. Поэтому если требуется достоверно знать затраты памяти для того или иного типа, следует пользоваться функцией SizeOf.


Попытка увеличения значения переменной, уже имеющей максимальное для данного типа значение, приведет к циклическому переходу на минимальное значение. Это произойдет, если не включена директива проверки диапазона целочисленных значений и не установлена опция Range Checking в окне опций проекта. Иначе в процессе выполнения будет генерироваться исключение с сообщением «Range check error».

Рассмотрим пример использования целых типов в приложениях.

В данном примере объявляется четыре целые переменные Minute, Hour, Day, Year. После ключевого слова begin производится инициализация переменной Minute со значением 60, столько секунд содержится в минуте. Следующая строка вычисляет, сколько секунд содержится в часе, переменная Hour присваивается результат вычисления Minute * 60, т.е. увеличивается в 60 раз значение, хранящееся в переменной Minute. Результат помещается в переменную Hour, и так далее .

Булевы типы данных.

Переменные булевых типов данных представляют логические значения, например, true (истина) и false (ложь). Булевы типы относятся к целым порядковым типам. Ниже приведены основные булевы типы для Delphi 5 . Столь большое число одинаковых по смыслу типов связано с желанием обеспечить совместимость Delphi с другими системами. Предпочтительнее всегда использовать тип Boolean, кроме обращений к каким-нибудь процедурам, явным образом требующим другой тип.

Тип Boolean — булева величина в один байт.

Тип ByteBool — булева величина в один байт.

Тип WordBool — булева величина в одно слово.

Тип LongBool — булевая величина в два слова.

Булевы типы с определенным размером обычно используются для совместимости со средой Windows на низком уровне. Как правило, вы не будете испытывать в них потребности, пока не станете иметь дело с интерфейсами низкого уровня для Windows.

Рассмотрим пример использования булевых переменных.


var
Cell, Cell1: Boolean;
Result: Boolean;
begin
Cell:=True;
Cell1:=not Cell;
Result:=Cell and Cell1;
end;

В данном примере объявляется три переменные булевого типа. Переменные Cell и Cell1 объявлены вместе. Переменная Result объявлена отдельно. В первой строке после ключевого слова begin переменной Cell присвоено значение True. Во второй строке переменной Cell1 присвоено значение логически противоположное тому, которое имеет переменная Cell. Выражение not Cell значит: возьмите значение Cell и проинвертируйте его, т.е. сделайте отрицание. Следующая строка Result:=Cell and Cell1 означает: возьмите значение Cell и объедините его со значением Cell1, используя логический оператор and. Результат этого выражения присвойте значению Result.

Действительные типы данных.

Действительные типы данных предназначены для хранения чисел, имеющих дробную часть. Ниже приведены значения действительных типов данных для Delphi 5 и даются диапазоны их изменений.

Действительные или вещественные числа содержат целую и дробную части, например:

Вещественные числа могут быть представлены в двух формах: с фиксированной и плавающей точкой.

Форма с фиксированной точкой совпадает с обычной записью чисел: 299 <точка в конце числа опущена>, 3.14

Форма с плавающей точкой используется при работе с очень большими или малыми числами. В этой форме число, стоящее перед Е, умножается на 10 в степени, указанной в Е.

Тип Real 48, диапазон значений 2.9*10 –39 1.7*10 38 , число значащих разрядов 11–12, размер 6 байт.

Тип Real, диапазон значений 5.0*10 -324 1.7*10 308 , число значащих разрядов 15–16, размер 8 байт.

Тип Single, диапазон значений 1.5*10 -45 3.4*10 38 , число значащих разрядов 7–8, размер 4 байта.

Тип Double, диапазон значений 5.0*10 -324 1.7*10 308 , число значащих разрядов 15–16, размер 8 байт.

Тип Extended, диапазон значений 3.6*10 -4932 1.1*10 4392 , число значащих разрядов 19–20, размер 10 байт.

Тип Comp, диапазон значений, -2 63 2 62 , число значащих разрядов 19–20, размер 8 байт.

Тип Currency, диапазон значений -922337203685477.5808 922337203685477.5807, число значащих разрядов 19–20, размер 8 байт.

Родовым (т.е. обеспечивающим максимальную производительность) является тип Real, который в настоящий момент эквивалентен типу Double, но в последующих версиях это может быть изменено.

Наименьшую производительность обеспечивает тип Real48, сохраняемый только для обратной совместимости с более ранними версиями языка.

Рассмотрим пример использования действительных (вещественных) чисел.


const
DefaultDaily=300.00;
var
Form1: TForm1;
implementation
<$R *.DFM>
procedure TForm1.Button1Click(Sender: TObject);
var
Hour: Real;
Day, Month: Single;
Annually: Double;
begin
Day :=DefaultDaily;
Hour :=Day/8;
Month:=Day*20;
Annually:=Month*12;
end;
end.

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

Объявлены четыре переменные действительного типа Real, Single, Double.

Символьные типы данных.

Символьные типы предназначены для хранения одного символа. Они относятся к целым порядковым типам. Ниже приведены значения символьных типов данных. Наличие двух разных типов — ANSIChar и WideChar связано с двумя различными множествами символов: ANSI, каждый символ которого занимает 1 байт, и Unicode, каждый символ которого занимает 2 байта. Первые 256 символов в этих множествах одинаковы и соответствуют символам ASCII от 0 до 255.

Тип ANSIChar, размер 1 байт, хранит один символ ANSI.

Тип WideChar, размер 2 байта, один символ Unicode.

Тип Char, размер 1 байт, хранит один символ. Сейчас эквивалентен ANSIChar . В будущих версиях Delphi, может быть, будет эквивалентен WideChar .

Родовым (т.е. обеспечивающим максимальную производительность) является тип Char . Именно тип Char имеет смысл использовать во всех случаях, кроме обращений к функциям, требующим другой тип символьных данных.

Для символьного типа предопределена функция Chr, возвращающая символ любого целого значения в пределах AnsiChar или WideChar. Например, Chr (65) возвращает букву «A». Поскольку символьные типы относятся к порядковым типам, для них предопределены такие функции и процедуры, как Ord, Pred, Succ, Inc, Dec и др. Функция Ord, возвращающая номер символа, противоположна по смыслу функции Chr . Т.е. Ord (Chr(65)) вернет 65, а Chr (Ord(‘A’)) вернет символ «A».

Рассмотрим пример использования символов в приложении.

Он иллюстрирует, как необходимо объявлять и присваивать различные значения символьной переменной.

В программе объявлены две символьные переменные, Tetta и Etta. Переменной Tetta присвоено значение f. Переменной Etta присвоено значение F.

Тип данных строки.

Строки представляют собой последовательность символов. Ниже приведены значения типов строк.

Тип ShortString, максимальная длина 255, используется для обратной совместимости.
Тип AnsiString, максимальная длина 2 31 (2 Гб) символов ANSI .
Тип String, максимальная длина или 255, или до 2 Гб символов ANSI или Unicode .
Тип WideString, максимальная длина 2 30 (1 Гб) символов Unicode, используется в серверах COM и интерфейсах.

Родовым является тип String, который имеет разный смысл в зависимости от директивы компилятора $H. Если включена директива (она включена по умолчанию), то String интерпретируется компилятором как тип AnsiString — длинная строка с нулевым символом в конце. Если же включить директиву <$H->, то String интерпретируется компилятором как тип ShortString — короткая строка без нулевого символа в конце. Если в объявлении типа после ключевого слова String следует число символов в квадратных скобках (например, String[4]), то, независимо от директив компилятора, тип трактуется как строка без нулевого символа в конце с указанным числом символов.

Рассмотрим пример использования строк в приложении.

Когда вы объявляете переменную типа String, компилятор резервирует память достаточную для размещения в строке 255 символов. Однако вы можете определить длину вашей строки с целью сохранения памяти. Таким образом, вы должны внимательно подходить к определению длины строк и не резервировать большее количество памяти, чем это необходимо.

Пример иллюстрирует использование строк различной длины в операторах присваивания и выражениях.


var
SurName,
Name,
PatronymicName: String[15];
Buffer: String [45];
begin
SurName:=’Skuratow’;
Name :=’Wladimir’;
PatronymicName:=’Petrowich’;
Buffer:=Surname + Name + PatronymicName;
end;

Компонент Image предназначен для размещения на форме одного из поддерживаемых Delphi типов изображений: пиктограммы, растровой картинки или метафайла.

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

Поместите компонент Image со страницы Additional на форму. Центральное свойство этого компонента, которое может содержать изображение, — свойство Picture. Д ля того чтобы поместить изображение на форму, необходимо произвести двойной щелчок по компоненту Image или щелкнуть по кнопке с тремя точками справа от свойства Picture на странице Properties инспектора объекта. Откроется диалоговое окно Picture Editor, позволяющее загрузить в свойство Picture какой-нибудь графический файл. Для загрузки изображения щелкните по кнопке Load. Откроется диалоговое окно Load Picture (рисунок 1) . При перемещении по открытым графическим файлам в правом окне отображаются содержащиеся в них картинки, а над ним — цифры, характеризующие размер картинки (рисунок 2). Как видите, в Delphi 5 появилось удобное загрузочное окно, позволяющее предварительно просмотреть изображения картинок. Графические файлы в Delphi 4 расположены в каталоге Program Files \ Common Files \ Borland Shared. Графические файлы в Delphi 5 расположены в каталоге Program Files \ Common Files \ Borland \ Borland Shared. Можно использовать изображения из каталога Program Files \ Microsoft Office \ Clipart \ Popular.

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

Вы можете создать рисунок самостоятельно, используя уже имеющиеся рисунки, например с использованием редактора Word . Редактор Word предлагает воспользоваться рисунками, которые уже созданы. Но просто вставленный рисунок может не удовлетворять вас по своему виду, цвету или по наличию или отсутствию отдельных элементов. Редактор Word предлагает вам преобразовывать рисунки к виду, которые могут быть очень далеки от их оригиналов, причем в лучшую сторону. Чтобы использовать имеющиеся рисунки, необходимо запустить текстовый редактор Word. В строке главного меню Microsoft Word выберите кнопку Вставка, щелкните по ней, из раскрывшегося меню выберите Рисунок и далее Картинки. Щелкните по команде Картинки. Раскроется диалоговое окно Microsoft Clip Gallery 3.0 (рисунок 3). Из предложенного раздела Графика выберите подраздел Хозяйство. Активизируйте, например, рисунок Часы и щелкните по кнопке Вставить. После этого рисунок Часы импортируется в ваш документ на место, указанное курсором (рисунок 4).

Ваше первое преобразование может быть сразу сведено, возможно, к уменьшению его размера. Произведите выделение рисунка: подведите курсор к значкам, выделяющим данный рисунок. И в момент превращения курсора в двойную стрелку, нажмите левую кнопку мыши и, изменяя положения мыши на коврике, измените размер вашего рисунка. На импортируемом рисунке часы показывают 7 часов 52 минуты, измените время, показываемое часами, на 9 часов. Измените положение часов в текстовом документе и цвет. Для этого подведите курсор к меню Microsoft Word, щелкните правой кнопкой мыши и из раскрывшегося меню выберите команду Рисование . Над панелью задач появится панель Рисование. Подведите маркер к рисунку Часы, и после того как он превратится в четырехстороннюю стрелку, щелкните кнопкой для выделения нашего рисунка. Не снимая выделения, нажмите кнопку Действия. В раскрывшемся меню выберите команду Разгруппировать. Данную процедуру повторите несколько раз, пока команда Разгруппировать не перестанет быть активной. Для данного рисунка необходимо 8 раз проделать данную процедуру, после чего рисунок будет разбит на отдельные составные части, с которыми вы и будете работать дальше.

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

Как видно из вновь полученного рисунка (рисунок 5), проведены изменения цветовой гаммы рисунка, изменен наклон часов, изменен цвет тени. А также устранена ошибка, так как на исходном рисунке, на часах цифра девять повторена два раза, удалено светлое пятно с изображения рисунка.

Возможно также преобразование рисунков, взятых из файлов. Для этого необходимо выйти на кнопку меню Microsoft Word, выбрать команду Рисунок и в раскрывшемся меню выбрать команду Из файла . Раскроется диалоговое окно Добавить рисунок с предложением выбрать папку с содержанием различных рисунков, которые можно преобразовывать способом, рассмотренным выше.

После преобразования рисунка произведите группирование отдельных элементов. Выделите созданный рисунок, скопируйте его в буфер обмена. Далее запустите графический редактор Paint, вставьте рисунок. Здесь можете произвести дополнительные преобразования, далее сохраните рисунок в выбранной папке с расширением . bmp.

Рассмотрим свойства компонента Image.

Если вы установите свойство AutoSize в True, то размер компонента Image будет автоматически подгоняться под размер помещенной картинки. Если свойство AutoSize установлено в False, то изображение может не поместиться в компонент, или наоборот, размер компонента может быть больше размера картинки.

Свойство Center указывает, нужно ли центрировать изображение в границах компонента. Игнорируется, если свойство AutoSize равно True или если свойство Stretch равно True и изображение не является пиктограммой (ICO).

Свойство Stretch позволяет подгонять не компонент под размер рисунка, а рисунок под размер компонента. Для этого установите свойство AutoSize в False, растяните или сожмите размер компонента Image и установите Stretch в True. Вы увидите, что рисунок займет всю площадь компонента, но здесь возможно искажение рисунка. Поэтому устанавливать размеры Image точно пропорционально размеру рисунка может иметь смысл только для изображений не подверженных искажениям (узоры, линии). Свойство Stretch не распространяется на пиктограммы, которые не изменяют своих размеров.

Свойство Transparent (прозрачность). Если свойство установлено в True, то изображение в Image становится прозрачным. Данное свойство можно использовать для наложения изображений друг на друга. Чтобы это увидеть, поместите два компонента Image на форму, загрузите в них картинки. Передвиньте компоненты друг на друга, установите для верхнего компонента Image свойство Transparent равное True. Вы увидите, верхняя картинка перестала заслонять нижнюю картинку (рисунок 6). Вы можете поэкспериментировать с данным свойством, возможно, получите оригинальные совмещенные изображения для вашего приложения.

  1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО «Малип». 1997 г.
  2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
  3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
  4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
  5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО «Издательство Бином». 2000 г.

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

Разностная функция Char/Chr в Delphi 2007 и XE3

Я использую функцию Char и Chr с параметром 130 и ведет себя по-разному в Delphi 2007 e XE3.

Delphi 2007: Char (130) или Chr (130) — Результат: Comma

Delphi XE3: Char (130) или Chr (130) — Результат: # $ 0082

я проблема решена с помощью AnsiChar (130).

Мой вопрос в том, что у меня проблемы с использованием AnsiChar. Должен ли я менять Chr/Char AnsiChar на протяжении всего проекта?

Эти два немного отличаются:

  • Char (130) — это значение типа, а не вызов функции. Целое число со значением 130 преобразуется в Char с этим порядковым номером.
  • Chr (130) действительно является вызовом функции. Он вызывает внутреннюю функцию Chr() .

В обеих версиях Delphi как до, так и после Unicode вы можете использовать версии Char() и Chr() взаимозаменяемо. Однако результаты различаются в зависимости от используемой версии Delphi.

Для pre-Unicode Delphi Char является 8-битным символом ANSI. Для Post-Unicode Delphi Char — это 16-битный символ UTF-16.

Именно то, как вы должны это решать, зависит от того, чего вы пытаетесь достичь. Если вы хотите похоронить голову в песке и притвориться, что символы Unicode не существуют, то, возможно, вы захотите заменить все свое использование Char на AnsiChar . И вы также захотите надеяться, что ваша программа будет выполняться только на машине с локали, которая отображает символ 130 на этот символ. Имейте в виду, что не все локали Windows ANSI делают это.

Тем не менее, я подозреваю, что правильное решение вашей проблемы, независимо от того, что это такое, будет включать Unicode и использовать кодировку UTF-16 для этого символа. Это SINGLE LOW-9 QUOTATION MARK U + 201A. Напишите это в Unicode Delphi:

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

Если вы хотите запятую (COMMA U + 002C), хорошо, что легко:

Для вас требуется определенное чтение: Delphi и Unicode от Marco Cantù.

Chr — Функция Delphi

Ты должен весь текст перевести в кодировку DOS. А потом выводить.
Или найли в инете функцию перекодировоки Win 1251 в кодировку CP866.

Ну желателен весь код.

Хе.. Я конечно понимаю, патриотизм там, все дела, но думать, что американская корпорация будет закладываться на русскую кодировку — это что то с чем то :-D

что значит «у меня» ?? как ты это определил??

Какая винда, русская, английская?? Какая кодировка для не юникод-приложений используется?? Какая версия дельфи?? Случайно не свеже выпущенная 2009-ая ??

Char и Chr в Delphi

December 2020

7.7k раз

Разница между Chr и Char при использовании в преобразовательных типов является то, что одна является функцией, а другой отливают

Так: Char(66) = Chr(66)

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

EDIT Благодаря Ульриха для испытания доказав они фактически идентичны.
EDIT 2 Можно ли думать о случае , когда они не могут быть одинаковыми, например , вы выталкиваются к использованию одного над другим из — за контекста?

Что вы используете в вашем коде и почему?

6 ответы

CHR является типизированным, символ не является: Попробуйте код chr(256) и вы получите ошибку компиляции. Попробуйте код char(256) и вы либо получить символ с порядковым значением 0 или 1, в зависимости от ваших компьютеров внутреннего представления целых чисел.

Я суффикс выше, говоря, что это относится к предварительно Юникоду Delphi. Я не знаю, если CHR и сажа, были обновлены, чтобы Юникод во внимание.

Chr является вызовом функции, это немного (крошечным-крошечным) дороже типа литой. Но я думаю, что Chr является встраиваемым компилятором.

chr является функция, таким образом , он возвращает новое значение типа char .

char(x) представляет собой отливку, это означает , что фактический x объект используется , но в качестве другого типа.

Многие системные функции, как инк, дес, CHR, Орды, являются встраиваемыми.

Оба char и chr быстро. Используйте тот , который наиболее подходит каждый раз,
и лучше отражает то , что вы хотите сделать.

Помощь говорит: Chr возвращает символ с порядковым значением (значение ASCII) выражения байт типа, X. *

Итак, как символ представлен в памяти компьютера? Угадайте, что, как байты *. На самом деле функции Chr и Ord только там Pascal является строго типизированным языком, запрещающий использование байтов *, где запрашиваются символы. Для компьютера полученный полукокс еще представлен в виде байт * — к тому, что должен это конвертировать тогда? На самом деле нет никакого кода испускается для этого вызова функции, так же, как нет коды опущена для приведения типа. Ergo: нет никакой разницы.

Вы можете предпочесть chr просто избегать приведения типа.

Примечание: забросы типа не следует путать с явным приведением типов! В Delphi 2010 писать что — то вроде в Char(a) то время как это AnsiChar, будет на самом деле сделать что — то.

** Для Unicode, пожалуйста, заменить байты с целым *

Редактировать:

Просто пример, чтобы понять (предполагая, что не-Unicode):

производит подобный код

Назначение байт в байт фактически то же самое, назначая байт на символ с помощью CHR ().

Я сделал небольшой тест в D2007:

Оба вызова дают одинаковый код сборки:

Edit: Модифицированный образец , чтобы смягчить проблемы Ники.

Редактирование 2: желание Ника моя команда. ;-)

Они идентичны, но они не должны быть одинаковыми. Там нет требования о том , что внутреннее представление символов на карте 1-к-1 с их порядковыми значениями. Ничто не говорит о том , что Char переменный держит значение ‘A’ должно держать числовое значение 65. Этого требования заключается в том , что при вызове Ord на этом переменном, то результат должен быть 65 , потому что это точка кода , назначенная буква A в кодировке символов вашей программы.

Конечно, проще всего реализация этого требования для переменных держать числовое значение 65 , а также. Из — за этого, вызовы функций и преобразование типов всегда идентичны.

Если реализация была различна, то , когда вы назвали Chr(65) , компилятор бы посмотреть, что персонаж находится в точке коды 65 и использовать его в качестве результата. Когда вы пишете Char(65) , то компилятор не будет беспокоиться о том, какой характер она на самом деле представляет собой, до тех пор , как числовой результат сохраняется в памяти было 65.

Является ли это расщепление волос? Да, абсолютно, потому что во всех текущих реализациях, они идентичны. Я сравниваю это к вопросу о том, является нулевым указателем обязательно равна нулю. Это не так, но при всех реализациях, он заканчивает тем, что путь в любом случае.

Илон Маск рекомендует:  Что такое код msql_list_tables
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
bsa
Дата 26.7.2006, 13:24 (ссылка) | (нет голосов) Загрузка .