
Add(MainForm,2953706,21,105)
{
Caption="Console Out"
Position=1
link(onCreate,4153675:doStartRecv,[])
}
Add(Memo,16148154,231,119)
{
Left=5
Top=30
Width=380
Height=230
}
Add(InlineCode,4153675,147,119)
{
WorkPoints=#42:doStartRecv=Включить приём данных из STDIN|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|41:uses Windows, KOL, Share, Debug, NSPipes;|0:|4:type|33: THiAsmClass = class(TCustomPipe)|10: private|5: |12: protected|53: procedure DataReceived(Buf: TBuffer); override; |9: public|28: Data1, Data2:THI_Event;|28: onResult: THI_Event; |0:|58: procedure doStartRecv(var _Data: TData; Index: Word);|5: |24: constructor Create;|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|51: inherited Create(GetStdHandle(STD_INPUT_HANDLE));|4:end;|0:|49:procedure THiAsmClass.DataReceived(Buf: TBuffer);|5:begin|39: _hi_OnEvent(onResult, Buf.GetString);|4:end;|0:|0:|66:procedure THiAsmClass.doStartRecv(var _Data: TData; Index: Word); |5:begin|17: StartReceiving;|4:end;|0:|4:end.|
link(onResult,16148154:doAdd,[])
}
Аналогично, если поместить IC в консольную программу и запустить её из обычной командной строки. Только, поскольку чтение асинхронное, то в консольной программе надо не дать ей закрыться - с помощью Events+WaitObject:

Add(Console,2953706,56,105)
{
link(onStart,7839409:doEvent1,[])
}
Add(InlineCode,4153675,434,119)
{
WorkPoints=#42:doStartRecv=Включить приём данных из STDIN|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|41:uses Windows, KOL, Share, Debug, NSPipes;|0:|4:type|33: THiAsmClass = class(TCustomPipe)|10: private|5: |12: protected|53: procedure DataReceived(Buf: TBuffer); override; |9: public|28: Data1, Data2:THI_Event;|28: onResult: THI_Event; |0:|58: procedure doStartRecv(var _Data: TData; Index: Word);|5: |24: constructor Create;|5: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|51: inherited Create(GetStdHandle(STD_INPUT_HANDLE));|4:end;|0:|49:procedure THiAsmClass.DataReceived(Buf: TBuffer);|5:begin|39: _hi_OnEvent(onResult, Buf.GetString);|4:end;|0:|0:|66:procedure THiAsmClass.doStartRecv(var _Data: TData; Index: Word); |5:begin|17: StartReceiving;|4:end;|0:|4:end.|
link(onResult,7027989:doEvent1,[])
}
Add(LineBreakEx,7207913,-7,105)
{
Caption="write"
Type=1
link(OnEvent,2953706:doWrite,[])
}
Add(DoData,16003574,448,77)
{
Data=String(Receiving... Type 'quit' to exit.\n)
link(onEventData,6736747:doWork,[])
}
Add(Hub,11466443,371,112)
{
link(onEvent1,16003574:doData,[(412,118)(412,83)])
link(onEvent2,4153675:doStartRecv,[])
}
Add(LineBreakEx,6736747,497,77)
{
Caption="write"
}
Add(InfoTip,14734582,161,21)
{
Info=#17:Не даём программе|23:завершиться без команды|
Width=169
Height=186
}
Add(WaitObject,13558677,280,140)
{
link(ObjHandle,14477716:ObjHandle,[])
}
Add(Events,14477716,280,70)
{
Name=""
}
Add(Hub,7839409,175,105)
{
OutCount=3
link(onEvent1,14477716:doCreate,[(205,111)(205,76)])
link(onEvent2,11466443:doEvent1,[])
link(onEvent3,13558677:doWait,[(205,125)(205,146)])
}
Add(LineBreakEx,15618268,224,77)
{
Caption="exit"
Type=1
link(OnEvent,14477716:doSet,[])
}
Add(LineBreakEx,2579876,644,119)
{
Caption="write"
}
Add(If_else,2523183,553,154)
{
Op1=String(quit\r\n)
link(onTrue,7248749:doWork,[])
}
Add(LineBreakEx,7248749,609,154)
{
Caption="exit"
}
Add(Hub,7027989,490,119)
{
link(onEvent1,8640077:doStrCat,[])
link(onEvent2,2523183:doCompare,[(528,132)(528,160)])
}
Add(StrCat,8640077,574,119)
{
Str1="Out>>> "
link(onStrCat,2579876:doWork,[])
}
То же самое, только без сторонних компонентов с использованием точки Read:

