dos_compilers/Borland Turbo Pascal v6/TVDEMOS/ASCIITAB.PAS
2024-07-02 07:11:05 -07:00

208 lines
4.6 KiB
Plaintext

{************************************************}
{ }
{ Turbo Pascal 6.0 }
{ Turbo Vision Demo }
{ Copyright (c) 1990 by Borland International }
{ }
{************************************************}
unit ASCIITab;
{$F+,O+,X+,S-,D-}
{ Ascii table viewer. See TVDEMO.PAS for an example program
that uses this unit.
}
interface
uses Objects, App, Views, Drivers;
type
PTable = ^TTable;
TTable = object(TView)
procedure Draw; virtual;
procedure HandleEvent(var Event:TEvent); virtual;
end;
PReport = ^TReport;
TReport = object(TView)
ASCIIChar: LongInt;
constructor Load(var S: TStream);
procedure Draw; virtual;
procedure HandleEvent(var Event:TEvent); virtual;
procedure Store(var S: TStream);
end;
PASCIIChart = ^TASCIIChart;
TASCIIChart = object(TWindow)
constructor Init;
end;
const
AsciiTableCommandBase: Word = 910;
RTable: TStreamRec = (
ObjType: 10030;
VmtLink: Ofs(TypeOf(TTable)^);
Load: @TTable.Load;
Store: @TTable.Store
);
RReport: TStreamRec = (
ObjType: 10031;
VmtLink: Ofs(TypeOf(TReport)^);
Load: @TReport.Load;
Store: @TReport.Store
);
RASCIIChart: TStreamRec = (
ObjType: 10032;
VmtLink: Ofs(TypeOf(TASCIIChart)^);
Load: @TASCIIChart.Load;
Store: @TASCIIChart.Store
);
procedure RegisterASCIITab;
implementation
const
cmCharacterFocused = 0;
procedure TTable.Draw;
var
Buf: TDrawBuffer;
X, Y: Integer;
Color: Byte;
begin
Color := GetColor(6);
for Y := 0 to Size.Y - 1 do
begin
MoveChar(Buf, ' ', Color, Size.X);
for X := 0 to Size.X - 1 do
MoveChar(Buf[x], Chr(32 * y + x), Color, 1);
WriteLine(0, y, Size.X, 1, Buf);
end;
ShowCursor;
end;
procedure TTable.HandleEvent(var Event:TEvent);
var
CurrentSpot: TPoint;
procedure CharFocused;
begin
Message(Owner, evBroadcast, AsciiTableCommandBase + cmCharacterFocused,
Pointer(Cursor.X + 32 * Cursor.Y));
end;
begin
TView.HandleEvent(Event);
if Event.What = evMouseDown then
begin
repeat
if MouseInView(Event.Where) then
begin
MakeLocal(Event.Where, CurrentSpot);
SetCursor(CurrentSpot.X, CurrentSpot.Y);
CharFocused;
end;
until not MouseEvent(Event, evMouseMove);
ClearEvent(Event);
end
else if Event.What = evKeyDown then
with Cursor do begin
case Event.KeyCode of
kbHome: SetCursor(0,0);
kbEnd: SetCursor(Size.X - 1, Size.Y - 1);
kbUp: if Y > 0 then SetCursor(X, Y - 1);
kbDown: if Y < Size.Y - 1 then SetCursor(X, Y + 1);
kbLeft: if X > 0 then SetCursor(X - 1, Y);
kbRight: if X < Size.X - 1 then SetCursor(X + 1, Y);
else
SetCursor(ord(Event.CharCode) mod 32, ord(Event.CharCode) div 32);
end;
CharFocused;
ClearEvent(Event);
end;
end;
{ TReport }
constructor TReport.Load(var S: TStream);
begin
TView.Load(S);
S.Read(ASCIIChar, SizeOf(ASCIIChar));
end;
procedure TReport.Draw;
var
Ch: LongInt;
Color: Byte;
Buf: TDrawBuffer;
TempStr: string;
begin
FormatStr(TempStr, ' Char: %c Decimal: %0#%3d Hex: %0#%02x ', ASCIIChar);
WriteStr(0, 0, TempStr, 6);
end;
procedure TReport.HandleEvent(var Event: TEvent);
var
Table: PTable;
begin
TView.HandleEvent(Event);
if Event.What = evBroadcast then
if Event.Command = AsciiTableCommandBase + cmCharacterFocused then
begin
ASCIIChar := Event.InfoLong;
DrawView;
end;
end;
procedure TReport.Store(var S: TStream);
begin
TView.Store(S);
S.Write(ASCIIChar, SizeOf(ASCIIChar));
end;
constructor TASCIIChart.Init;
var
R: TRect;
Control: PVIew;
begin
R.Assign(0, 0, 34, 12);
TWindow.Init(R, 'ASCII Chart', wnNoNumber);
Flags := Flags and not (wfGrow + wfZoom);
Palette := wpGrayWindow;
R.Grow(-1,-1);
R.A.Y := R.B.Y - 1;
Control := New(PReport, Init(R));
with Control^ do
begin
Options := Options or ofFramed;
EventMask := EventMask or evBroadcast;
end;
Insert(Control);
GetExtent(R);
R.Grow(-1,-1);
R.B.Y := R.B.Y - 2;
Control := New(PTable, Init(R));
with Control^ do
begin
Options := Options or ofFramed;
BlockCursor;
end;
Insert(Control);
Control^.Select;
end;
procedure RegisterASCIITab;
begin
RegisterType(RTable);
RegisterType(RReport);
RegisterType(RASCIIChart);
end;
end.