Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

перевод каретки   Найти похожие ветки 

 
syte_ser78 ©   (2004-02-09 14:55) [0]

Вопрос по Паскалю 7.0
Как вывести символ без перевода каретки? Тоесть код
for i:=1 to 80*25 do
write ("1");

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


 
MBo ©   (2004-02-09 14:59) [1]

При этом нет перевода каретки.


 
Dimman1 ©   (2004-02-09 15:04) [2]

почитай хелп по модулю crt. Надо вывести и вернуть курсор назад например (функция gotoxy вроде), и еще вроде была функция которая вообще курсор прячет. Давно это было, все забыл.


 
syte_ser78 ©   (2004-02-09 15:04) [3]

Извиняюсь,
Пеервода нет, сдвиг есть.


 
app ©   (2004-02-09 15:06) [4]

Так ты не ставь указатель на 80*25+1


 
syte_ser78 ©   (2004-02-09 15:07) [5]

спрятать курсор не сложно, но даже при спрятаном курсоре происходит переход на новую строку. ГотоХУ тоже не помогает


 
syte_ser78 ©   (2004-02-09 15:08) [6]

Если сделать
i:=1 to 80*25-1
то просто получается не полностью заполненный экран. Нижний правый угол-пустой


 
LordOfSilence ©   (2004-02-09 15:19) [7]

Если не ошибаюсь, нужно сначала выдать что-то типа
Window(1,1,80,25), а потом уже в цикле заполнять.


 
Anatoly Podgoretsky ©   (2004-02-09 15:23) [8]

write не надо использовать или делать на -1


 
syte_ser78 ©   (2004-02-09 15:27) [9]


> Если не ошибаюсь, нужно сначала выдать что-то типа
> Window(1,1,80,25), а потом уже в цикле заполнять.

Даже если сделать Window(1,1,80,25) всеравно нижняя строка получится пустой.

> [8] Anatoly Podgoretsky ©


> write не надо использовать или делать на -1


да так и делаю. Но хотелось бы весь экран заполнить :(


 
Mystic ©   (2004-02-09 15:29) [10]

for i:=0 to 80*25-1 do
Mem[$B800:2*i] := Byte("1");


 
Mystic ©   (2004-02-09 15:30) [11]

Или

for i:=0 to 80*25-1 do
Mem[$B800:2*i+1] := Byte("1");


 
syte_ser78 ©   (2004-02-09 15:41) [12]


> for i:=0 to 80*25-1 do
> Mem[$B800:2*i+1] := Byte("1");

Работает!
Только заполняет весь экран не еденицами, а просто просто "однородными прямоугольниками"


 
Anatoly Podgoretsky ©   (2004-02-09 15:44) [13]

Так заполнять надо четные байты, а нечетные аттрибутом


 
syte_ser78 ©   (2004-02-09 15:47) [14]


> Так заполнять надо четные байты, а нечетные аттрибутом


> [11] Mystic © (09.02.04 15:30)
> Или
>
> for i:=0 to 80*25-1 do
> Mem[$B800:2*i+1] := Byte("1");

Огромное СПАСИБО!!!!!


 
Mystic ©   (2004-02-09 15:48) [15]

Значит это:

for i:=0 to 80*25-1 do
Mem[$B800:2*i] := Byte("1");

первый элемент это символ, а второй атрибут (цвет, фон, мерцание)
Может наоборот --- всю жизнь их путал.

Есть еще такой вариант

type
TVideoCh = packed record
Ch: Char;
Attr: Byte;
end;

var
Video: array[0..24,0..79] of TVideoCh absolute $B800:0000;

for X := 0 to 79 do
for Y := 0 to 24 do
Video[Y,X].Ch := "1"


 
NailMan ©   (2004-02-09 15:50) [16]

Надо использовать не crt, а tpcrt и пакета Terbo Profesional. Там есть такие функции как Fastwrite и fasttext ими все это и реализуется. А воотже это простой вывод прямо в видеопамять по соответсвующему смещению.


 
Mystic ©   (2004-02-09 15:51) [17]

Ностальгия, блин... %)


 
syte_ser78 ©   (2004-02-09 16:03) [18]


> Ностальгия, блин... %)

:))) Может процедурку переписать поможеш?


 
syte_ser78 ©   (2004-02-09 16:04) [19]


> :))) Может процедурку переписать поможеш?

Извиняюсь, не заметил :(
Может процедурку переписать поможте?


 
Mystic ©   (2004-02-09 16:24) [20]

Pascal не стоит --- пишу по памяти...

type
TVideoCh = packed record
Ch: Char;
Attr: Byte;
end;

var
Video: array[0..24,0..79] of TVideoCh absolute $B800:0000;

procedure FillScreen;
var
X, Y: Integer;
begin
for X := 0 to 79 do
for Y := 0 to 24 do
Video[Y,X].Ch := "1"
end;


Думаю, что это должно работать...


 
syte_ser78 ©   (2004-02-09 16:33) [21]

вопрос на правильность понятия написаного - адрес ячейки с координатами x,y будет 2*(x*80+y) ?


 
Mystic ©   (2004-02-09 16:38) [22]

Да, правильно. Первый байт это символ. Второй --- атрибуты (старший бит --- мерцание, далее три --- фон (RGB), потом интенсивность символа, потом RGB символа. Так что $9F означает мерцающий белый символ на синем фоне

1 001 1 111
M RGB I RGB


 
Anatoly Podgoretsky ©   (2004-02-09 16:39) [23]

Неправильно, Y*80 + X*2


 
syte_ser78 ©   (2004-02-09 16:41) [24]


> [22] Mystic ©

Спасибо еще раз.
А как насчет производительности?
Что предпочтительнее Video[Y,X].Ch := "1" или запись с явным указанием адреса?
Video[Y,X].Ch - явно удобнее для понимания и написания


 
syte_ser78 ©   (2004-02-09 16:43) [25]


> [23] Anatoly Podgoretsky © (09.02.04 16:39)
> Неправильно, Y*80 + X*2

Да, немного ошибся :) Но только наверное всетаки (Y*80 + X)*2 ?


 
Nikky ©   (2004-02-09 16:45) [26]


> syte_ser78 © (09.02.04 16:41) [24]


неважно, все равно в экзешнике будет одинаково


 
syte_ser78 ©   (2004-02-09 16:45) [27]


> > [22] Mystic ©
>
> Спасибо еще раз.
> А как насчет производительности?
> Что предпочтительнее Video[Y,X].Ch := "1" или запись с явным
> указанием адреса?
> Video[Y,X].Ch - явно удобнее для понимания и написания

:) Прочитал еще раз код, это тоже саоме :)


 
Mystic ©   (2004-02-09 16:48) [28]

Video[Y,X].Ch - явно удобнее для понимания и написания

Так и пиши, за быстродействием надо гнаться только если это критично


 
syte_ser78 ©   (2004-02-09 16:55) [29]


> Mystic ©

Спасибо за ответы. Ухожу в написание кода, если возникнут вопросы, обращусб еще.


 
Anatoly Podgoretsky ©   (2004-02-09 17:02) [30]

Anatoly Podgoretsky © (09.02.04 16:39) [23]
Тоже ошибся Y*160+X*2 -> (Y*80+X)*2


 
syte_ser78 ©   (2004-02-09 17:04) [31]


> atoly Podgoretsky ©

Спасибо.


 
syte_ser78 ©   (2004-02-09 17:31) [32]

Блин, голова кипит, соответствует ли код
Mem[$B800:2*((y+dy)*80+x+i)+1] := Byte("1");
Mem[$B800:2*((y+dy)*80+x+i)] := Byte(178);
коду
gotoxy(x+1+i,y+dy);
write(Chr(178));
?


 
Mystic ©   (2004-02-09 20:59) [33]

Нет.

Mem[$B800:2*((y+dy)*80+x+i)+1] := Byte("1"); // Устанавливаем чвет символа
Mem[$B800:2*((y+dy)*80+x+i)] := Byte(178); // Устанавливаем символ
gotoxy(x+1+i,y+dy); // Перемещаем курсор
write(Chr(178)); // Выводим символ (возможет скроллинг, если это правый нижний символ


 
syte_ser78 ©   (2004-02-10 11:55) [34]

я имею ввиду верна ли адресация gotoxy(x+1+i,y+dy и [$B800:2*((y+dy)*80+x+i)]


 
Anatoly Podgoretsky ©   (2004-02-10 12:04) [35]

А проверить, вывести символ тем и другим методом религия не позволяет?


 
syte_ser78 ©   (2004-02-10 12:08) [36]

В том то и дело что получается, но не всегда. Не пойму в чем ошибка.


 
Anatoly Podgoretsky ©   (2004-02-10 12:37) [37]

Эти формулы не зависят от не всегда, единственным объяснением является то, что у тебя разные аргументы при испытании.


 
Radionov Alexey ©   (2004-02-10 12:52) [38]

А на адаптере Hercules (монохром) с другого адреса видеобуфер начинается :)


 
ПИТОН   (2004-02-10 14:41) [39]

А если не в 0-ю видеостраничку писать?


 
syte_ser78 ©   (2004-02-10 15:18) [40]


> [39] ПИТОН (10.02.04 14:41)
> А если не в 0-ю видеостраничку писать?

А в текстовом режиме есть видеостраници?



Страницы: 1 2 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.065 c
14-94136
graY
2004-02-06 06:20
2004.02.29
А вообще DirectX + Delphi >Игра?


1-93911
Seldon
2004-02-14 22:35
2004.02.29
Вопрос по ExtractIconEx


1-93922
Alexis
2004-02-15 11:46
2004.02.29
информация по System Tray


1-94019
Vitalik
2004-02-17 00:51
2004.02.29
Объектный подход при работе с файлами


14-94172
Igor_thief
2004-02-06 16:51
2004.02.29
Tstrings или TstringsList