|
:: MVP ::
|
|
|
:: RSS ::
|
|
|

В данной заметке речь пойдет о составных символах, которые редко встречаются в документации и
примерах исходных кодов, и как следствие знакомые не многим.
Составные символы образуются сочетанием двух специальных символов, входящих в алфавит языка Object Pascal.
. , ; : ( ) { } < > [ ] # $ @ ^ = - + / * '
|
С некоторыми из них мы хорошо знакомы, потому что используем их каждый день, например:
Но есть составные символы, практически никем и никогда не использующиеся. Для начала посмотрим на процедуру PrnString
из модуля Vcl.Printers (код процедуры приведен не полностью и в разных версиях Delphi может немного отличаться).
{ Print a string to the printer handling special characters. }
{$IF DEFINED(CLR)}
procedure PrnString(var Prn: PrnRec; Text: string; Len: Integer);
{$ELSE}
procedure PrnString(var Prn: PrnRec; Text: PAnsiChar; Len: Integer);
{$ENDIF}
{...}
begin
L := 0;
with Prn do
begin
while L < Len do
begin
{$IF DEFINED(CLR)}
case Text[L + 1] of
{$ELSE}
case Text[L] of
{$ENDIF}
#9: {...};
#13: {...};
#10: {...};
^L: {...};
else
Inc(L);
end;
end;
end;
{...}
end;
|
Интерес здесь представляет конструкция case, а точнее ветка ее кода ^L. Что же это такое? А это ни что иное,
как альтернативный способ написания ASCII символов. Список (возможно неполный) подобных составных символов и
их числовые соответствия приведены в следующей таблице.
| Составной символ |
Код |
| Dec |
Hex |
| ^@ |
00 |
00 |
| ^A |
01 |
01 |
| ^B |
02 |
02 |
| ^C |
03 |
03 |
| ^D |
04 |
04 |
| ^E |
05 |
05 |
| ^F |
06 |
06 |
| ^G |
07 |
07 |
| ^H |
08 |
08 |
| ^I |
09 |
09 |
| ^J |
10 |
0A |
| ^K |
11 |
0B |
| ^L |
12 |
0C |
| ^M |
13 |
0D |
| ^N |
14 |
0E |
| ^O |
15 |
0F |
| ^P |
16 |
10 |
| ^Q |
17 |
11 |
| ^R |
18 |
12 |
| ^S |
19 |
13 |
| ^T |
20 |
14 |
| ^U |
21 |
15 |
| ^V |
22 |
16 |
| ^W |
23 |
17 |
| ^X |
24 |
18 |
| ^Y |
25 |
19 |
| ^Z |
26 |
1A |
| ^[ |
27 |
1B |
| ^\ |
28 |
1C |
| ^] |
29 |
1D |
| ^^ |
30 |
1E |
| ^_ |
31 |
1F |
| ^` |
32 |
20 |
| ^{ |
59 |
3B |
| ^| |
60 |
3C |
| ^} |
61 |
3D |
| ^~ |
62 |
3E |
| ^! |
97 |
61 |
| ^” |
98 |
62 |
| ^# |
99 |
63 |
| ^$ |
100 |
64 |
| ^% |
101 |
65 |
| ^& |
102 |
66 |
| ^’ |
103 |
67 |
| ^( |
104 |
68 |
| ^) |
105 |
69 |
| ^* |
106 |
6A |
| ^+ |
107 |
6B |
| ^, |
108 |
6C |
| ^- |
109 |
6D |
| ^. |
110 |
6E |
| ^/ |
111 |
6F |
| ^0 |
112 |
70 |
| ^1 |
113 |
71 |
| ^2 |
114 |
72 |
| ^3 |
115 |
73 |
| ^4 |
116 |
74 |
| ^5 |
117 |
75 |
| ^6 |
118 |
76 |
| ^7 |
119 |
77 |
| ^8 |
120 |
78 |
| ^9 |
121 |
79 |
| ^: |
122 |
7A |
| ^; |
123 |
7B |
| ^< |
124 |
7C |
| ^= |
125 |
7D |
| ^> |
126 |
7E |
| ^? |
127 |
7F |
С моей (субъективной) точки зрения было бы лучше оформить код с соблюдением единого стиля, и вместо ^L написать #12.
Ну да ладно, зато появился повод разобраться с этими символами.
Вот еще 2 пары редко встречающихся составных символов:
Первые 2 символа являются альтернативными для специальных символов { }, и представляют собой многострочный
комментарий. Комбинировать специальные и составные символы многострочных комментариев нельзя. Следующие записи
являются эквивалентными по смыслу:
{
Многострочный
комментарий
}
(*
Многострочный
комментарий
*)
|
Последние 2 являются альтернативными для специальных символов [ ], и могут быть использованы для обозначения диапазона.
Комбинировать специальные и составные символы диапазона можно. Следующие записи являются эквивалентными по смыслу:
var
Arr: array[1..5] of Integer;
var
Arr: array(.1..5.) of Integer;
var
Arr: array(.1..5] of Integer;
var
Arr: array[1..5.) of Integer;
|
Последние 3 записи выглядят непривычно, и вряд ли когда-нибудь начнут широко использоваться. Тем не менее, раз такие
варианты допустимы, полезно будет знать и о них (например, в случае, если вам потребуется написать свой парсер для
языка Object Pascal). Да и конструкции кода, аналогичные приведенному ниже, встретившиеся в чьем-нибудь коде, больше
не повергнут вас в ступор.
const
Arr: array(.1..5.) of AnsiChar = (
^%, ^~, ^^, ^#, ^@
);
|
На этом все, всем творческих успехов!
|
|
При использовании материала - ссылка на сайт обязательна
|
|