208 lines
4.6 KiB
Plaintext
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.
|