home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 11.ddi / WDOCDEMO.ZIP / DRAWLINE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-10-27  |  2.8 KB  |  130 lines

  1. {************************************************}
  2. {                                                }
  3. {   ObjectWindows Demo                           }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. unit DrawLine;
  9.  
  10. {$R-} { Turn off range check because Windows message parameters
  11.         don't distinguish between Integer and Word. }
  12.  
  13. interface
  14.  
  15. uses WinTypes, Objects, OWindows, Pen;
  16.  
  17. type
  18.   PLinePoint = ^TLinePoint;
  19.   TLinePoint = object(TObject)
  20.     X, Y: Integer;
  21.     constructor Init(AX, AY: Integer);
  22.     constructor Load(var S: TStream);
  23.     procedure Store(var S: TStream);
  24.   end;
  25.  
  26.   PLine = ^TLine;
  27.   TLine = object(TObject)
  28.     Points: PCollection;
  29.     LinePen: PPen;
  30.     constructor Init(APen: PPen);
  31.     constructor Load(var S: TStream);
  32.     destructor Done; virtual;
  33.     procedure AddPoint(AX, AY: Word);
  34.     procedure Draw(ADC: HDC);
  35.     procedure Store(var S: TStream);
  36.   end;
  37.  
  38. const
  39.   RLinePoint: TStreamRec = (
  40.     ObjType: 200;
  41.     VmtLink: Ofs(TypeOf(TLinePoint)^);
  42.     Load: @TLinePoint.Load;
  43.     Store: @TLinePoint.Store);
  44.  
  45.   RLine: TStreamRec = (
  46.     ObjType: 201;
  47.     VmtLink: Ofs(TypeOf(TLine)^);
  48.     Load: @TLine.Load;
  49.     Store: @TLine.Store);
  50.  
  51. Implementation
  52.  
  53. uses WinProcs;
  54.  
  55. {--------------------------------------------------}
  56. { TDPoints's method implementations:               }
  57. {--------------------------------------------------}
  58.  
  59. constructor TLinePoint.Init(AX, AY: Integer);
  60. begin
  61.   X := AX;
  62.   Y := AY;
  63. end;
  64.  
  65. constructor TLinePoint.Load(var S: TStream);
  66. begin
  67.   S.Read(X, SizeOf(X));
  68.   S.Read(Y, SizeOf(Y));
  69. end;
  70.  
  71. procedure TLinePoint.Store(var S: TStream);
  72. begin
  73.   S.Write(X, SizeOf(X));
  74.   S.Write(Y, SizeOf(Y));
  75. end;
  76.  
  77. constructor TLine.Init(APen: PPen);
  78. begin
  79.   inherited Init;
  80.   Points := New(PCollection, Init(50,50));
  81.   LinePen := New(PPen, Init(APen^.Style, APen^.Width, APen^.Color));
  82. end;
  83.  
  84. constructor TLine.Load(var S: TStream);
  85. begin
  86.   Points := PCollection(S.Get);
  87.   LinePen := PPen(S.Get);
  88. end;
  89.  
  90. destructor TLine.Done;
  91. begin
  92.   Dispose(LinePen, Done);
  93.   Dispose(Points, Done);
  94.   inherited Done;
  95. end;
  96.  
  97. procedure TLine.AddPoint(AX, AY: Word);
  98. begin
  99.   Points^.Insert(New(PLinePoint, Init(AX, AY)));
  100. end;
  101.  
  102. procedure TLine.Draw(ADC: HDC);
  103. var
  104.   First: Boolean;
  105.  
  106.   procedure DrawTheLine(P: PLinePoint); far;
  107.   begin
  108.     if First then MoveTo(ADC, P^.X, P^.Y)
  109.     else LineTo(ADC, P^.X, P^.Y);
  110.     First := False;
  111.   end;
  112.  
  113. begin
  114.   First := True;
  115.   LinePen^.Select(ADC);
  116.   Points^.ForEach(@DrawTheLine);
  117.   LinePen^.Delete;
  118. end;
  119.  
  120. procedure TLine.Store(var S: TStream);
  121. begin
  122.   S.Put(Points);
  123.   S.Put(LinePen);
  124. end;
  125.  
  126. begin
  127.   RegisterType(RLinePoint);
  128.   RegisterType(RLine);
  129. end.
  130.