Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
Delphi 6 Personal
|
Re: Cpp > Pas
28. Mär 2008, 19:44
Zitat von Nils_13:
Code:
Sleep(5000); // Nötig ????
Delphi-Quellcode:
program STDINOUT_DMO;
uses
Windows,
Messages,
SysUtils;
procedure Main;
var
hStdout, hNewScreenBuffer: THANDLE;
srctReadRect: TSMALLRECT;
srctWriteRect: TSMALLRECT;
chiBuffer: array [0..160] of TCHARINFO; // [2]*[80];
coordBufSize: TCOORD;
coordBufCoord: TCOORD;
fSuccess: BOOL;
begin
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer := CreateConsoleScreenBuffer(
GENERIC_READ or // read/write access
GENERIC_WRITE,
0, // not shared
nil, // default security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
nil); // reserved; must be NULL
if (hStdout = INVALID_HANDLE_VALUE) or
(hNewScreenBuffer = INVALID_HANDLE_VALUE) then
begin
WriteLn(format(' CreateConsoleScreenBuffer (%d)', [GetLastError]));
exit;
end;
// Make the new screen buffer the active screen buffer.
if not SetConsoleActiveScreenBuffer(hNewScreenBuffer) then
begin
WriteLn(format(' SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
exit;
end;
// Set the source rectangle.
srctReadRect.Top := 0; // top left: row 0, col 0
srctReadRect.Left := 0;
srctReadRect.Bottom := 1; // bot. right: row 1, col 79
srctReadRect.Right := 79;
// The temporary buffer size is 2 rows x 80 columns.
coordBufSize.Y := 2;
coordBufSize.X := 80;
// The top left destination cell of the temporary buffer is
// row 0, col 0.
coordBufCoord.X := 0;
coordBufCoord.Y := 0;
// Copy the block from the screen buffer to the temp. buffer.
fSuccess := ReadConsoleOutput(
hStdout, // screen buffer to read from
@chiBuffer[0], // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
srctReadRect); // screen buffer source rectangle
if not fSuccess then
begin
WriteLn(format(' SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
exit;
end;
// Set the destination rectangle.
srctWriteRect.Top := 10; // top lt: row 10, col 0
srctWriteRect.Left := 0;
srctWriteRect.Bottom := 11; // bot. rt: row 11, col 79
srctWriteRect.Right := 79;
// Copy from the temporary buffer to the new screen buffer.
fSuccess := WriteConsoleOutput(
hNewScreenBuffer, // screen buffer to write to
@chiBuffer[0], // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
srctWriteRect); // dest. screen buffer rectangle
if not fSuccess then
begin
WriteLn(format(' WriteConsoleOutput (%d)', [GetLastError]));
exit;
end;
Sleep(5000); // <--<<
// Restore the original active screen buffer.
if not SetConsoleActiveScreenBuffer(hStdout) then
begin
WriteLn(format(' SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
exit;
end;
end;
BEGIN
AllocConsole;
Main;
FreeConsole;
END.
Für das Demo ja. Es dient zur visualisierung des Demos
|
|
Zitat
|