Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Consola MSDOS (https://www.clubdelphi.com/foros/showthread.php?t=3766)

craven 19-09-2003 01:35:35

Consola MSDOS
 
Hola. ¿Cómo podría, en una aplicación de consola, mostrar un mensaje y hacer una pausa hasta que el usuario pulse una tecla? Gracias.

roman 19-09-2003 06:53:38

La respuesta que te doy parece funcionar (Windows 2000, Delphi7) pero honestamente no sé por qué: no trabajo con aplicaciones de consola. Hice una búsqueda en Google y encontré un código del que extraje esto:

Código:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  hStdIn: THandle = 0;

procedure FlushInputBuffer;
var
  I: DWord;

begin
  I := 0;
  repeat
    if FlushConsoleInputBuffer(hStdIn) then
    begin
      Sleep(150);
      GetNumberofConsoleInputEvents(hStdIn,I);
    end
    else
      break;
  until I = 0;
end;

function KeyPressed: Boolean;
var
  I: DWord;

begin
  GetNumberofConsoleInputEvents(hStdIn, I);
  Result := I > 0;
end;

begin
  hStdIn := GetStdHandle(STD_INPUT_HANDLE);
  WriteLn('Hola ClubDelphi');
  WriteLn;
  Write('Oprime una tecla...');

  FlushInputBuffer;
  repeat
  until KeyPressed;
end.

// Saludos

roman 19-09-2003 07:10:24

Bueno, ya pensándole un poco más parece que se puede reducir a:

Código:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  hStdIn: THandle;

function KeyPressed: Boolean;
var
  I: DWord;

begin
  GetNumberOfConsoleInputEvents(hStdIn, I);
  Result := I > 0;
end;

begin
  hStdIn := GetStdHandle(STD_INPUT_HANDLE);

  WriteLn('Hola ClubDelphi');
  WriteLn;
  Write('Oprime una tecla...');

  FlushConsoleInputBuffer(hStdIn);
  repeat
  until KeyPressed;
end.

A hStdIn se le asigna un "apuntador" a la entrada estandard (el teclado)

FlushConsoleInputBuffer vacía todo lo que haya en el buffer de entrada (en este caso el teclado) antes del ciclo para omitir teclasos previos a la ejecución.

GetNumberOfConsoleInputEvents devuelve en I el número de entradas en el buffer (en este caso del teclado). Al principio no habrá ninguna (ya que se vació el buffer) y al oprimir una tecla habrá por lo menos una entrada lo que ocasiona que la función KeyPressed devuelva true.

Así es como lo entiendo. Puedes buscar más en la ayuda del sdk de Windows (incluida en Delphi).

// Saludos

craven 19-09-2003 11:32:09

Muchas gracias por tu ayuda.


La franja horaria es GMT +2. Ahora son las 12:50:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi