консольное приложение с возможностью прикрутки внешнего GUI

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

консольное приложение с возможностью прикрутки внешнего GUI

Сообщение kvas » 10.01.2016 19:02:04

Хочу написать программу так, чтобы она была:
1) консольной - пользовательский интерфейс вроде ДОСовского debug (это будет эмулятор некоей виртуальной ЭВМ)
2) допускала запуск под внешней программой, которая перехватит её Stdin,Stdout,Stderr и оформит вывод уже в виде оконной графики (сам реализовывать п.2 не планирую, но надо чтобы это было реализуемо)
3) переносимой (путём перекомпилляции, естественно) не теряя свойств между разными ОС, как минимум - windows/linux/freebsd
4) потребуется вывод и русских символов, в однобайтовой кодировке
Как мне лучше осуществлять ввод и вывод текста чтобы не вступить в потиворечие с пунктами 2 и 3? Ну и чтобы переносимость минимально повлияла на п.4?
Стандартные writeln/readln так же, как в турбо-паскале, от модуля Crt дико зависят?

P.S. с паскалем уже 25 лет знаком
Последний раз редактировалось kvas 11.01.2016 11:50:19, всего редактировалось 1 раз.
kvas
незнакомец
 
Сообщения: 3
Зарегистрирован: 10.01.2016 18:40:44

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение bormant » 10.01.2016 21:28:05

Соберите общую функциональность в библиотеке, которую будете использовать из текстового и графического интерфейса.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение kvas » 11.01.2016 11:48:36

Спасибо, это вполне рабочий способ обхода моей проблемы, но мне хочется не обойти её, а решить. В том числе и на будущее, для других проектов.
kvas
незнакомец
 
Сообщения: 3
Зарегистрирован: 10.01.2016 18:40:44

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение Снег Север » 11.01.2016 15:10:50

Это не обход проблемы, а единственный реальный путь ее решения.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение Дож » 11.01.2016 19:16:17

Общее правило: в stderr стоит писать только данные для пользователя (ошибки, trace, verbose и т.д.), а в stdout только полезную и ожидаемую информацию. Тогда программе не придётся чистить от мусора вывод, а пользователь сможет увидеть важную информацию.

По задаче: самый простой способ решить проблему — это ввести ключики для контроля форматов и режимов работы программы (и пользователь будет запускать просто ./prog, а надпроцесс — ./prog --input-format external --output-format external). (Ну, или вообще просто один ключ ./prog -e) Тогда будет полная свобода в продумывании своего API, не влияющего на человеческую версию.

По пункту 3 — нужно соблюдать стандартные требования на кроссплатформенные приложения. В FPC есть много стандартных кроссплатформенных модулей, следует их выбирать при прочих равных.
http://wiki.lazarus.freepascal.org/Mult ... ming_Guide

По пункту 4 — по умолчанию программе следует использовать стандартную системную (консольную) кодировку, а для внешних вызовов ввести ключики для выбора (опять же ./prog --input-encoding cp1251 --output-encoding cp1251).

Стандартные writeln/readln так же, как в турбо-паскале, от модуля Crt дико зависят?

Модуль Crt лучше вообще не использовать, он не поддерживается, делает работу программы странной и кривой. Стандартные Write и Read работают хорошо.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение Mirage » 11.01.2016 21:32:24

Виртуализируйте ввод/вывод, чтобы программа использовала некий API, а далее можно было менять реализацию.
Например, реализация через read/write. А для GUI-морды через TCP, например. Или другой какой способ IPC.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение kvas » 26.01.2016 14:27:39

Написал тестовую программу и начал её мучать. Итог:
"ReadLn(Str);" - читает из стандартного входа
"WriteLn(Output,Str);" - направляет в стандартный файл вывода
"WriteLn(StdErr,Str);" - направляет в стандартный файл вывода сообщений об ошибках
команда "ConsoleTest.exe <ConsoleTest.txt >ConsoleTest.res1 2>ConsoleTest.res2" отрабатывает все три переназначения как полагается.

Добавлено спустя 22 часа 32 минуты 49 секунд:
Re: консольное приложение с возможностью прикрутки внешнего GUI
... и, чтобы уж поставить последние точки над "ё", замечу, что функции "SetStdHandle" и "GetStdHandle" не работают (компилятору не известен тип "hwnd"), если в секции "Uses" не упомянут модуль "Windows", наличие которого ставит под угрозу переносимость под юниксы.
kvas
незнакомец
 
Сообщения: 3
Зарегистрирован: 10.01.2016 18:40:44

Re: консольное приложение с возможностью прикрутки внешнего

Сообщение Дож » 27.01.2016 15:19:59

Ну да, эти функции — чистое WinApi.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru