:: 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 = (
^%, ^~, ^^, ^#, ^@
);
|
На этом все, всем творческих успехов!
|
При использовании материала - ссылка на сайт обязательна
|
|