Изменение цвета уровня персонажа AS400 RPG DSPF (пояснение)

Я нашел этот вопрос на веб-сайте и не могу комментировать его, поэтому я публикую его для дальнейших объяснений. Оригинал: Изменение цвета уровня персонажа AS400 RPG DSPF

Автор, кажется, сам ответил на вопрос комментарием:

Этот вопрос решается сейчас. Невозможно использовать DSPF, но можно изменить цвета определенного символа, вставив перед этим пробел и добавив шестнадцатеричное значение цвета.

Я новичок в изучении as/400, и я просто не могу найти ничего о добавлении пробела в поле в программе.

Как добавить пробел в поле в программе и как вставить шестнадцатеричное значение DSPATR() в мою программу? Если вы можете объяснить или указать мне на документацию, которая делает, я был бы признателен.


person aganm    schedule 05.09.2016    source источник
comment
Одна вещь, которая поможет вам научиться, это использовать имя текущей системы. Если вы будете искать с помощью «AS/400», вы получите уродливое сочетание очень устаревших и текущих результатов. Выполняя поиск «IBM i», вы получите только текущие результаты. Все руководства для IBM i находятся в центре знаний IBM: ibm.com/support/knowledgecenter/ ssw_ibm_i Выберите версию ОС, затем в левом верхнем углу рядом с «IBM i» щелкните синюю стопку горизонтальных полос, чтобы открыть дерево навигации. Для этого вопроса вам нужно Программирование › Устройство › Программирование отображения приложений   -  person Buck Calabro    schedule 06.09.2016
comment
@Buck Calabro Поток данных 5250 не менялся веками. Таким образом, как старые, так и новые результаты поиска полностью действительны.   -  person PoC    schedule 05.06.2019


Ответы (2)


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

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

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

Как добавить пробел в поле в программе и как вставить шестнадцатеричное значение DSPART() в мою программу?

Вы добавляете шестнадцатеричное значение, помещая x перед шестнадцатеричным значением в кавычках (т.е. x'28'). С шестнадцатеричными значениями, которые вы добавляете между словами, добавляется «пробел», на который вы ссылаетесь.

displayLine = 'These word colors are:' + x'28' + 'RED' + x'20' + 'GREEN';

Это будет генерироваться на экране как «Эти цвета слов: КРАСНЫЙ ЗЕЛЕНЫЙ».

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

В исходном ответе есть полезная ссылка: Шестнадцатеричные коды DSPATR

Вы можете просто использовать эти шестнадцатеричные коды, чтобы раскрасить свои линии.

Я бы посоветовал вам поиграть с помощью Screen Design Aid (SDA), чтобы ознакомиться с тем, как работают цвета и атрибуты (нажатие F1 в SDA дает много полезной информации). Просто введите SDA в командную строку эмулятора iSeries.

Я надеюсь, что это указывает вам в правильном направлении.

person Adrian Bannister    schedule 06.09.2016