unit Step33;
//******************************************************************/
//*               (c)                      */
//*                -, 1991, 1996                     */
//*                 -   5.x                      */
//******************************************************************/
//*                                         */
//*                                                                */
//* 1.    - WorkDocument                            */
//* 2.               - DrawView                                */
//* 3.               - DrawLayer                               */
//* 4.             - DrawGroup                               */
//* 5.      - WorkNameGroup                           */
//* 6.            - DrawLineSeg                             */
//* 7.               - DrawArc                                 */
//* 8.              - DrawLine                                */
//* 9.         - DrawCircle                              */
//* 10.             - DrawPoint                               */
//* 11. Bezier-   - DrawBezier                              */
//* 12.         - DrawHatch                               */
//* 13.             - DrawText                                */
//*                                                                */
//******************************************************************/

interface
//-------------------------------------------------------------------------------
//   
// ---
  procedure  LIBRARYENTRY( comm: WORD  ); Pascal;
  function   LIBRARYID   : Cardinal;      Pascal;

  procedure  WorkDocument;
  procedure  DrawView;
  procedure  DrawLayer;
  procedure  DrawGroup;
  procedure  WorkNameGroup;
  procedure  DrawLineSeg;
  procedure  DrawArc;
  procedure  DrawLine;
  procedure  DrawCircle;
  procedure  DrawPoint;
  procedure  DrawBezier;
  procedure  DrawHatch;
  procedure  DrawText;


implementation

  uses Windows,  Sysutils, LtDefine, LibTool, LDefin2D;

//----------------------------------------------------------------------------------------
//   
//---
function LIBRARYID : Cardinal;  pascal;
begin
  LIBRARYID := 100;
end;


//----------------------------------------------------------------------------------------
//   
//---
procedure  LIBRARYENTRY( comm : Word  );  pascal;
begin
  if comm = 1 then
    WorkDocument()  // C 
  else
    if ksGetCurrentDocument( 1 ) <> 0 then
      case comm of
        2:  DrawView();      // 
        3:  DrawLayer();     // 
        4:  DrawGroup();     // 
        5:  WorkNameGroup(); //  
        6:  DrawLineSeg();   // 
        7:  DrawArc();       // 
        8:  DrawLine();      // 
        9:  DrawCircle();    // 
        10: DrawPoint();     // 
        11: DrawBezier();    // Bezier-
        12: DrawHatch();     // 
        13: DrawText();      // 
      end; {case}
end;

//-------------------------------------------------------------------------------
//    
//---
procedure WorkDocument;
var
  pDoc      : Reference;     //   
  doc, doc1 : DocumentParam; //   
  par       : ViewParam;     //   
  number    : Integer;       //  
  buf       : String;

begin

  //    
  FillChar( doc, SizeOf(doc), 0 );
  StrCopy( doc.fileName, 'c:\1.cdw' );        //  
  StrCopy( doc.comment,  'create document' ); //   
  StrCopy( doc.author,   'user' );            //  
  doc.regim          := 0;                    //  ( 0 - , 1 -  )
  doc._type          := lt_DocSheetStandart;  //   -  
  //     (      )
  doc.stPar.format   := 3;                    //   0( 0 ) ... 4( 4 )
  doc.stPar.multiply := 1;                    //  
  doc.stPar.direct   := 0;                    //   ( 0 -   , 1 -   )
  doc.shtType        := 1;                    //        (      )
  StrCopy( doc.layoutName,'');                //    (Graphic.lyt)
  //  : ,  3,  
  //     1
  pDoc := CreateDocument( Addr(doc) );

  //    
  FillChar( par, SizeOf(par), 0 );
  par.x     := 10;                            //   
  par.y     := 20;
  par.scale := 0.5;                           //  
  par.ang   := 45;                            //   
  par.color := RGB( 10, 20, 10 );             //     
  par.state := stACTIVE;                      //  
  StrCopy(par.name, 'user view');             //  

  //      2,  0.5,   45 
  number    := 2;
  CreateSheetView( Addr(par), number );
  MessageBoxResult();
  //     5
  Layer( 5 );
  //  
  LineSeg( 20, 10, 40, 10, 1 );
  LineSeg( 40, 10, 40, 30, 1 );
  LineSeg( 40, 30, 20, 30, 1 );
  LineSeg( 20, 30, 20, 10, 1 );

  ksMessage('');

  //  
  GetObjParam( pDoc, Addr(doc1), sizeof(doc1), ALLPARAM );

  buf := Format('type=%d f=%d m=%d d=%d ,\nfileName = %s,'+ #13#10 +'comment = %s,'+ #13#10 +'author = %s', [doc1._type, doc1.stPar.format,
                 doc1.stPar.multiply, doc1.stPar.direct, doc1.fileName, doc1.comment, doc1.author] );

  ksMessage( PChar(buf) );

  // 
  SaveDocument ( pDoc, '' );
  //  
  //  CloseDocument( pDoc );

