Може ли GUI програма на 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

Е, очевидно настройването на проекта като gui приложение, а не като програма, е много по-добро за програмиране. Всички необходими клаузи за употреба вече са налице.

Така че този вид проблем, получаване на power of 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