GUI --> Консоль

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

GUI --> Консоль

Сообщение kotompazb » 06.09.2015 15:16:19

Здравствуйте.
Это опять я. И вопрос (прошу за это прощения) по традиции будет глупым.
Итак, есть некая утилита с оконным интерфейсом (всего одна формочка), как мне по определенному ключу запретить создание формы, то есть превратить ее в консольную (если я правильно понимаю суть)?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение vitaly_l » 06.09.2015 15:31:09

Если я правильно понял вопрос, то нужно изначально создать проект без формы. Он так и называется: консольное приложение. <= Правильно? Это нужно?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GUI --> Консоль

Сообщение kotompazb » 06.09.2015 15:51:24

vitaly_l писал(а):Если я правильно понял вопрос, то нужно изначально создать проект без формы. Он так и называется: консольное приложение. <= Правильно? Это нужно?

Да в том-то и дело, что все уже написано в оконном виде. А вот теперь людям понадобился консольный вариант. Плодить разные варианты одного и того же очень бы не хотелось. Хотелось бы, чтобы утилита при запуске проверяла параметры командной строки и при нахождении определенного ключа НЕ создавала форму, а работала в консоли. Я предполагаю это должно решаться примерно так. Убираем форму из авто-создаваемых, а дальше ...что?
Результат должен быть такой:
- запускает юзер утилиту как обычно, без ключей - открывается форма, утилита работает, как оконная;
- запускает юзер утилиту с ключом, например, -silent - форма не создается, утилита работает, как консольная.
Это вообще возможно?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение vitaly_l » 06.09.2015 16:11:32

kotompazb писал(а):Да в том-то и дело, что все уже написано в оконном виде. А вот теперь людям понадобился консольный вариант.

Суть в том что, TForm - это сложный класс и он родитель MainUnit... и он по любому загружается в оконном режиме... если его отключить, то перестанет работать код из MainUnit и все процедуры и функции из него.

С другой стороны, сам переключатель "оконный/консольный" - сделать просто. Но тогда MainUnit работать не будет, а вместо него придётся написать другой unit для консольного приложения, в котором продублировать функции. А потом их перелинковать на MainUnit... Грубо говоря из консольного приложения проще сделать оконное, нежели наоборот. Ждите, может кто-то более сведущий заглянет и поможет. Мой вариант описан выше.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GUI --> Консоль

Сообщение kotompazb » 06.09.2015 17:20:17

vitaly_l писал(а):Суть в том что, TForm - это сложный класс и он родитель MainUnit... и он по любому загружается в оконном режиме... если его отключить, то перестанет работать код из MainUnit и все процедуры и функции из него.

С другой стороны, сам переключатель "оконный/консольный" - сделать просто. Но тогда MainUnit работать не будет, а вместо него придётся написать другой unit для консольного приложения, в котором продублировать функции. А потом их перелинковать на MainUnit... Грубо говоря из консольного приложения проще сделать оконное, нежели наоборот. Ждите, может кто-то более сведущий заглянет и поможет. Мой вариант описан выше.

Вынести процедуры в отдельный unit совсем не проблемма, там всего два обработчика.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение zub » 06.09.2015 17:38:31

Замените содержимое lpr на нечто подобное
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  windows,
  Forms, Unit1
  { you can add units after this };

{$R *.res}

begin
  if paramcount>0 then
  begin
    AllocConsole;
    IsConsole := True;
    SysInitStdIO;
    Writeln('Hello');
    Readln;
  end
  else
  begin
    RequireDerivedFormResource:=True;
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.

Единственное, при запуске программы из консоли будет открыта еще одна консоль
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: GUI --> Консоль

Сообщение kotompazb » 06.09.2015 18:00:25

zub, спасибо. То, что надо.
zub писал(а):Единственное, при запуске программы из консоли будет открыта еще одна консоль

Думаю это не смертельно. Но все ж этого как-то можно избежать?:)
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение zub » 06.09.2015 18:03:58

>>Но все ж этого как-то можно избежать?:)
Наверно, но я не интересовался
Найдете способ - поделитесь

Еще вариант - 2 варианта программы консольный и гуйный + "запускалку" которая по ситуации выберет какой вариант фактически запускать
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: GUI --> Консоль

Сообщение vitaly_l » 06.09.2015 18:35:52

Из книги, которая есть в разделе обучение.

Глава 8. Типы программ
Free Pascal позволяет создавать консольные программы и программы с
графическим интерфейсом. Тип программы определяется глобальной
директивой APPTYPE. Флаг CONSOLE соответствует консольной программе, а
флаг GUI программе с графическим интерфейсом.


далее: Глава 9. Режимы совместимости
В смысле, описание Типа программ на этом у автора книги закончилось. Более подробную информацию нужно искать по запросу APPTYPE. И Вам будет много примеров.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GUI --> Консоль

Сообщение kotompazb » 06.09.2015 18:39:17

zub писал(а):>>Но все ж этого как-то можно избежать?:)
Наверно, но я не интересовался
Найдете способ - поделитесь

Еще вариант - 2 варианта программы консольный и гуйный + "запускалку" которая по ситуации выберет какой вариант фактически запускать

Пожалуй все же остановлюсь на первом варианте.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение Vadim » 07.09.2015 14:16:51

kotompazb
Продолжаю тему zub'а...
Хорошо, если программа ничего не выводит. ;-) Но если есть форма, значит она должна что-то сообщать. Можно при запуске этой программы делать вывод в текстовый файл, чтобы не плодить дополнительных консолек. Что-то типа:
Код: Выделить всё
Var
  f: TextFile;
begin
  If ParamCount>0 Then
  Begin
    AssignFile(f, '1.txt');
    Rewrite(f);
    WriteLn(f, 'Здравствуй жопа-Новый-год!');
    CloseFile(f);
  end
  Else
  Begin
    RequireDerivedFormResource:=True;
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.   
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: GUI --> Консоль

Сообщение kotompazb » 07.09.2015 15:48:42

Vadim, ага. Спасибо. Ваще-то юзер, просивший консоль (из-за чего и появилась эта тема), пока молчит, не говорит, чего ему надобно. Поэтому и я ничего не делаю. А там, возможно, появятся и еще вопросы.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение Alex2013 » 10.09.2015 02:03:39

В дельфи было достаточно написать (Кстати вполне работало в гибридных проектах )

{$APPTYPE CONSOLE}
begin
...
end.
В старых версиях Лазарусса можно было для консоли писать что угодно в файле *.lpr
в новых есть тип проекта "консольная программа " ...

Но вообще ИМХО для консоли лучше взять "голый фри паскаль" и ваять прямо в нем минуя лазарус ...
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: GUI --> Консоль

Сообщение kotompazb » 10.09.2015 02:47:23

Alex2013 писал(а):В дельфи было достаточно написать (Кстати вполне работало в гибридных проектах )

{$APPTYPE CONSOLE}
begin
...
end.
В старых версиях Лазарусса можно было для консоли писать что угодно в файле *.lpr
в новых есть тип проекта "консольная программа " ...

Но вообще ИМХО для консоли лучше взять "голый фри паскаль" и ваять прямо в нем минуя лазарус ...

Вопрос немного другой. Я не хочу пилить одно и тоже в 2 вариантах: консольном и GUIевом.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 153
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: GUI --> Консоль

Сообщение Лекс Айрин » 10.09.2015 09:45:24

kotompazb, тогда придется полностью переписать прогу на WinAPI как консольную программу, и уже оттуда открывать форму. Но тогда консоль будет открыта пока работает Ваша программа. И это будет написание на чистом фрипаскале.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 241

Рейтинг@Mail.ru
cron