end;

//-------------------------------------------------------------------------------
//  
//---
procedure DrawView;
var
  par        : ViewParam; //   
  v, p, gr   : Reference;
  number, st : Integer;
  buf        : String;
begin

  number    := 5;
  //    
  FillChar( par, SizeOf(par), 0 );
  par.x     := 10;                //   
  par.y     := 20;
  par.scale := 0.5;               //  
  par.ang   := 45;                //   
  par.color := RGB( 10, 20, 10 ); //     
  par.state := stACTIVE;          //  
  StrCopy(par.name, 'user view'); //  

  //   , type -   ( 0 -  , 1 -  )
  gr := NewGroup( 0 );
    LineSeg( 20, 10, 20, 30, 1 );
    LineSeg( 20, 30, 40, 30, 1 );
    LineSeg( 40, 30, 40, 10, 1 );
    LineSeg( 40, 10, 20, 10, 1 );
  EndGroup(); //    

  // 
  v := CreateSheetView( Addr(par), number);
  number := GetViewNumber(  v );
  buf := Format( '  ref=%d, number=%d', [v, number] );
  ksMessage( PChar(buf) );

  //    
  AddObjGroup(gr, v);
  ksMessage('   ');
  MessageBoxResult();   //      

  p := LineSeg( 10, 10, 30, 30, 0 );
  AddObjGroup(gr, p);
  ksMessage('   ');

  //         -   
  MessageBoxResult();

  RotateObj( gr, 0, 0, -45 );

  //  
  FillChar( par, SizeOf(ViewParam), 0 );
  GetObjParam( v, Addr(par), SizeOf(ViewParam), ALLPARAM );
  buf:=Format( 'x=%4.1f y=%4.1f, angl=%4.1f name=%s st = %d', [par.x, par.y, par.ang,
                                                    par.name , par.state]);
  ksMessage( PChar(buf) );
  //   (  0 )
  OpenView( 0 );
  //    : stREADONLY -  
  st := stREADONLY;
  SetObjParam ( v, Addr(st), sizeof(st), VIEW_LAYER_STATE );
end;

//------------------------------------------------------------------------------
//  
//---
procedure DrawLayer;
var
  par, par1 : LayerParam; //  
  n, n1, st : Integer;
  lay, l    : Reference;
  buf       : String;
begin
  if  ReadInt('  ', 1, 0, 255, n ) = 0 then
    exit;
  // ,   
  lay := Layer( n );

  //    ( 20   OX, 15   OY )
  Mtr( 20, 15, 0, 1 );
    LineSeg( -10,  0,  10,  0, 1 );
    LineSeg(  10,  0,  10, 20, 1 );
    LineSeg(  10, 20, -10, 20, 1 );
    LineSeg( -10, 20, -10,  0, 1 );
  DeleteMtr(); //    

  // 
  LightObj( lay, 1 );

  //        
  n1 := GetLayerNumber( lay );   //     
  l  := GetLayerReference( n1 ); //     

  buf := Format( ' n=%d n1=%d layer=%d l=%d', [n, n1, lay, l] );
  ksMessage( PChar(buf) );

  //   
  GetObjParam( l, Addr(par), sizeof(par), ALLPARAM );
  //      
  Move( par,  par1, sizeof(par) );

  par.color := RGB( 0, 255, 0 );  //     
  par.state := stACTIVE;          //  
  StrCopy( par.name, '' ); //  

  //          
  Layer(0);
  //   
  if ( SetObjParam( l, Addr(par) , sizeof(par), ALLPARAM ) = 0 ) then
    MessageBoxResult()
  else
  begin
    //    
    GetObjParam( l, Addr(par), sizeof(par), ALLPARAM );
    buf:=Format( 'col=%d col1=%d name=%s name1=%s',  [par.color,
                                                      par1.color,
                                                      par.name,
                                                      par1.name] );
    ksMessage( PChar(buf) );
  end;
  LightObj( lay, 0 );

  //   
  st := stACTIVE ; // stCURRENT;
  SetObjParam( l, Addr(st),sizeof(st), VIEW_LAYER_STATE );

end;

//-------------------------------------------------------------------------------
//   
//---
procedure DrawGroup;
var
  p1,  p2,              //  
  gr1, gr2 : Reference; //  

begin

  p1 := LineSeg( 10, 10, 20, 10, 0 ); //  
  p2 := LineSeg( 10, 10, 10, 20, 0 ); //  

  //     1
  gr1 := NewGroup(0);
  EndGroup();

  //     2
  gr2 := NewGroup(0);
  EndGroup();

  //     
  AddObjGroup(gr1,p1);
  AddObjGroup(gr1,p2);

  //     
  AddObjGroup(gr2,p1);
  AddObjGroup(gr2,p2);

  ksMessage(' ');

  MoveObj( gr1, 10, 0 );
  ksMessage('   10 ');

  RotateObj( gr2, 20, 10, 45 );
  ksMessage('   45 ');

  RotateObj( gr2, 20, 10, -45 );
  ksMessage('   -45 ');

  MoveObj( gr1, -10, 0 );
  ksMessage('   -10 ');

  //   2 (     )
  ClearGroup(gr2);
  //   2
  DeleteObj(gr2);


  LightObj(  gr1, 1 );
  ksMessage(' gr');

  LightObj(  gr1, 0 );
  ksMessage(' gr');

  LightObj(  p1, 1 );
  ksMessage(' el');
  LightObj(  p1, 0 );
  ksMessage(' el');

  //   1(    )
  DeleteObj(gr1);
  MessageBoxResult();

end;

//-------------------------------------------------------------------------------
//     
//-------------------------------------------------------------------------------
procedure WorkNameGroup;
var
  p,  c,               //  
  gr, gr1: Reference;  //  

begin

  //      
  gr := NewGroup( 0 );
    p := LineSeg( 20, 20, 40, 20, 1 );
    LineSeg( 40, 20, 40, 40, 1 );
    LineSeg( 40, 40, 20, 40, 1 );
    LineSeg( 20, 40, 20, 20, 1 );
  EndGroup();

  //        
  //        
  //          
  //     ,    
  // - (  ).
  if ( SaveGroup(  gr, 'group1' ) = 0 ) then
    exit;

  //     
  gr1 := GetGroup( 'group1' );
  if gr1 = 0 then
    exit;

  //  
  c := Circle( 30, 30, 10, 1);
  AddObjGroup( gr1, c );

  LightObj( gr1, 1);
  ksMessage( '    ' );
  LightObj( gr1, 0);

  ExcludeObjGroup( gr1, p );

  LightObj( gr1, 1);
  ksMessage( '    ' );
  LightObj( gr1, 0);

end;

//-------------------------------------------------------------------------------
//  
//---
procedure DrawLineSeg;
var
  par : LineSegParam; //  
  p   : Reference;    //   
  t   : Integer;      //  
  buf : String;
begin

  // 
  //   
  Mtr( 30, 20, 45, 1 );
  p := LineSeg( 30, 20, //   
                60, 20, //   
                1 );    //  

  //  
  FillChar( par, SizeOf(LineSegParam), 0 );
  t := GetObjParam( p, Addr(par), sizeof(par), ALLPARAM );

  buf := Format('t=%d, x1=%4.1f y1=%4.1f x2=%4.1f y2=%4.1f tl=%d',
                [t, par.x1, par.y1 ,par.x2, par.y2 , par.style]);
  ksMessage(PChar(buf));

  //  
  par.x2    := 30;  //   
  par.y2    := 60;
  par.style :=  2;  //  

  if SetObjParam( p, Addr(par), sizeof(par), ALLPARAM ) > 0   then
    ksMessage(' ')
  else
    MessageBoxResult();

  //   
  DeleteMtr();
end;

//-------------------------------------------------------------------------------
//  
//--------------------------------------------------------------------------------
procedure DrawArc;
var
  par  : ArcParam;  //    
  par1 : ArcParam1; //    
  p    : Reference; //  
  t    : Integer;   //  
  buf  : String;
