i21sys/Mod/InПримеры.odc

MODULE  i21sysInПримеры; (* info21 2006-03-01; last modification 2010-04-01 *)
	IMPORT  In := i21sysIn,  Log := StdLog;
	
	PROCEDURE Do*;
		VAR  x: REAL;  n: INTEGER;  s: ARRAY 1000 OF CHAR;
	BEGIN
		In.OpenCommander; 	ASSERT( In.done );  Log.Ln;
		In.Real( x );	ASSERT( In.done );  Log.Real( x );
		In.Int( n ); 	ASSERT( In.done );  Log.Int( n );
		In.String( s ); 	ASSERT( In.done );  Log.String( s );
		Log.Ln
	END Do;
	
	PROCEDURE Do2* ( m: INTEGER );
		VAR  x: REAL;  n: INTEGER;  s: ARRAY 1000 OF CHAR;
	BEGIN
		Log.Ln;
		Log.Int( m );
		In.OpenCommander;	ASSERT( In.done );
		In.Real( x );	ASSERT( In.done );  Log.Real( x );
		In.Int( n );	ASSERT( In.done );  Log.Int( n );
		In.String( s ); 	ASSERT( In.done );  Log.String( s );
		Log.Ln
	END Do2;
	
	PROCEDURE Do3*;
		VAR  x: REAL;  n: INTEGER;  s: ARRAY 1000 OF CHAR;
	BEGIN
		Log.Ln;
		Log.String('input from selection');  Log.Ln;
		In.OpenSelection;	ASSERT( In.done );
		In.Real( x );	ASSERT( In.done );  Log.Real( x );
		In.Int( n );	ASSERT( In.done );  Log.Int( n );
		In.String( s ); 	ASSERT( In.done );  Log.String( s );
		Log.Ln
	END Do3;
	
	PROCEDURE DoRu*;
		VAR  s: ARRAY 1000 OF CHAR;
	BEGIN
		In.Open; 	ASSERT( In.done );  Log.Ln;
		In.String( s );	ASSERT( In.done );  Log.String( s );
		Log.Ln
	END DoRu;
	
	PROCEDURE Copy2; (* копируем два числа из уже открытого потока ввода в Рабочий журнал *)
		VAR  n: INTEGER;
	BEGIN
		ASSERT( In.done );
		In.Int( n );  ASSERT( In.done );  Log.Int( n );
		In.Int( n );  ASSERT( In.done );  Log.Int( n );
		Log.Ln;
	END Copy2;
	
	PROCEDURE TestRestart*;
	BEGIN
		In.Restart;  ASSERT( In.done );
		Copy2;
		In.Restart;  ASSERT( In.done );
		Copy2;
	END TestRestart;

	PROCEDURE TestRestart2*;
		VAR  n: INTEGER;
	BEGIN
		In.Restart;  ASSERT( In.done );
		Copy2;
		In.OpenCommander;  ASSERT( In.done );
		Copy2;
		In.Restart;  ASSERT( In.done );
		Copy2;
	END TestRestart2;

	PROCEDURE TestOpen*;
	BEGIN
		In.Open;  ASSERT( In.done );
		Copy2;
	END TestOpen;

END  i21sysInПримеры.

Общие замечания см. здесь, а полное описание возможностей модуля i21sysIn  в документации. 

Примеры использования средств модуля i21sysIn

Ввод данних из текста, следующего за коммандером:

простейший пример ввода данных:
i21sysInПримеры.Do 3.14 137 " цепочка литер"

пример ввода данных с одновременной передачей параметра:
"i21sysInПримеры.Do2(88)" 3.14 137 " цепочка литер"

два вызова подряд читают один и тот же поток данных:
"i21sysInПримеры.Do2(1);i21sysInПримеры.Do2(2)" 3.14 137 " цепочка литер"

Ввод данних из фрагмента, выделенного мышкой:, 

Выделить мышкой следующие данные и кликнуть по коммандеру:
2.14 2345 " другая цепочка"
i21sysInПримеры.Do3

Можно поменять данные или значения параметров и снова покликать.

Примеры работы с потоком данных, определяемым отдельно

Выделить мышкой два числа  14 13 (эти числа могут находиться и в другом текстовом окне)
и нажать Shift+F1 (предполагается, что на эту горячую клавишу "посажена" команда i21sysIn.OpenSelection).

Затем кликнуть по этому коммандеру:
i21sysInПримеры.TestRestart 5 6
должно напечататься:
 14 13
 14 13
потому что процедура TestRestart игнорирует текст после коммандера, но зато использует уже открытый поток данных, где бы они ни находились (т.е. не вызывает i21sysIn.OpenCommander, а только i21sysIn.Restart).

Затем кликнуть по 
i21sysInПримеры.TestRestart2 5 6
должно напечататься
14 13
 5 6
 5 6
Это эффект переопределения входного потока из-за вызова OpenCommander в процедуре TestRestart2, так что второй и третий проход чтения идут по данным, стоящим после коммандера.

Команда Open

Эта команда имеет чуть более сложную логику и удобна в задачах, где есть несколько входных потоков  основной и вспомогательные (например, тестовые). 
В этом случае после коммандера ставятся основной набор данных, а где-нибудь отдельно создаются вспомогательные. 
При вызове с основными данными достаточно обеспечить, чтобы при клике по коммандеру не было выделенного фрагмента. Если же нужно вызвать команду с тестовыми данными, то достаточно выделить их мышкой перед кликом по тому же коммандеру.

Например, если кликнуть по следующему коммандеру, предварительно выделив мышкой числа 14 13, 
i21sysInПримеры.TestOpen 5 6
то в Рабочем журнале будут напечатаны не числа 5 6, а 14 13.
Если же снять выделение (кликнув в любое место текста) и кликнуть по тому же коммандеру, то напечатаются 5 6.