Может ли программа с графическим интерфейсом Windows, написанная на Lazarus, создать консоль и писать в нее во время выполнения?

При написании программы Lazarus у вас есть возможность использовать $APPTYPE console или отменить выбор Win32 GUI Application (опция -WG) в параметрах проекта.

Я заметил, что без этих опций DebugLn и WriteLn вызывают исключения. Есть ли способ создать консоль, даже если программа не скомпилирована с указанными выше параметрами, а затем выводиться в нее с помощью DebugLn и WriteLn?


person vfclists    schedule 22.11.2013    source источник
comment
Я не знаю о freepascal или lazarus, но API-функция AllocConsole win32 может сделать это на C и D... msdn.microsoft.com/en-us/library/windows/desktop/   -  person Adam D. Ruppe    schedule 22.11.2013
comment
[FreePascal и Lazarus][1] Я хочу знать, реализовано ли это в библиотеках на поддерживаемых платформах [1]: lazarus.freepascal.org   -  person vfclists    schedule 22.11.2013
comment
stackoverflow.com/q/4421042/62576 объясняет, как это можно сделать с помощью Delphi и VCL. Однако, если вы ориентируетесь на другие платформы, кроме Win32, это, вероятно, не поможет. Сомнительно, что это возможно для всех платформ, поддерживаемых FreePascal/Lazarus, IMO.   -  person Ken White    schedule 22.11.2013


Ответы (2)


В Windows это немного сложнее по сравнению с Delphi. В Delphi все, что вам нужно сделать, это вызвать AllocConsole. Используя Lazarus/FreePascal, вам нужно проделать небольшую дополнительную работу:

uses
  Windows;
begin
  AllocConsole;      // in Windows unit
  IsConsole := True; // in System unit
  SysInitStdIO;      // in System unit
  // Now you can do Writeln, DebugLn, ...
end.

К сожалению, я не могу помочь вам на других платформах. Хотя iirc в консоли Linux всегда присутствует для программы, даже если она не видна. Так что это должно работать без дополнительного кода. Однако я не могу проверить этот банкомат, поэтому отнеситесь к нему с недоверием.

person Avo Muromägi    schedule 22.11.2013
comment
У демонов Afaik нет stdin/out, их закрытие является частью процесса демонизации. Классический способ повторного открытия stdout — это просто rewrite(output); аналогично сброс для stdin. - person Marco van de Voort; 23.11.2013

Что ж, очевидно, что настройка проекта как приложения с графическим интерфейсом, а не программы, намного лучше для программирования. Все необходимые пункты использования уже присутствуют.

Итак, такая проблема, получая мощность от Lazarus, но работая как консольное приложение, я решаю, добавляя Application.ShowMainForm:=False; перед

Application.CreateForm(TForm1, Form1);

в файле .lpr.

Все работает нормально, даже showmessage (все) можно использовать.

person josifoski    schedule 22.11.2013
comment
Означает ли это, что консольная программа рассматривает консоль как основную форму, подавляя ее с помощью Application.ShowMainForm := False? Если это так, как после этого может отображаться консоль? - person vfclists; 23.11.2013