![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Консольное приложение. Очистить Экран.
jonni © (2005-01-06 22:15:00)Есть ли функции для очистки экрана консоли??? В MSDN не нашёл ничего кроме как ScrollConsoleScreenBuffer с помощью которой можно затирать.
Может кто знает. Есть ли что-нибудь ещё для этих целей?
ламер (2005-01-07 15:14:00) [1]FillConsoleOutputCharacter() + FillConsoleOutputAttribute().
DelphiN! (2005-01-07 11:15:00) [2]А не легче WriteLn прогнать много раз ?
jack128 (2005-01-07 01:43:00) [3]GuAV © (06.01.05 23:13) [5]
Так работает или нет ?
Да, работает, просто я ступил.
Cobalt © (06.01.05 23:47) [6]
vertal © (07.01.05 1:01) [8]
Ну я думаю тут дело в том, что кол-во знакомых с командами дос больше, чем кол-во знающих апи для работы с консолью ;-)
vertal (2005-01-07 01:01:00) [4]Я не совсем понимаю, зачем для этого вызывать внешние программы, как предложено в [1]. Вот на мой взгляд более подходящий код:
{$APPTYPE CONSOLE}
uses windows;
function ClearScreenBuffer(): Boolean;
var
Screen: PCharInfo;
upperleftcorner: _coord;
RegionToWrite: TSmallRect;
csbi: _Console_Screen_Buffer_Info;
begin
Result := False;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), csbi);
Screen := PCharInfo(GlobalAlloc(GPTR, sizeof(TCHarInfo) * csbi.dwSize.X * csbi.dwSize.Y));
if Screen = nil then Exit;
upperleftcorner.X := 0;
upperleftcorner.Y := 0;
RegionToWrite.Left := 0;
RegionToWrite.Top := 0;
RegionToWrite.Right := csbi.dwSize.X - 1;
RegionToWrite.Bottom := csbi.dwSize.Y - 1;
Result := WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), screen, csbi.dwSize,
upperleftcorner, RegionToWrite);
GlobalFree(Cardinal(Screen));
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),upperleftcorner);
end;
begin
ClearScreenBuffer();
end.
Проверял в Win2000. Единственное - более правильно конечно заполнять не символом Char(0), а пробелами, но на моей системе и такеи символы отображаются как пробелы, так что не стал ставить цикл.
GuAV (2005-01-07 00:12:00) [5]Cobalt © (06.01.05 23:47) [6]
не понял.
Cobalt (2005-01-06 23:47:00) [6]Грустно :(
Вот так программисты и приходят к тому, что бы использовать сторонние программы с парсером получаемого текста, вместо того, что бы использовать библиотеки...
GuAV (2005-01-06 23:13:00) [7]jack128 © (06.01.05 23:01) [3]
jack128 © (06.01.05 23:02) [4]
Так работает или нет ?
Кстати, если работает, наверное лучше действительно прописать 'CLS' заместо cmd, т.к. другие дос - комманды вряд ли будут нужны.
jack128 (2005-01-06 23:02:00) [8]блин, сорри - туплю -)
jack128 (2005-01-06 23:01:00) [9]вобщем в Win2K не работает..
jack128 (2005-01-06 22:57:00) [10]GuAV © (06.01.05 22:47) [1]
GetEnvironmentVariable('COMSPEC') + ' /C' + cmd
а что такое cmd ?? 'cmd '??
GuAV (2005-01-06 22:47:00) [11]в 98 вроде работает...
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
procedure ExecuteDOSCommand(cmd: string);
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(SI),0);
SI.cb:=SizeOf(SI);
if not CreateProcess(nil,
PChar(SysUtils.GetEnvironmentVariable('COMSPEC') + ' /C' + cmd),
nil, nil, False, 0, nil, nil, SI, PI) then
RaiseLastOSError;
WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
begin
WriteLn('Now you see it');
ReadLn;
ExecuteDOSCommand('CLS');
WriteLn('Now you don''t...');
ReadLn;
end.