Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенаправление Write[Ln] в Memo, Эмуляция консольного вывода в GUI 
:(
    Опции темы
icm
Дата 30.4.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.4.2006

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



Суть вот в чём. Нужно, чтобы в неконсольной программе можно было использовать Write/WriteLn, и всё это выводилось в Memo. 
Возможен вариант с AllocConsole, но мне он не очень подходит, т.к. нужно выводить именно в Мемо.

Конкретный пример применения - подключение старых юнитов, которые в случае чего сразу выдают сообщение в stdout.

На форуме много постов, где обсуждается перехват вывода другого консольного приложения, но вот конкретно по этой теме ничего не нашёл smile.
 
PM MAIL   Вверх
Rouse_
Дата 2.5.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Код

procedure Writeln(AMemo: TMemo; Value: String); overload;
begin
  AMemo.Lines.Add(Value);
end;

procedure TForm9.Button4Click(Sender: TObject);
begin
  Writeln(Memo1, 'qwe');
end;
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
icm
Дата 2.5.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.4.2006

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



2Rouse_: Спасибо за пример, но я не это имел в виду.

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

Т.е. мне не нужно писать что-то вместо оригинальной функции Write/WriteLn, а надо лишь "перехватить" то, что выводит оригинал.

P.S. Админ почему-то решил, что эта тема больше подходит "для общих вопросов" и переместил его сюда, хотя изначально я имел в виду именно вариант работы  с пайпами или нечто подобное.
 
PM MAIL   Вверх
Rouse_
Дата 2.5.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Цитата(icm @  30.4.2006,  22:13 Найти цитируемый пост)
Возможен вариант с AllocConsole, но мне он не очень подходит

А почему не пододит? Создавай свою консоль, все будет уходить в нее, а ты читай что там появляется и выводи на экран. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Nickel
Дата 2.5.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Если не критично быстродействие, то можно перенаправить вывод в файл и потом оттуда читать: 
Код

AssignFile(Output,'ôàéë');
ReWrite(Output);
 
PM   Вверх
icm
Дата 2.5.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.4.2006

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



Цитата(Nickel @ 2.5.2006,  15:54)
Если не критично быстродействие, то можно перенаправить вывод в файл и потом оттуда читать: 
Код

AssignFile(Output,'ôàéë');
ReWrite(Output);

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

Может кто-нибудь подскажет вариант с пайпами?

Добавлено @ 16:25 

Цитата(Rouse_ @ 2.5.2006,  15:48)
Цитата(icm @  30.4.2006,  22:13 Найти цитируемый пост)
Возможен вариант с AllocConsole, но мне он не очень подходит

А почему не пододит? Создавай свою консоль, все будет уходить в нее, а ты читай что там появляется и выводи на экран.

Этот вариант подошёл бы, если б:
1. само консольное окно было скрыто (в принципе не сложно);
2. вывод из Write/WriteLn сразу же появлялся в Мемо во время выполнения программы

Если есть предложения, как это можно сделать, с радостью выслушаю. 
PM MAIL   Вверх
Snowy
Дата 2.5.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Лень. Это нужно создавать консоль, получать ее хэндл, создавать тред, который будет в консоль писать, а из своего треда из нее читать...
Многа возни. Времени на это нет. 
PM MAIL   Вверх
Girder
Дата 3.5.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 31
Всего: 155



Цитата(icm @  2.5.2006,  15:14 Найти цитируемый пост)
P.S. Админ почему-то решил, что эта тема больше подходит "для общих вопросов" и переместил его сюда, хотя изначально я имел в виду именно вариант работы  с пайпами или нечто подобное.
А мы не телепаты... что ты решил smile (в твоем первом посте ентого нету) 
Цитата(icm @  30.4.2006,  22:13 Найти цитируемый пост)
Суть вот в чём. Нужно, чтобы в неконсольной программе можно было использовать Write/WriteLn, и всё это выводилось в Memo. 
Возможен вариант с AllocConsole, но мне он не очень подходит, т.к. нужно выводить именно в Мемо.

Конкретный пример применения - подключение старых юнитов, которые в случае чего сразу выдают сообщение в stdout.

На форуме много постов, где обсуждается перехват вывода другого консольного приложения, но вот конкретно по этой теме ничего не нашёл smile


Цитата(icm @  2.5.2006,  17:11 Найти цитируемый пост)
Может кто-нибудь подскажет вариант с пайпами?
Много раз обсуждалось и приводились решения...
   


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
icm
Дата 3.5.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.4.2006

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



Цитата(Girder @ 3.5.2006,  10:54)
А мы не телепаты... что ты решил smile (в твоем первом посте ентого нету)


Значит, я ошибался, понадеявшись, что не мне одному очевидно, что полностью эта задача решается только посредством использования WinAPI smile... Может быть тот факт, что изначально пост был размещён именно в разделе "Delphi: WinAPI и системное программирование" мог послужить "тонким" намёком  smile...


Цитата(Girder @ 3.5.2006,  10:54)
Много раз обсуждалось и приводились решения...


Я ранее писал:
Цитата(icm @ 30.4.2006  21:13)

На форуме много постов, где обсуждается перехват вывода другого консольного приложения, но вот конкретно по этой теме ничего не нашёл smile. 


Если на самом деле обсуждалась именно эта проблема (а НЕ перехват вывода в консоль ДРУГОГО приложения), буду очень благодарен, если Вы укажете мне  ссылку. 

2Snowy:
Я понимаю, лень и всё такое... но я же не прошу привести мне полностью рабочий код, хотя бы его ключевые моменты. 
PM MAIL   Вверх
Snowy
Дата 3.5.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Возьми пример запуска консольного приложения и чтения его вывода.
Только замени CreateProcess на AllocConsole и CreateThread.
Создай процедуру, которая будет запускаться тредом, вызывать код, пишущий в консоль, делать FreeConsole и закрывать тред.
Все остальное примерно такое же. 
PM MAIL   Вверх
Alexeis
Дата 3.5.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



icm, С консолью сам не работал, но поискав нашел неплохую статью, вроде то что нужно.
http://delphiworld.narod.ru/base/stdin_stdout.html 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Nickel
Дата 3.5.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



icm, хочешь пайпы? на тебе пайпы, тока от файлов они отличаются не особенно сильно и пока не вызовешь CloseFile(output) в пайп ничего не напишется.
Код

var StdoutRd, StdoutWr:THandle;
    buffer:array[0..255] of char;
    b:cardinal;
begin
ZeroMemory(@buffer,sizeof(buffer));
CreatePipe(StdoutRd, StdoutWr, nil, 0);
SetStdHandle(STD_OUTPUT_HANDLE, StdoutWr);
Writeln('Óðà! ïàéïû ðàáîòàþò!!!');
CloseFile(output);
PeekNamedPipe(StdoutRd, @buffer, sizeof(buffer), nil, nil, nil);
ShowMessage(buffer);
end;
 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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