FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 01:18Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Вывод текста в консоли.
Вывод текста в консоли.
HemuloДата: Четверг, 21.03.2013, 13:15 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Здравствуйте!

Подскажите начинающему пользователю FreeBASIC возможно ли как-то:

1) Выводить в консоле средствами Бейсика текст без перевода на новую строку (по аналогии с паскалевским Write ).

Пока что на ум приходит подключение Сишных библиотек и использование сишных функций, но не хотелось бы усложнять.

Я знаю про Locate но хотелось бы иметь какую-то более простую возможность дописывать в конец ранее выведенной  строки.

(Кстати, а как функция Print выводит текст в файл? Там она тоже вставляет символ перевода строки?)

2) Не переводить курсор на новую строку при достижении крайней правой позиции в консоли.
Это может быть важным если попытаться разместить какой-нибудь символ в правый нижний угол консоли.
Из-за перевода курсора на новую строку происходит сдвиг всего экрана в верх на одну строку и курсор встаёт в первую позицию новой последней строки.

Когда много лет назад я бился над этой проблемой в Паскале, я нашёл только 2 решения: 1) использование Ассемблера 2) прямой доступ к видео памяти.

В то же время, недавно я нашёл как это без проблем можно реализовать в PureBASIC, но здесь не нашёл. sad

Добавлено (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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
Подскажите, пожалуйста есть ли какие-то уже готовые, стандартные средства для реализации окон в текстовом режиме в консоли?

Консоль - стандартизированное окно операционной системы и в нем, насколько я знаю , ограничить область вывода текста сразу по ширине и высоте стандартными средствами нельзя. Только ручками через знаете какое место.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Freebasic » Вопросы по языку FreeBasic » Вывод текста в консоли.
  • Страница 1 из 1
  • 1
Поиск: