Форум: "Потрепаться";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизClrScr Turbo Pas a Найти похожие ветки
← →
ArtemESC © (2005-12-18 19:02) [0]Как сделать эмуляцию ClrScr в консольном проге?
Вроде было какое-то Dos-ое прерывание - вот только какое
забыл?
← →
TUser © (2005-12-18 19:16) [1]ShellExecute (..."cls"...
← →
wicked © (2005-12-18 19:26) [2]не претендую на точность, подглядел в выводе одной консольной аппликации, переведенном в файл - для очистки экрана там выводился символ FormFeed ("принтерный" прогон страницы) - код 0x12 (#18, #$12)....
может, для этого есть и какие другие средства, но в выводе это выглядело именно так....
← →
Джо © (2005-12-18 19:27) [3]В библиотеках FreePascalя, насколько помню, под Windows именно "прогон" видимой страницы использовался для эмуляции ClrScr, в Линуксе - какой-то системный вызов.
← →
DrPass © (2005-12-18 19:33) [4]Ну а в DOSовой консольной проге - как и все видеосервисы, int 10h. Подфункция, кажется, 06h
← →
Джо © (2005-12-18 19:35) [5]
> [4] DrPass © (18.12.05 19:33)
06 - Scroll page up
07 - Scroll page down
← →
Anatoly Podgoretsky © (2005-12-18 19:39) [6]FillConsoleOutputCharacter
← →
DrPass © (2005-12-18 19:47) [7]06 - Scroll page up & clear screen
07 - Scroll page down & clear screen
Для очистки экрана нужно просто вместо количества прокручиваемых строк указать 0
← →
Джо © (2005-12-18 19:49) [8]
> [7] DrPass © (18.12.05 19:47)
Я, это, не спорил :)) Просто подтверждал [4] DrPass © .
← →
DrPass © (2005-12-18 20:02) [9]
Джо © (18.12.05 19:49) [8]
> Я, это, не спорил :))
Ладно, кладу винтовку на место :-P
← →
sniknik © (2005-12-18 23:29) [10]
COORD = TCoord;
TWindCoord = packed record
case integer of
0: (Value: longword);
1: (X, Y: word);
end;
WindMin: longword;
procedure __MoveCursor(X, Y: word); register;
var
C: COORD;
begin
C.X := X;
C.Y := Y;
SetConsoleCursorPosition(_OutputHandle, C);
end;
procedure GotoXY(X, Y: integer);
var
R, C: integer;
begin
R := Y - 1 + TWindCoord(WindMin).Y;
C := X - 1 + TWindCoord(WindMin).X;
if ((R < TWindCoord(WindMin).Y) or (R > TWindCoord(WindMax).Y) or (C < TWindCoord(WindMin).X) or (C > TWindCoord(WindMax).X)) then
Exit;
__MoveCursor(C, R);
end;
procedure ClrScr;
var
C: COORD;
I, Len, NumWritten: DWORD;
begin
if ((TWindCoord(WindMin).X = 0) and (TWindCoord(WindMin).Y = 0) and (TWindCoord(WindMax).X = _ScreenWidth - 1) and (TWindCoord(WindMax).Y = _ScreenHeight - 1)) then begin
Len := _ScreenWidth * _ScreenHeight;
C.X := 0;
C.Y := 0;
FillConsoleOutputCharacter(_OutputHandle, " ", Len, C, NumWritten);
FillConsoleOutputAttribute(_OutputHandle, TextAttr, Len, C, NumWritten);
end else begin
Len := TWindCoord(WindMax).X - TWindCoord(WindMin).X + 1;
C.X := TWindCoord(WindMin).X;
for I := TWindCoord(WindMin).Y to TWindCoord(WindMax).Y do begin
C.Y := I;
FillConsoleOutputCharacter(_OutputHandle, " ", Len, C, NumWritten);
FillConsoleOutputAttribute(_OutputHandle, TextAttr, Len, C, NumWritten);
end;
end;
GotoXy(1, 1);
end;
вроде ничего не забыл... (это куски модуля crt)
← →
DrPass © (2005-12-18 23:43) [11]Это WinCrt. Страшная вещь
← →
sniknik © (2005-12-19 00:10) [12]> Это WinCrt. Страшная вещь
не страшная (долго смотрел, так и не испугался ;), но странная...
так и не понял например, зачем тип переменной обьявляется WindMin: longword; и после делаются приведения к TWindCoord для доступа к ее части, по всему модулю, если "цельным куском" она вообще нигде не используется. это вместо определения переменной сразу этим типом.
но... как есть так есть.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.023 c