i21прим/Mod/TPGraphics.odc

MODULE  i21примTPGraphics; 
(* 2014 ФВТ обновление.
	2003 ФВТ для проекта Информатика-21; предложение Л.Г.Куркиной и А.И.Попкова. 
	Коммандеры для вызова процедур  в конце этого документа. *)

	IMPORT  Gr := i21eduTPGraphics,  Ports,  In := i21sysIn,  Log := StdLog;
	
	PROCEDURE Do*;
		VAR  i, j: INTEGER;
	BEGIN
		Gr.SetBkColor( 5 );  (* Цифровые коды для цветов сделаны только для облегчения переноса готовых примеров с ТП. Для новых программ можно использовать прямые присваивания вроде: *)

		Gr.color := Gr.white;  (* вместо Gr.SetColor( 15 ) *)
		(* или *)
		Gr.color := Ports.RGBColor( 255, 255, 255 ); (* смесь красного, зеленого и синего, от 0 до 255 каждый *)
		
		Gr.Line( 25, 77, 100, 200 );

		Gr.SetColor( 10 );
		Gr.Rectangle( 250, 250, 400, 400 );

		Gr.SetColor( 7 );
		Gr.Bar( 200, 300, 600, 700 );

		Gr.MoveTo( 600, 50 );
		Gr.LineTo( 500, 5 );
		Gr.SetColor( 12 );
		Gr.LineTo( 0, 500 );
		Gr.SetColor( 13 );
		Gr.LineTo( 500, 300 );

		Gr.SetColor( 9 );
		Gr.Circle( 400, 400, 100 );

		Gr.color := Gr.white;
		FOR  j := 0  TO  30  DO
			FOR  i := 0  TO  100  BY  3  DO
				Gr.PutPixel( 200 + i + j, 10 + j )
			END;
		END;

		Gr.SetFillColor( 4 );
		Gr.FillEllipse( 200, 200, 50, 70 );

		Gr.color := Ports.red;
		Gr.Arc( 200, 210, -45, 90, 60 );
		Gr.color := Ports.RGBColor( 255, 255, 0 ); (* желтый *)
		Gr.Ellipse( 300, 310, -180, 150, 160, 260 );
		
		Gr.color := Gr.white;
		Gr.SetFont( "Verdana", 18, FALSE, TRUE );
		Gr.String( 100, 100, "Привет любителям программирования!" );

		Gr.color := Gr.yellow;
		Gr.SetFont( "Arial", 30, TRUE, FALSE );
		Gr.String( 100, 250, "Привет любителям программирования!" );
	END Do;
	
	PROCEDURE Добавить*;
		VAR  x, y, rad: INTEGER;
	BEGIN
		In.Open;
		In.Int( x );
		WHILE  In.Done  DO
			In.Int( y );  ASSERT( In.Done );
			In.Int( rad );  ASSERT( In.Done & ( rad > 0 ) );
			Gr.Circle( x, y, rad );
			In.Int( x )
		END;
	END Добавить;
	
(*
	PROCEDURE Ещё*;
		VAR  x, y: INTEGER;
	BEGIN
		x := 300;  y := 300;
		Gr.SetColor(4);
		Gr.Circle( x, y, 100 );
		Gr.Circle( x, y, 101 );
		Gr.Circle( x, y, 102 );

		Gr.Circle( x, y, 105 );
		Gr.Circle( x, y, 106 );
		Gr.Circle( x, y, 107 );
	END Ещё;
*)
END  i21примTPGraphics.

Чтобы открыть окошко, где рисуется картинка, кликнуть здесь:
"i21eduTPGraphics.Open;i21sysWindows.AlignTopRight"
Можно в любой момент закрыть картинку, и через какое-то время снова ее открыть.
Все, что было добавлено в картинку, пока она была закрыта, будет правильно показано во вновь открытой картинке.
Эту команду можно вставить и в свою программу.

Следующая команда добавляет в картинку сразу много элементов, как прописано в процедуре Do:
i21примTPGraphics.Do

Можно создать сколько угодно новых процедур в этом модуле, которые будут дорисовывать что-нибудь в картинку, и вызывать их(картинкой "владеет" другой модуль, который помнит, что в ней было нарисовано, и ему всё равно, какие модули вызывают его процедуры для дорисовывания в картинку).
Например, можно убрать комментарии вокруг процедуры Ещё (она стоит в конце модуля и покрашена красным), скомпилировать (Ctrl+K) и, прижав Ctrl, кликнуть по коммандеру:
i21примTPGraphics.Ещё

Или просто менять Do в этом модуле (только для вызова обновленной процедуры не забывать нажимать Ctrl при клике по коммандеру).

Можно добавлять элементы в картинку и так:
"i21eduTPGraphics.SetColor(1);i21примTPGraphics.Добавить"
0 0 40
20 20 40
40 40 40
60 60 40
80 80 40
60 60 40


Можно порисовать и так:
"i21eduTPGraphics.LineTo(70,30)"
"i21eduTPGraphics.LineTo(70,300)"
"i21eduTPGraphics.LineTo(100,200)"
Однако с помощью коммандеров можно вызывать далеко не все команды рисования-- но их всегда можно упаковать в новые процедуры, которые и будут вызываться.

Очистить картинку:
i21eduTPGraphics.Clear