Add(Console,2953706,56,105)
{
Title="Console read"
link(onStart,7839409:doEvent1,[])
}
Add(LineBreakEx,7207913,-49,105)
{
Caption="write"
Type=1
link(OnEvent,5526268:doStrCat,[])
}
Add(DoData,16003574,448,77)
{
Data=String(Receiving... Type 'quit' to exit.\n)
link(onEventData,6736747:doWork,[])
}
Add(Hub,11466443,371,112)
{
link(onEvent1,16003574:doData,[(412,118)(412,83)])
link(onEvent2,1368819:doStart,[])
}
Add(LineBreakEx,6736747,497,77)
{
Caption="write"
}
Add(InfoTip,14734582,161,21)
{
Info=#17:Не даём программе|23:завершиться без команды|
Width=169
Height=186
}
Add(WaitObject,13558677,280,140)
{
link(ObjHandle,14477716:ObjHandle,[])
}
Add(Events,14477716,280,70)
{
Name=""
}
Add(Hub,7839409,175,105)
{
OutCount=3
link(onEvent1,14477716:doCreate,[(205,111)(205,76)])
link(onEvent2,11466443:doEvent1,[])
link(onEvent3,13558677:doWait,[(205,125)(205,146)])
}
Add(LineBreakEx,15618268,224,77)
{
Caption="exit"
Type=1
link(OnEvent,14477716:doSet,[])
}
Add(LineBreakEx,2579876,1120,196)
{
Caption="write"
}
Add(StrCat,8640077,1050,196)
{
Str1="Out>>> "
link(onStrCat,2579876:doWork,[])
}
Add(Thread,1368819,679,119)
{
link(onExec,1735145:doRepeat,[])
}
Add(Repeat,1735145,791,119)
{
Op1=Integer(1)
Op2=Integer(1)
link(onRepeat,1149992:doValue,[])
}
Add(LineBreakEx,11811734,854,91)
{
Caption="read"
Type=2
}
Add(Memory,1149992,854,119)
{
Point(Data)
link(onData,4880918:doCompare,[])
link(Data,11811734:getVar,[])
}
Add(If_else,4880918,931,119)
{
Op1=String(quit)
link(onTrue,4930522:doEvent1,[])
link(onFalse,12772073:doData,[(982,132)(982,202)])
}
Add(Hub,4930522,1071,119)
{
link(onEvent1,12924904:doWork,[(1097,125)(1097,104)])
link(onEvent2,3851202:doWork,[])
}
Add(LineBreakEx,12924904,1113,98)
{
Caption="stop"
}
Add(LineBreakEx,15242824,735,126)
{
Caption="stop"
Type=1
link(OnEvent,1735145:doStop,[])
}
Add(LineBreakEx,3851202,1113,126)
{
Caption="exit"
}
Add(DoData,12772073,1001,196)
{
link(onEventData,8640077:doStrCat,[])
link(Data,1149992:Value,[(1007,174)(860,174)])
}
Add(InfoTip,7530493,651,42)
{
Info=#52:Ожидание ввода от пользователя в параллельном потоке|26:и выдача обратно в консоль|
Width=526
Height=207
}
Add(LineBreakEx,16443504,56,154)
{
Caption="read"
Type=3
link(_Data,2953706:Read,[])
}
Add(StrCat,5526268,7,105)
{
Str2="\n"
link(onStrCat,2953706:doWrite,[])
}