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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Windows консоль на базе SynEdit, По ходу дела сделал компонент 
:(
    Опции темы
Vit
Дата 9.8.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Работая над GoldenPen решил прикрутить к нему виндовый терминал, получился компонент, основную функциональность cmd.exe вроде обеспечивает.

В прикреплённых файлах - полные тексты исходников

Присоединённый файл ( Кол-во скачиваний: 46 )
Присоединённый файл  SynConsole.ZIP 7,16 Kb


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 9.8.2005, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Вот пример exe с компонентом:



Присоединённый файл ( Кол-во скачиваний: 64 )
Присоединённый файл  WinConsole.exe 211,50 Kb


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vitalik
Дата 9.8.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Прикольная вещь! smile
Только туда бы еще подсветку smile smile
Тогда бы было совсем супер! smile
PM MAIL WWW ICQ YIM   Вверх
Vit
Дата 9.8.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Компонент ещё сыроват, но я в общем-то задавался целью не создать компонент на все случаи жизни, а обеспечить минимальные нужды для себя. Если есть желающие его отрехтовать - буду только рад. Вот перечень проблем которые мной не были решены:

1. Select/Paste - не решил из-за лени, сейчас компоеннт разрешает двигать курсор только в пределах текущей строки. Нужно добавить режим "селекта" когда разрешено выделение по всему тексту, возможно скрывать каретку на время этого режима

2. События на посылку команды и получение результатов - лень было возится, реализуется очень просто

3. Нет нормальной реализации Ctrl-C/Ctrl-Break - пока убиваю процесс, но это не корректно! Надо посылать терминалу контрол-событие, но с теми двумя API для этого с бубном попрыгал, с разгону не получилось, тратить время было жаль.

4. Свойство - Lines надо бы сделать Read-Only, но в SynEdit метод SetLines во-первых почему-то статический, а во вторых объявлен как Private... Блин, проще наверное разработчикам написать, иначе бубун нужен будет просто колласальных размеров

5. Теоретически если консольное приложение зависнет то и вся прога повиснет, что не есть хорошо... В thread что-ли его пустить?...

6. Нет нормального Completition - я основную функциональность сделал, но надо бы подточить.

7. Нет реакции на F2, F8 и т.п. как в cmd

8. Не пойму, почему странно ведут себя переносы строк. В cmd команды

Ping
и
Ping yahoo.com

Выглядят нормально, а у меня по разному.
9. По ходу дела так и не понял каким шрифтом рисуют в cmd - похоже чем-то самопальным, такого шрифта вообще в системе нет!

10. Как отличить консольное приложение от неконсольного. При запуске консольного его надо запускать скрытым и перехватывать вывод, а при запуске оконного - его просто запускать видимым и прекращать что-либо перехватывать. Тут бубун зарыт вот где: если определять консольность до запуска, то надо точно локализовать что именно будет запускаться, например на команду "notepad" реально запускается "c:\windows\notepad.exe", если же определять после запуска программы то надо по handle найти путь к программе или каким-то другим способом установить тип программы.

11. Ну и последнее - наверное нужен перехват и обработка входного канала тоже, например если консольная прога запросит чего-то, то сейчас это никак нельзя ввести.

Небольшой глюк: как правильно обработать запуск файлов по ассоциациям?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
s-mike
Дата 9.8.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: нет
Всего: 16



Вот хороший компонент для перехвата консольного вывода, может пригодится smile

Присоединённый файл ( Кол-во скачиваний: 28 )
Присоединённый файл  DosCommand.rar 3,48 Kb
PM MAIL WWW   Вверх
Vit
Дата 9.8.2005, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Сейчас посмотрим, может я велосипед изобретал smile
Добавлено @ 21:16
Нет, не велосипед, хотя кое что из этого компонента можно взять на вооружение. Спасибо, s-mike!


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Петрович
Дата 19.9.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата(Vit @ 9.8.2005, 21:49)
5. Теоретически если консольное приложение зависнет то и вся прога повиснет, что не есть хорошо... В thread что-ли его пустить?...

Цитата(Vit @ 9.8.2005, 21:49)
11. Ну и последнее - наверное нужен перехват и обработка входного канала тоже, например если консольная прога запросит чего-то, то сейчас это никак нельзя ввести.

Тут наверное незачем изобретать велосипед. Есть вполне грамотные реализации функции запуска приложений, перехвата их вывода и подачи ввода на их вход. В качестве примера, могу привести компонент TVirtualRedirector из пакета VirtualShellTools. Там грамотно реализована работа с отдельным потоком, обрабатывающем пайпы. Кроме того, он учитывает специфику Win9x/WinNT.
А вообще, попутно, в твоей реализации неправильно организуется работа с пайпами. Во первых, ты "закорачиваешь" вывод запускаемой программы на ее ввод, что естественно не правильно. Для ввода и вывода должны использоваться раздельные пайпы. Кроме того, нужен еще один пайп для стандартного потока ошибок (ErrorOut). Его тоже программы иногда используют для вывода сообщений об ошибках.

Цитата(Vit @ 9.8.2005, 21:49)
8. Не пойму, почему странно ведут себя переносы строк. В cmd команды

Ping
и
Ping yahoo.com

Выглядят нормально, а у меня по разному.

Проблема в том, что некоторые команды завершают строку последовательностью ^M^M^J. Для правильного терминала, любое число последовательных ^M эквивалентно единственному ^M. Т.к. ^M это всего навсего команда "переместить курсор в начало текущей строки". Соответственно, ^J, для правильного терминала, команда "переместить курсор на следующую строку, не изменяя позиции в строке".
Естественно, по логике надо полностью эмулировать работу терминала. Дело в том, что некоторые программы (например мои smile) иногда этим пользуются для вывода состояния выполнения операции. Например последовательно выводятся следующие строки:
Код

'Compile module xxx.pas'^M^J
^M'Compiled lines:  123'
^M'Compiled lines:  890'
^M'Compiled lines:  890'
^M'Compiled lines: 1234'
^M^J'Compile completed'^M^J
При правильной эмуляции, это будет выглядеть как обновление информации о процессе компиляции в одной строке.

Цитата(Vit @ 9.8.2005, 21:49)
9. По ходу дела так и не понял каким шрифтом рисуют в cmd - похоже чем-то самопальным, такого шрифта вообще в системе нет!

Кажется, cmd использует шрифт Terminal. Однако, не совсем понятно как он выбирает его размер, поскольку этот шрифт матричный, и имеет несколько размеров знакоместа.

Цитата(Vit @ 9.8.2005, 21:49)
10. Как отличить консольное приложение от неконсольного. При запуске консольного его надо запускать скрытым и перехватывать вывод, а при запуске оконного - его просто запускать видимым и прекращать что-либо перехватывать. Тут бубун зарыт вот где: если определять консольность до запуска, то надо точно локализовать что именно будет запускаться, например на команду "notepad" реально запускается "c:\windows\notepad.exe", если же определять после запуска программы то надо по handle найти путь к программе или каким-то другим способом установить тип программы.

Точно не помню, но в заголовке EXE-файла кажется есть битик, обозначающий консольное приложение. Насколько помню, где-то читал что система по нему определяет что при запуске такой программы, для нее необходимо создать консольное окно.
Правда, естественно можно предположить существование виндовых программ которые сами создают себе консольное окно. Я лично таких не встречал.

Добавлено @ 12:49
Да, забыл.
Еще, у тебя там не очень корректно отслеживается комманда cd и подобные.
В RunDosInMemo: pos('cd ', lowercase(CmdLine))>0 и т.п. Нельзя просто проверять на >0. Это приводит к ошибкам если в аргументах какой либо комманды встретится 'cd ' и т.п. Например Dir "cd 1"

Ну и большие проблемы с запуском DOS-приложений. Процессы ntvdm плодятся, а вывод не перехватывается!

Это сообщение отредактировал(а) Петрович - 19.9.2005, 12:42


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.