begin

  // 
  Mtr( 10, 10, 0, 1 );
  p := ArcByAngle( 30, 20,  //   
                   20,      // 
                   45, 135, //        
                   1,       //   ( +1 -   , -1 -    )
                   1 );     // C  ( 1 -  )

  //     
  t := GetObjParam( p, Addr(par), sizeof(par), ANGLE_ARC_PARAM );
  MessageBoxResult();
  buf := Format( 't=%d, xc=%4.1f yc=%4.1f rad=%4.1f a1=%4.1f a2=%4.1f napr=%d tl=%d',
                 [t, par.xc, par.yc, par.rad, par.ang1 ,par.ang2, par.dir ,
                                        par.style ]);
  ksMessage(PChar(buf));

  //    
  FillChar( par1, SizeOf(ArcParam1), '0' );

  par1.xc   := 40;   //  
  par1.yc   := 30;
  par1.rad  := 10;   // 
  par1.x1   := 50;   //   
  par1.y1   := 30;
  par1.x2   := 40;   //   
  par1.y2   := 20;
  par1.dir  := 1;    //   
  par1.style:= 2;    // C 

  if( SetObjParam( p, Addr(par1), sizeof(par1), POINT_ARC_PARAM )>0 ) then
    ksMessage(' ')
  else
    MessageBoxResult();

  DeleteMtr();
end;

//-------------------------------------------------------------------------------
//   
//---
procedure DrawLine;
var
  par : LineParam;  //  
  p   : Reference;  //  
  t   : Integer;    //  
  buf : String;
begin

  Mtr(0,0,45,1);
  //  
  p := Line( 30, 20, 0 );

  //   

  t := GetObjParam( p, Addr(par), SizeOf(par), ALLPARAM );
  buf := Format( 't=%d, x=%4.1f y=%4.1f alf=%4.1f ',[t,
                             par.x, par.y, par.ang] );
  ksMessage(PChar(buf));

  //   
  par.ang := 90;

  if( SetObjParam( p, Addr(par), SizeOf(par), ALLPARAM ) > 0  ) then
    ksMessage(' ')
  else
    MessageBoxResult();
  DeleteMtr();
end;

//-------------------------------------------------------------------------------
//  
//---
procedure DrawCircle;
var
  par : CircleParam; //  
  p   : Reference;   //  
  t   : Integer;     //  
  buf : String;
begin

  Mtr(0,0,0,2);
  // 
  p := Circle( 30, 20, 10, 1 );

  //  
  t := GetObjParam( p, Addr(par), SizeOf(par), ALLPARAM );
  buf := Format( 't=%d, xc=%4.1f yc=%4.1f rad=%4.1f tl=%d ',[t,
                             par.xc, par.yc, par.rad, par.style] );
  ksMessage(PChar(buf));

  //  
  par.rad   := 20;
  par.style := 2;
  if( SetObjParam( p, Addr(par), SizeOf(par), ALLPARAM ) > 0 ) then
    ksMessage( ' ' )
  else
    MessageBoxResult();
  DeleteMtr();
end;

//-------------------------------------------------------------------------------
//  
//---
procedure DrawPoint;
var
  par :	PointParam;  //  
  p   : Reference;   //  
  t   : Integer;     //  
  buf : String;
begin

  Mtr( 10, 10, 0, 1 );
  // 
  p := Point( 30, 40, 0 ); // 0 - 
  Point( 40,  40, 1 );     // 1 - 
  Point( 50,  40, 2 );     // 2 - -
  Point( 60,  40, 3 );     // 3 - 
  Point( 70,  40, 4 );     // 4 - 
  Point( 80,  40, 5 );     // 5 - 
  Point( 90,  40, 6 );     // 6 - 
  Point( 100, 40, 7 );     // 7 -  

  //  
  t := GetObjParam( p, Addr(par), SizeOf(par), ALLPARAM );
  buf := Format( ' t=%d, x=%4.1f y=%4.1f style=%d ',[t,
         	 par.x, par.y, par.style] );
  ksMessage(PChar(buf));

	//  
  par.x     := 20;
  par.y     := 30;
  par.style := 7;

  if( SetObjParam( p, Addr(par), SizeOf(par), ALLPARAM ) > 0 ) then
    ksMessage( ' ')
  else
    MessageBoxResult();
  DeleteMtr();

end;

//-------------------------------------------------------------------------------
//  Bezier 
//---
procedure DrawBezier;
type
  Double6 = array [0..5] of Double; //   6 
var
  pPar : MathPointParam;            //   ()
  par  : BezierParam;               //  Bezier 
  p    : Reference;                 //  
  t, i : Integer;
  count: Integer;                   //  
  x,  y: Double6;                   //    
  buf  : String;

