Консольні додатки в delphi

Проста консольна програма

Потім збережемо цей файл з розширенням .dpr - в даному випадку conprg.dpr. Далі, його можна завантажити в Delphi (File | Open) і приступити до додавання коду.

Зверніть увагу: Якщо Ви запустите вищенаведену програму, то вона негайно завершиться, так як в ній немає ніякого робочого коду.

Для початку, в неї можна додати рядок readln:

Ви побачите пусте текстове віконце, яке закриється, якщо натиснути клавішу Enter.

Як згадувалося раніше, Ви можете використовувати майже будь-яку функцію Win32 API з консольного застосування. Таке додаток дуже зручно ще й тим, що про користувальницький інтерфейс можна взагалі не думати, а для виведення інформації використовувати тільки пару функцій Write / Writeln. Прикладів застосування консольних додатків безліч: це і різного виду утиліти, і тестові програми для перевірки роботи функцій API і т.д. Ми не буде занурюватися в приклади того як використовувати певні API, а поговоримо лише про консольні API (Console API).

Консольні API (Console API)

Microsoft надає певний набір функцій, які дуже навіть корисні при створенні консольних додатків. Для початку скажу, що існує принаймні два дескриптора (handles). які пов'язані з консольним вікном. Один для введення, другий для виведення. Нижче наводяться дві невеликі функції, які показують, як отримати ці дескриптори.

Так само, краще відразу створити свої функції для таких простих операцій як позиціонування курсора, очищення екрану і відображення / приховування курсора (так як в консольних API вони трошки громозкой і заплутані). Ось як вони виглядають:

Як Ви встигли помітити, ми скористалися чотирма функціями консольного API: GetStdHandle. SetConsoleCursorPosition. FillConsoleOutputCharacter. SetConsoleCursorInfo. Іноді може виникнути завдання визначення розміру консольного вікна по вертикалі і по горизонталі. Для цього ми створимо дві змінні: MaxX і MaxY, типу WORD:

// --------------------------------------
// Ініціалізація глобальних змінних
// --------------------------------------
procedure Init;
begin
// Отримуємо дескриптор виведення (output)
ConHandle: = GetConOutputHandle;
// Отримуємо максимальні розміри вікна
Coord: = GetLargestConsoleWindowSize (ConHandle);
MaxX: = Coord.X;
MaxY: = Coord.Y;
end;

Ми навіть можемо зробити "цикл обробки повідомлень" (message loop) - для тих, хто тільки починає програмувати в Delphi - цикл обробки повідомлень необхідно робити, якщо додаток створюється в чистому API - при цьому необхідні як мінімум три складові: WinMain, message loop і window proc.

Нижче наведено код "циклу обробки повідомлень":

SetConsoleCtrlHandler (@ConProc, False);
Cls;
//
// "Цикл обробки повідомлень"
//
Continue: = True;
While Continue do
Begin
ReadConsoleInput (GetConInputHandle, IBuff, 1, IEvent);
Case IBuff.EventType of
KEY_EVENT. Begin
// Перевіряємо клавішу ESC і завершуємо програму
If ((IBuff.KeyEvent.bKeyDown = True) AND
(IBuff.KeyEvent.wVirtualKeyCode = VK_ESCAPE)) Then
Continue: = False;
End;
_MOUSE_EVENT. Begin
With IBuff.MouseEvent.dwMousePosition do
StatusLine (Format ( '.,.', [X, Y]));
End;
end;
End

Так само можна додати "обробник подій" і перехоплювати такі комбінації клавіш як Ctrl + C і Ctrl + Break:

// ------------------------------------------------ -----
// Оброблювач консольних подій
// ------------------------------------------------ -----
function ConProc (CtrlType. DWord). Bool; stdcall; far;
var
S. String;
begin
case CtrlType of
CTRL_C_EVENT. S: = 'CTRL_C_EVENT';
CTRL_BREAK_EVENT. S: = 'CTRL_BREAK_EVENT';
CTRL_CLOSE_EVENT. S: = 'CTRL_CLOSE_EVENT';
CTRL_LOGOFF_EVENT. S: = 'CTRL_LOGOFF_EVENT';
CTRL_SHUTDOWN_EVENT. S: = 'CTRL_SHUTDOWN_EVENT';
else
S: = 'UNKNOWN_EVENT';
end;
MessageBox (0, PChar (S + 'detected'), 'Win32 Console', MB_OK);
Result: = True;
end;

Щоб подивитися все це в дії, я зробив невелику демонстраційну програму, яка містить підпрограми, наведені вище, а також деякі інші можливості. Далі наведено повний вихідний код цього додатка. Насолоджуйтесь!

Схожі статті