Это очень редко бывает полезно, но может помочь понять некоторые ограничения основного вывода терминала дисплея.
Вы вставляете пробел примерно так:
name = 'Bob' + ' ' + 'Marl' ;
Затем между частью «Боб» в name и частью «Марл» есть «пробел». Я предполагаю, что вы думаете, что это довольно тривиальное объяснение, но серьезно, это все, что нужно. Для «вставки» «заготовки» можно использовать любое количество других методов, но все они сводятся к этой основной идее.
По крайней мере, это все, что касается этой крошечной части. Это приводит к более сложному вопросу управления цветом на уровне символов для дисплея 5250.
Протокол дисплея 5250 основан на символах и полях. Вы можете отображать печатаемые символы, а различные атрибуты, такие как цвет, применяются на уровне поля. То есть, чтобы установить цвет, вы должны установить его для всего поля отображения, а не для каждого символа в поле.
На самом деле каждое поле обязательно имеет свои атрибуты, хранящиеся в битовом шаблоне, который занимает одну позицию на экране. Изучение любого количества экранов покажет, что всегда есть по крайней мере одна явно пустая позиция экрана непосредственно перед любым полем на экране (даже если эта позиция находится в правом конце предыдущей строки). По этой причине никогда не будет двух смежных полей, которые будут иметь разные цвета на экране одновременно.
Однако основное определение «поля» может несколько изменяться программным кодом. Рассмотрим этот код:
name = 'Bob' + x'32' + 'Marl' ;
Теперь вместо пробела мы поместили шестнадцатеричное значение в середину переменной. Если переменная name является полем отображения, а указанное выше значение отображается на экране, терминал/эмулятор интерпретирует его как два отдельных поля. Часть «Боб» будет иметь атрибуты, определенные в файле отображения для поля name. Но остальная часть «поля» примет атрибут, представленный битовым шаблоном x'32', то есть все символы «Marl» будут желтыми.
Существует еще одна позиция символа, которая следует непосредственно за полем на дисплее. Это означает конец поля. Шестнадцатеричное значение по умолчанию — x'20', но любая позиция, содержащая допустимый битовый шаблон атрибута, будет интерпретироваться как "конец". Из-за этого позиция может фактически содержать атрибут для следующего поля. Таким образом, требуется только одна позиция на экране, чтобы отметить и конец одного поля, и начало следующего. (Это немного сложнее, но мы можем игнорировать то, как на самом деле поддерживаются адреса полей. Соответствующая часть здесь — атрибуты отображения.)
Хорошо, это показывает одну основную часть управления цветом на каком-то начальном адресе экрана. Но это только намекает на то, как можно манипулировать одним символом в поле. Вот уродливая часть:
name = 'Bob' + x'32' + 'M' + x'20' + 'arl' ;
В этом примере часть «Боб» будет иметь цвет, определенный для поля name. Затем на экране появится пустое место, за которым следует желтая буква «S», а затем еще одно пустое место на экране. После этого «arl» будет отображаться с «обычными» атрибутами отображения. (Эта «нормальная» часть не связана с тем, как поле имя определено для отображения. Однако программа также может управлять цветами на уровне поля, поэтому ваш код может координировать цвет поля< /em> с любым значением атрибута, которое вы можете выбрать вместо x'20'.)
Короче говоря, если вы хотите, чтобы значение, такое как «Боб Марл», отображалось так, чтобы каждая буква имела свой цвет, минимум, который вы могли бы получить, будет растянут до «Боб Марл». Поместив разные соответствующие шестнадцатеричные значения в каждое из этих пустых мест, каждая буква может быть другой.
Не красиво. Это не очень привлекательный вариант ни в коде, ни в качестве эффекта на экране.
Другими словами, если вы хотите, чтобы у отдельных символов были свои цвета, у каждого символа должна быть позиция до и после на экране, которая будет отображаться как пустая.
Гораздо лучшим вариантом было бы использование интерфейса браузера для отображения данных или любого другого средства, позволяющего полностью контролировать атрибуты на клиенте.
person
user2338816
schedule
06.09.2016