begin

  x[0] := 0; x[1] := 20; x[2] := 50; x[3] := 70; x[4] := 100; x[5] :=  50;
  y[0] := 0; y[1] := 20; y[2] := 10; y[3] := 20; y[4] := 0;   y[5] := -50;

  // Bezier 
  Bezier( 0, 1 );
  for  i:=0 to 4 do
    Point( x[i], y[i],0 );
  p := EndObj();

  //  Bezier 
  par.pMathPoint := CreateArray( POINT_ARR, nil );         //   
  t := GetObjParam( p, Addr(par), sizeof(par), ALLPARAM ); //   
  count := GetArrayCount( par.pMathPoint );                //  
  buf :=Format( ' t=%d, count=%d close=%d tl=%d ',[t,
                 count, par.closed, par.style] );
  ksMessage(PChar(buf));
  for i:=0 to count-1 do
  begin
    GetArrayItem( par.pMathPoint, //   
		              i,              //   
		              Addr(pPar),     //    
		              SizeOf(pPar) ); //   

    buf:=Format ( 'x[%d]=%4.1f y[%d]=%4.1f',
                  [i, pPar.x, i, pPar.y] );
    ksMessage(PChar(buf));
  end;


  //  Bezier 
  ClearArray( par.pMathPoint );   //   
  //  
  for i:=0 to 5 do
  begin
    pPar.x := x[i];
    pPar.y := y[i];
    AddArrayItem( par.pMathPoint, //   
 	                -1,             //    -  
 		              Addr(pPar),     //    
		              SizeOf(pPar) ); //   
  end;

  par.style  := 2;                //   
  par.closed := 1;                //  Bezier 

  //   
  if( SetObjParam( p, Addr(par), sizeof(par), ALLPARAM ) >0 ) then
    ksMessage(' ')
  else
    MessageBoxResult();
  DeleteArray( par.pMathPoint );  //   

end;

//-------------------------------------------------------------------------------
//  
//---
procedure DrawHatch;
var
  par  : HatchParam; //  
  p    : Reference;  //  
  t    : Integer;    // 
  buf  : String;
begin

  Mtr(30,20,0,0.5);

  //  
  LineSeg ( 20, 30, 70, 30, 2 );
  LineSeg ( 70, 30, 70, 80, 2 );
  LineSeg ( 70, 80, 20, 80, 2 );
  LineSeg ( 20, 80, 20, 30, 2 );

  // 
  if ( Hatch( 0, 45, 2, 0, 0, 0 ) > 0 ) then
  begin
    LineSeg ( 20, 30, 70, 30, 2 );
    LineSeg ( 70, 30, 70, 80, 2 );
    LineSeg ( 70, 80, 20, 80, 2 );
    LineSeg ( 20, 80, 20, 30, 2 );
    p := EndObj();

    //  
    t := GetObjParam( p, Addr(par), sizeof(par), ALLPARAM );
    buf := Format(' t=%d, tip=%d angl=%4.1f shag=%4.1f width=%4.1f x0=%4.1f y0=%4.1f ',
              [t, par.style, par.ang, par.step, par.width, par.x, par.y ]);
    ksMessage(PChar(buf));
    DeleteMtr();

    Mtr( 0, 0, 0, 2 );

    //  
    par.x := 0.8;

    if( SetObjParam( p, Addr(par), sizeof(par), ALLPARAM )>0 )then
      ksMessage(' ')
    else
      MessageBoxResult();

    DeleteMtr();
  end
  else
    MessageBoxResult;
end;

//------------------------------------------------------------------------------
// 
//---
procedure DrawText;
var
  par1  : TextParam;             //  
  par2  : TextLineParam;         //  
  par3  : TextItemParam;         //   
  par   : ParagraphParam;        //  
  p     : Reference;             //   
  j,
  symbol: Integer;               //  
  ch    : Cardinal;
  s     : Array [0..10] of Char;
  buf   : String;

  //----------------------------------------------------------------------------
  //    
  procedure PrintPar1;
  var
    j, count   : integer;
  begin
    buf := Format('style=%d',  [par2.style] );
    ksMessage(PChar(buf));
    count := GetArrayCount( par2.pTextItem );
    for j:=0 to count-1 do
    begin
      GetArrayItem( par2.pTextItem, j, Addr(par3), SizeOf(TextItemParam));
      buf := Format('j=%d h=%5.1f  s=%s fontName=%s ', [j,par3.font.height,par3.s,
                                                       par3.font.fontName]);
      ksMessage(PChar(buf));
    end;
  end;

  //----------------------------------------------------------------------------
  //   
  procedure PrintPar;
  var
    i,count : integer;
  begin
    buf := Format( 'hFormat=%d vFormat=%d h=%4.1f w=%4.1f\n x=%4.1f y=%4.1f ang=%4.1f ', [par1.par.hFormat,
       par1.par.vFormat, par1.par.height, par1.par.width,par1.par.x,par1.par.y,par1.par.ang] );

    ksMessage(PChar(buf));
    count := GetArrayCount(par1.pTextLine);
    for  i:=0 to count-1 do
    begin
      GetArrayItem( par1.pTextLine , i, Addr(par2), sizeof(TextLineParam) );
      PrintPar1;
    end;
    MessageBoxResult();
  end;

