GUI --> Консоль
Модератор: Модераторы
GUI --> Консоль
Здравствуйте.
Это опять я. И вопрос (прошу за это прощения) по традиции будет глупым.
Итак, есть некая утилита с оконным интерфейсом (всего одна формочка), как мне по определенному ключу запретить создание формы, то есть превратить ее в консольную (если я правильно понимаю суть)?
Это опять я. И вопрос (прошу за это прощения) по традиции будет глупым.
Итак, есть некая утилита с оконным интерфейсом (всего одна формочка), как мне по определенному ключу запретить создание формы, то есть превратить ее в консольную (если я правильно понимаю суть)?
Если я правильно понял вопрос, то нужно изначально создать проект без формы. Он так и называется: консольное приложение. <= Правильно? Это нужно?
vitaly_l писал(а):Если я правильно понял вопрос, то нужно изначально создать проект без формы. Он так и называется: консольное приложение. <= Правильно? Это нужно?
Да в том-то и дело, что все уже написано в оконном виде. А вот теперь людям понадобился консольный вариант. Плодить разные варианты одного и того же очень бы не хотелось. Хотелось бы, чтобы утилита при запуске проверяла параметры командной строки и при нахождении определенного ключа НЕ создавала форму, а работала в консоли. Я предполагаю это должно решаться примерно так. Убираем форму из авто-создаваемых, а дальше ...что?
Результат должен быть такой:
- запускает юзер утилиту как обычно, без ключей - открывается форма, утилита работает, как оконная;
- запускает юзер утилиту с ключом, например, -silent - форма не создается, утилита работает, как консольная.
Это вообще возможно?
kotompazb писал(а):Да в том-то и дело, что все уже написано в оконном виде. А вот теперь людям понадобился консольный вариант.
Суть в том что, TForm - это сложный класс и он родитель MainUnit... и он по любому загружается в оконном режиме... если его отключить, то перестанет работать код из MainUnit и все процедуры и функции из него.
С другой стороны, сам переключатель "оконный/консольный" - сделать просто. Но тогда MainUnit работать не будет, а вместо него придётся написать другой unit для консольного приложения, в котором продублировать функции. А потом их перелинковать на MainUnit... Грубо говоря из консольного приложения проще сделать оконное, нежели наоборот. Ждите, может кто-то более сведущий заглянет и поможет. Мой вариант описан выше.
vitaly_l писал(а):Суть в том что, TForm - это сложный класс и он родитель MainUnit... и он по любому загружается в оконном режиме... если его отключить, то перестанет работать код из MainUnit и все процедуры и функции из него.
С другой стороны, сам переключатель "оконный/консольный" - сделать просто. Но тогда MainUnit работать не будет, а вместо него придётся написать другой unit для консольного приложения, в котором продублировать функции. А потом их перелинковать на MainUnit... Грубо говоря из консольного приложения проще сделать оконное, нежели наоборот. Ждите, может кто-то более сведущий заглянет и поможет. Мой вариант описан выше.
Вынести процедуры в отдельный unit совсем не проблемма, там всего два обработчика.
Замените содержимое 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, спасибо. То, что надо.
Думаю это не смертельно. Но все ж этого как-то можно избежать?:)
zub писал(а):Единственное, при запуске программы из консоли будет открыта еще одна консоль
Думаю это не смертельно. Но все ж этого как-то можно избежать?:)
>>Но все ж этого как-то можно избежать?:)
Наверно, но я не интересовался
Найдете способ - поделитесь
Еще вариант - 2 варианта программы консольный и гуйный + "запускалку" которая по ситуации выберет какой вариант фактически запускать
Наверно, но я не интересовался
Найдете способ - поделитесь
Еще вариант - 2 варианта программы консольный и гуйный + "запускалку" которая по ситуации выберет какой вариант фактически запускать
Из книги, которая есть в разделе обучение.
Глава 8. Типы программ
Free Pascal позволяет создавать консольные программы и программы с
графическим интерфейсом. Тип программы определяется глобальной
директивой APPTYPE. Флаг CONSOLE соответствует консольной программе, а
флаг GUI программе с графическим интерфейсом.
далее: Глава 9. Режимы совместимости
В смысле, описание Типа программ на этом у автора книги закончилось. Более подробную информацию нужно искать по запросу APPTYPE. И Вам будет много примеров.
Глава 8. Типы программ
Free Pascal позволяет создавать консольные программы и программы с
графическим интерфейсом. Тип программы определяется глобальной
директивой APPTYPE. Флаг CONSOLE соответствует консольной программе, а
флаг GUI программе с графическим интерфейсом.
далее: Глава 9. Режимы совместимости
В смысле, описание Типа программ на этом у автора книги закончилось. Более подробную информацию нужно искать по запросу APPTYPE. И Вам будет много примеров.
zub писал(а):>>Но все ж этого как-то можно избежать?:)
Наверно, но я не интересовался
Найдете способ - поделитесь
Еще вариант - 2 варианта программы консольный и гуйный + "запускалку" которая по ситуации выберет какой вариант фактически запускать
Пожалуй все же остановлюсь на первом варианте.
kotompazb
Продолжаю тему zub'а...
Хорошо, если программа ничего не выводит.
Но если есть форма, значит она должна что-то сообщать. Можно при запуске этой программы делать вывод в текстовый файл, чтобы не плодить дополнительных консолек. Что-то типа:
Продолжаю тему 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, ага. Спасибо. Ваще-то юзер, просивший консоль (из-за чего и появилась эта тема), пока молчит, не говорит, чего ему надобно. Поэтому и я ничего не делаю. А там, возможно, появятся и еще вопросы.
В дельфи было достаточно написать (Кстати вполне работало в гибридных проектах )
{$APPTYPE CONSOLE}
begin
...
end.
В старых версиях Лазарусса можно было для консоли писать что угодно в файле *.lpr
в новых есть тип проекта "консольная программа " ...
Но вообще ИМХО для консоли лучше взять "голый фри паскаль" и ваять прямо в нем минуя лазарус ...
{$APPTYPE CONSOLE}
begin
...
end.
В старых версиях Лазарусса можно было для консоли писать что угодно в файле *.lpr
в новых есть тип проекта "консольная программа " ...
Но вообще ИМХО для консоли лучше взять "голый фри паскаль" и ваять прямо в нем минуя лазарус ...
Alex2013 писал(а):В дельфи было достаточно написать (Кстати вполне работало в гибридных проектах )
{$APPTYPE CONSOLE}
begin
...
end.
В старых версиях Лазарусса можно было для консоли писать что угодно в файле *.lpr
в новых есть тип проекта "консольная программа " ...
Но вообще ИМХО для консоли лучше взять "голый фри паскаль" и ваять прямо в нем минуя лазарус ...
Вопрос немного другой. Я не хочу пилить одно и тоже в 2 вариантах: консольном и GUIевом.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
kotompazb, тогда придется полностью переписать прогу на WinAPI как консольную программу, и уже оттуда открывать форму. Но тогда консоль будет открыта пока работает Ваша программа. И это будет написание на чистом фрипаскале.
