Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перенаправление Write[Ln] в Memo


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

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

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

Автор: Rouse_ 2.5.2006, 09:51
Код

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

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

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

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

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

P.S. Админ почему-то решил, что эта тема больше подходит "для общих вопросов" и переместил его сюда, хотя изначально я имел в виду именно вариант работы  с пайпами или нечто подобное.
 

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

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

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

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

Автор: icm 2.5.2006, 16:11
Цитата(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 сразу же появлялся в Мемо во время выполнения программы

Если есть предложения, как это можно сделать, с радостью выслушаю. 

Автор: Snowy 2.5.2006, 16:30
Лень. Это нужно создавать консоль, получать ее хэндл, создавать тред, который будет в консоль писать, а из своего треда из нее читать...
Многа возни. Времени на это нет. 

Автор: Girder 3.5.2006, 10:54
Цитата(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 Найти цитируемый пост)
Может кто-нибудь подскажет вариант с пайпами?
Много раз обсуждалось и приводились решения...
   

Автор: icm 3.5.2006, 12:25
Цитата(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:
Я понимаю, лень и всё такое... но я же не прошу привести мне полностью рабочий код, хотя бы его ключевые моменты. 

Автор: 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) в пайп ничего не напишется.
Код

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;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)