Вывод текста в консоли.
|
|
Hemulo | Дата: Четверг, 21.03.2013, 13:15 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Здравствуйте!
Подскажите начинающему пользователю FreeBASIC возможно ли как-то:
1) Выводить в консоле средствами Бейсика текст без перевода на новую строку (по аналогии с паскалевским Write ).
Пока что на ум приходит подключение Сишных библиотек и использование сишных функций, но не хотелось бы усложнять.
Я знаю про Locate но хотелось бы иметь какую-то более простую возможность дописывать в конец ранее выведенной строки.
(Кстати, а как функция Print выводит текст в файл? Там она тоже вставляет символ перевода строки?)
2) Не переводить курсор на новую строку при достижении крайней правой позиции в консоли. Это может быть важным если попытаться разместить какой-нибудь символ в правый нижний угол консоли. Из-за перевода курсора на новую строку происходит сдвиг всего экрана в верх на одну строку и курсор встаёт в первую позицию новой последней строки.
Когда много лет назад я бился над этой проблемой в Паскале, я нашёл только 2 решения: 1) использование Ассемблера 2) прямой доступ к видео памяти.
В то же время, недавно я нашёл как это без проблем можно реализовать в PureBASIC, но здесь не нашёл. ![sad](http://s54.ucoz.net/sm/1/sad.gif) Добавлено (21.03.2013, 13:15) --------------------------------------------- На первый вопрос я нашёл ответ.
Чтобы после исполнения команды Print не происходило перевода строки нужно после последнего аргумента поставить либо ";" либо "," (т.е. точку с запятой или просто запятую).
Например: For i As Integer = 1 to 10 Print "*" Next i Выведет символ "*" десять раз, каждый раз с новой строки.
А программа : For i As Integer = 1 to 10 Print "*" ; Next i Выведет десять звёздочек в одной строке.
Соответственно : For i As Integer = 1 to 10 Print "*", Next i Будет выводить символы в строку но с отступами между ними (разбивая вывод на колонки).
Но второй вопрос, о выводе символа в крайнюю нижнюю правую позицию пока остаётся для меня не решённым.
|
|
| |
haav | Дата: Четверг, 21.03.2013, 13:54 | Сообщение # 2 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Я бы сделал так:
Код Width 20,5 Do If CsrLin = 5 And Pos = 20 Then Locate 5,20,1 Var ch = Chr(getKey) ? ch; If ch = "q" Then Exit do Sleep(1) Loop Или заюзал функции СИ. Для примера специально установил размер консоли маленьким, чтобы быстрее достигать нижнего края.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Hemulo | Дата: Четверг, 21.03.2013, 14:51 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Хм... кажется разобрался.
Посмотрел, поэкспериментировал.
Похоже вот эта строка: "If CsrLin = 5 And Pos = 20 Then Locate 5,20,1 " даже и не нужна.
Во-первых, проверка происходит ещё до вывода символа.
Во-вторых, как я сейчас понял из экспериментов, ключевым здесь, как ни странно, тоже является знак ";"
При этом знак ";" не мешает переходить тексту с одной строки на другую, но при достижении конца консоли не сдвигает экран и оставляет курсор в конце консоли на правом нижнем символе.
Это работает когда явно задаётся размер консоли с помощью команды Width, либо когда в настройках окна консоли явно указывается её размер.
Причём важен именно заданный размер окна, а не буфера.
Так при настройках окна консоли 80x25 и настройках буфера 80x50 вывод в последнюю 80-ую позицию 25-ой строки не приводит к переводу курсора на новую строку.
Моя проблема, описанная в первом сообщении в этой ветки была в том, что я использовал простой Print без точки с запятой. ;)))Добавлено (21.03.2013, 14:51) --------------------------------------------- Пример программы для консоли размером 80x25:
For i As Integer = 1 To 2000 Print "*"; Next i Sleep
|
|
| |
haav | Дата: Четверг, 21.03.2013, 15:15 | Сообщение # 4 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Похоже вот эта строка: "If CsrLin = 5 And Pos = 20 Then Locate 5,20,1 " даже и не нужна. Вы ошибаетесь.
Цитата Пример программы для консоли размером 80x25:
For i As Integer = 1 To 2000 Print "*"; Next i Sleep
Зарядите цикл на 3000 итераций и поймете, что символ ; не останавливает вывод при достижении правого нижнего угла.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Hemulo | Дата: Четверг, 21.03.2013, 16:54 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Цитата (haav) Зарядите цикл на 3000 итераций и поймете, что символ ; не останавливает вывод при достижении правого нижнего угла. Да, в этом смысле Вы правы.
Просто для меня важно было именно возможность поместить символ в правую нижнюю позицию без пролистывания экрана.
В принципе, ограничения вывода всего одним экраном заданного размера для меня было не критично, поэтому на этом я не концентрировал своё внимание.
Для этой цели - да. Ваш код хорошо подходит.
Кстати, ещё такой вопрос c консолью:
В FreeBASIC Есть команды:
View Print Y1 to Y2 ' где Y1 и Y2 это номера начальной и конечной ' строк разрешённых для вывода
Print Tab(X); "Текст" 'где X - это номер позиции с которой начинается вывод текста.
Locate (Y1,X1) ' где Y1 - это номер строки сверху (задаётся первым!), ' а X1 - это номер позиции в строке куда устанавливается курсор
Подскажите, пожалуйста есть ли какие-то уже готовые, стандартные средства для реализации окон в текстовом режиме в консоли?
Например в TurboPascal, я помню, была функция Window которая была предназначена для вывода в текстовом режиме окон и работы с ними.
Возможности, которые предоставляла эта функция заключались в том, что можно было создать текстовое окно с заданным цветом и перенаправить в него весь консольный вывод.
Не помню подробностей, и конкретных настроек, но помню, что пользовались этой возможностью очень широко.
Сейчас я могу себе приблизительно представить, как можно было бы создать подобные окна в FreeBASIC с использованием перечисленных мною выше функций, а также с функцией проверки позиции курсора.
Но, как мне кажется, это будет выглядеть какой-то пляской с бубном.
В частности, не смотря на наличие ограничения по строкам, вроде бы совсем нет функции ограничения по колонкам (придётся самому проверять через позицию курсора).
Кроме того, в FreeBASIC есть какая-то своя функция Window. В описании я нашёл только упоминание о её применении в графических режимах (и то пока не до конца понял её функционал).
|
|
| |
haav | Дата: Четверг, 21.03.2013, 17:45 | Сообщение # 6 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Подскажите, пожалуйста есть ли какие-то уже готовые, стандартные средства для реализации окон в текстовом режиме в консоли? Консоль - стандартизированное окно операционной системы и в нем, насколько я знаю , ограничить область вывода текста сразу по ширине и высоте стандартными средствами нельзя. Только ручками через знаете какое место.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |