home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TPASCAL3.ZIP / TVDEMOS.ZIP / ASCIITAB.PAS next >
Pascal/Delphi Source File  |  1991-06-11  |  5KB  |  208 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Turbo Vision Demo                            }
  5. {   Copyright (c) 1990 by Borland International  }
  6. {                                                }
  7. {************************************************}
  8.  
  9. unit ASCIITab;
  10.  
  11. {$F+,O+,X+,S-,D-}
  12.  
  13. { Ascii table viewer. See TVDEMO.PAS for an example program
  14.  that uses this unit.
  15. }
  16.  
  17. interface
  18.  
  19. uses Objects, App, Views, Drivers;
  20.  
  21. type
  22.   PTable = ^TTable;
  23.   TTable = object(TView)
  24.     procedure Draw; virtual;
  25.     procedure HandleEvent(var Event:TEvent); virtual;
  26.   end;
  27.  
  28.   PReport = ^TReport;
  29.   TReport = object(TView)
  30.     ASCIIChar: LongInt;
  31.     constructor Load(var S: TStream);
  32.     procedure Draw; virtual;
  33.     procedure HandleEvent(var Event:TEvent); virtual;
  34.     procedure Store(var S: TStream);
  35.   end;
  36.  
  37.   PASCIIChart = ^TASCIIChart;
  38.   TASCIIChart = object(TWindow)
  39.     constructor Init;
  40.   end;
  41.  
  42. const
  43.   AsciiTableCommandBase: Word = 910;
  44.  
  45.   RTable: TStreamRec = (
  46.      ObjType: 10030;
  47.      VmtLink: Ofs(TypeOf(TTable)^);
  48.      Load:    @TTable.Load;
  49.      Store:   @TTable.Store
  50.   );
  51.   RReport: TStreamRec = (
  52.      ObjType: 10031;
  53.      VmtLink: Ofs(TypeOf(TReport)^);
  54.      Load:    @TReport.Load;
  55.      Store:   @TReport.Store
  56.   );
  57.   RASCIIChart: TStreamRec = (
  58.      ObjType: 10032;
  59.      VmtLink: Ofs(TypeOf(TASCIIChart)^);
  60.      Load:    @TASCIIChart.Load;
  61.      Store:   @TASCIIChart.Store
  62.   );
  63.  
  64. procedure RegisterASCIITab;
  65.  
  66. implementation
  67.  
  68. const
  69.   cmCharacterFocused = 0;
  70.  
  71. procedure TTable.Draw;
  72. var
  73.   Buf: TDrawBuffer;
  74.   X, Y: Integer;
  75.   Color: Byte;
  76. begin
  77.   Color := GetColor(6);
  78.   for Y := 0 to Size.Y - 1 do
  79.   begin
  80.     MoveChar(Buf, ' ', Color, Size.X);
  81.     for X := 0 to Size.X - 1 do
  82.       MoveChar(Buf[x], Chr(32 * y + x), Color, 1);
  83.     WriteLine(0, y, Size.X, 1, Buf);
  84.   end;
  85.   ShowCursor;
  86. end;
  87.  
  88. procedure TTable.HandleEvent(var Event:TEvent);
  89. var
  90.   CurrentSpot: TPoint;
  91.  
  92. procedure CharFocused;
  93. begin
  94.   Message(Owner, evBroadcast, AsciiTableCommandBase + cmCharacterFocused,
  95.     Pointer(Cursor.X + 32 * Cursor.Y));
  96. end;
  97.  
  98. begin
  99.   TView.HandleEvent(Event);
  100.   if Event.What = evMouseDown then
  101.   begin
  102.     repeat
  103.       if MouseInView(Event.Where) then
  104.       begin
  105.         MakeLocal(Event.Where, CurrentSpot);
  106.         SetCursor(CurrentSpot.X, CurrentSpot.Y);
  107.         CharFocused;
  108.       end;
  109.     until not MouseEvent(Event, evMouseMove);
  110.     ClearEvent(Event);
  111.   end
  112.   else if Event.What = evKeyDown then
  113.     with Cursor do begin
  114.       case Event.KeyCode of
  115.         kbHome: SetCursor(0,0);
  116.         kbEnd: SetCursor(Size.X - 1, Size.Y - 1);
  117.         kbUp: if Y > 0 then SetCursor(X, Y - 1);
  118.         kbDown: if Y < Size.Y - 1 then SetCursor(X, Y + 1);
  119.         kbLeft: if X > 0 then SetCursor(X - 1, Y);
  120.         kbRight: if X < Size.X - 1 then SetCursor(X + 1, Y);
  121.       else
  122.         SetCursor(ord(Event.CharCode) mod 32, ord(Event.CharCode) div 32);
  123.       end;
  124.       CharFocused;
  125.       ClearEvent(Event);
  126.     end;
  127. end;
  128.  
  129. { TReport }
  130.  
  131. constructor TReport.Load(var S: TStream);
  132. begin
  133.   TView.Load(S);
  134.   S.Read(ASCIIChar, SizeOf(ASCIIChar));
  135. end;
  136.  
  137. procedure TReport.Draw;
  138. var
  139.   Ch: LongInt;
  140.   Color: Byte;
  141.   Buf: TDrawBuffer;
  142.   TempStr: string;
  143. begin
  144.   FormatStr(TempStr, '  Char: %c Decimal: %0#%3d Hex: %0#%02x  ', ASCIIChar);
  145.   WriteStr(0, 0, TempStr, 6);
  146. end;
  147.  
  148. procedure TReport.HandleEvent(var Event: TEvent);
  149. var
  150.   Table: PTable;
  151. begin
  152.   TView.HandleEvent(Event);
  153.   if Event.What = evBroadcast then
  154.     if Event.Command = AsciiTableCommandBase + cmCharacterFocused then
  155.     begin
  156.       ASCIIChar := Event.InfoLong;
  157.       DrawView;
  158.     end;
  159. end;
  160.  
  161. procedure TReport.Store(var S: TStream);
  162. begin
  163.   TView.Store(S);
  164.   S.Write(ASCIIChar, SizeOf(ASCIIChar));
  165. end;
  166.  
  167. constructor TASCIIChart.Init;
  168. var
  169.   R: TRect;
  170.   Control: PVIew;
  171. begin
  172.   R.Assign(0, 0, 34, 12);
  173.   TWindow.Init(R, 'ASCII Chart', wnNoNumber);
  174.   Flags := Flags and not (wfGrow + wfZoom);
  175.   Palette := wpGrayWindow;
  176.  
  177.   R.Grow(-1,-1);
  178.   R.A.Y := R.B.Y - 1;
  179.   Control := New(PReport, Init(R));
  180.   with Control^ do
  181.   begin
  182.     Options := Options or ofFramed;
  183.     EventMask := EventMask or evBroadcast;
  184.   end;
  185.   Insert(Control);
  186.  
  187.   GetExtent(R);
  188.   R.Grow(-1,-1);
  189.   R.B.Y := R.B.Y - 2;
  190.   Control := New(PTable, Init(R));
  191.   with Control^ do
  192.   begin
  193.     Options := Options or ofFramed;
  194.     BlockCursor;
  195.   end;
  196.   Insert(Control);
  197.   Control^.Select;
  198. end;
  199.  
  200. procedure RegisterASCIITab;
  201. begin
  202.   RegisterType(RTable);
  203.   RegisterType(RReport);
  204.   RegisterType(RASCIIChart);
  205. end;
  206.  
  207. end.
  208.