| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Перенаправление Write[Ln] в Memo |
| Автор: icm 30.4.2006, 21:13 |
| Суть вот в чём. Нужно, чтобы в неконсольной программе можно было использовать Write/WriteLn, и всё это выводилось в Memo. Возможен вариант с AllocConsole, но мне он не очень подходит, т.к. нужно выводить именно в Мемо. Конкретный пример применения - подключение старых юнитов, которые в случае чего сразу выдают сообщение в stdout. На форуме много постов, где обсуждается перехват вывода другого консольного приложения, но вот конкретно по этой теме ничего не нашёл |
| Автор: Rouse_ 2.5.2006, 09:51 | ||
|
| Автор: icm 2.5.2006, 14:14 |
| 2Rouse_: Спасибо за пример, но я не это имел в виду. Перегруженная функция лишена всех преимуществ оригинальной: здесь можно писать только стринг, и только один. А в оригинале кол-во параметров и их типы могут быть различными. Т.е. мне не нужно писать что-то вместо оригинальной функции Write/WriteLn, а надо лишь "перехватить" то, что выводит оригинал. P.S. Админ почему-то решил, что эта тема больше подходит "для общих вопросов" и переместил его сюда, хотя изначально я имел в виду именно вариант работы с пайпами или нечто подобное. |
| Автор: Rouse_ 2.5.2006, 15:48 |
А почему не пододит? Создавай свою консоль, все будет уходить в нее, а ты читай что там появляется и выводи на экран. |
| Автор: Nickel 2.5.2006, 15:54 | ||
Если не критично быстродействие, то можно перенаправить вывод в файл и потом оттуда читать:
|
| Автор: icm 2.5.2006, 16:11 | ||||||
Тут даже не столько в быстродействии проблема, сколько в необходимости постоянно обновлять в мемо содержимое файла, чтобы сообщения появлялись сразу.... Может кто-нибудь подскажет вариант с пайпами? Добавлено @ 16:25
Этот вариант подошёл бы, если б: 1. само консольное окно было скрыто (в принципе не сложно); 2. вывод из Write/WriteLn сразу же появлялся в Мемо во время выполнения программы Если есть предложения, как это можно сделать, с радостью выслушаю. |
| Автор: Snowy 2.5.2006, 16:30 |
| Лень. Это нужно создавать консоль, получать ее хэндл, создавать тред, который будет в консоль писать, а из своего треда из нее читать... Многа возни. Времени на это нет. |
| Автор: icm 3.5.2006, 12:25 | ||||||
Значит, я ошибался, понадеявшись, что не мне одному очевидно, что полностью эта задача решается только посредством использования WinAPI
Я ранее писал:
Если на самом деле обсуждалась именно эта проблема (а НЕ перехват вывода в консоль ДРУГОГО приложения), буду очень благодарен, если Вы укажете мне ссылку. 2Snowy: Я понимаю, лень и всё такое... но я же не прошу привести мне полностью рабочий код, хотя бы его ключевые моменты. |
| Автор: Snowy 3.5.2006, 12:38 |
| Возьми пример запуска консольного приложения и чтения его вывода. Только замени CreateProcess на AllocConsole и CreateThread. Создай процедуру, которая будет запускаться тредом, вызывать код, пишущий в консоль, делать FreeConsole и закрывать тред. Все остальное примерно такое же. |
| Автор: Alexeis 3.5.2006, 12:39 |
| icm, С консолью сам не работал, но поискав нашел неплохую статью, вроде то что нужно. http://delphiworld.narod.ru/base/stdin_stdout.html |
| Автор: Nickel 3.5.2006, 16:59 | ||
icm, хочешь пайпы? на тебе пайпы, тока от файлов они отличаются не особенно сильно и пока не вызовешь CloseFile(output) в пайп ничего не напишется.
|