begin

  par.style   := 0;       //    (0 -    )
  par.x       := 30;      //    
  par.y       := 30;
  par.ang     := 0;       //   
  par.hFormat := 0;       //    ( 0 -  ,
                          // 1 -  , 2 -     )
  par.vFormat := 0;       //    ( 0 -  ,
                          // 1-   )
  par.height  := 25;      //   
  par.width   := 20;      //   
  Paragraph( Addr(par) ); // 

    //   
    //  ,   
    TextLine( ITALIC_OFF, 0, nil, '' );
    //   
    //    
    TextLine( NEW_LINE,  //  ,   
              0,         //  
              nil,       //    
              '' ); // 
    // , ,    1.5    
    j := 2;  //   FRACTION_TYPE

    TextLine( NUMERATOR, FRACTION_TYPE, Addr(j), '111' );
    // , 
    TextLine( DENOMINATOR or BOLD_ON, 0, nil, '222' );
    //  ,  ,      
    TextLine( END_FRACTION or BOLD_OFF or ITALIC_OFF, 0, nil, '333' );

    //   ,    
    TextLine( NEW_LINE, 0, nil, '   ' );
    // , 
    TextLine( NUMERATOR or ITALIC_ON, 0, nil, '111 ' );
    //    
    TextLine( S_BASE, 0, nil, '222' );
    //  
    TextLine( S_UPPER_INDEX, 0, nil, '' );
    //  
    TextLine( S_LOWER_INDEX, 0, nil, '' );
    //  
    TextLine( S_END, 0, nil, ' 333' );
    // , 
    TextLine( DENOMINATOR, 0, nil, '444' );
    //  ,  ,      
    TextLine( END_FRACTION or BOLD_OFF or ITALIC_OFF, 0, nil, ' 555' );

    //   
    TextLine( NEW_LINE, 0, nil, ' ' );
    symbol := 65; //   - 
    // 
    TextLine( SPECIAL_SYMBOL, SPECIAL, @symbol, '' );
    //      
    TextLine( SPECIAL_SYMBOL_END, 0, nil, ' 111' );

    //      
    TextLine( NEW_LINE, 0, nil, ' Arial ' );
    ch := 64; //     - @
    StrCopy (s, 'Arial');
    //    Arial
    TextLine( FONT_SYMBOL, FONT_NAME, Addr(s), PChar(ch) );

  //     EndObj,     
  p := EndObj;

  //   
  GetObjParam( p, Addr(par1), SizeOf(par1), ALLPARAM  );
//  PrintPar();

  //         :
  par1.pTextLine := CreateArray( TEXT_LINE_ARR, nil );  //   
  par2.pTextItem := CreateArray( TEXT_ITEM_ARR, nil );  //    

  //  1 -  (  0 )
  GetObjParam( p, Addr(par2), SizeOf(par2), 0 );

  PrintPar1();

  if( YesNo( '   ?' ) = 1 ) then
  begin
    //     ITALIC  BOLD   
    //      
    GetArrayItem( par2.pTextItem, 0, Addr(par3), sizeof(TextItemParam));
    //    
    par3.font.bitVector := par3.font.bitVector or ITALIC_OFF or BOLD_OFF;
    //   
    par3.font.color := RGB( 255,0,0 );
    //   
    SetArrayItem( par2.pTextItem, 0, Addr(par3), sizeof(TextItemParam));
    //     
    SetObjParam( p, Addr(par2), sizeof(par2), 0 );
    //  1 -  (  0 )   
    GetObjParam( p, Addr(par2), sizeof(par2), 0 );
    PrintPar1();
  end;

end;

end.
