home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
hamradio
/
kam401.arc
/
KAM-LOG.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-03-02
|
14KB
|
450 lines
TYPE
ROUTELIST = RECORD
Deleted : boolean;
name : string[10];
routing : string[30];
comment : string[30];
END;
TYPE
HAMLOG_record = RECORD
Deleted : Boolean;
_CALLSIGN : String[ 9];
_NAME : String[10];
_DATE : String[10]; { Date field }
_TIME : String[ 5];
_FREQ : Real; { width= 10 decimals= 5 }
_POWER : LongInt; { width= 4 }
_MODE : String[ 3];
_RST_OUT : String[ 3];
_RST_IN : String[ 3];
_COMMENT : String[30];
_QSL_SENT : String[10]; { Date field }
_QSL_RCVD : String[10]; { Date field }
END;
IndxTyp = (CALLSIGN,DATETIME);
VAR
HAMLOG : HAMLOG_record;
CallList : ROUTELIST;
m_CALLSIGN : String;
FilterValue : String;
m_Found : Boolean;
Choice : Char;
AddMode : Boolean;
EditMode : Boolean;
MRecNo : LongInt;
IndexOn : IndxTyp;
PROCEDURE SayGetColors;
begin
Set_Color_To(14,1,4,7);
Set_Highlight_To(7,4);
end;
PROCEDURE HelpScreen;
{ Displays a list of menu commands when <F1> or "H" is pressed }
VAR ScreenBuffer : Array[1..2000] OF Word;
BEGIN
FillPage(@ScreenBuffer); { save contents of current screen }
Window(5,4,75,23);
Set_Color_To(Black,LightGray,Black,LightGray);
ClrScr;
WriteLn(' Menu Commands');
WriteLn;
WriteLn(' N - Next Skips to and displays next record in file');
WriteLn(' P - Prev Skips back one and displays prior record');
WriteLn(' T - Top Displays first record in file');
WriteLn(' O - Bottom Displays last record in file');
WriteLn(' G - Go Positions database on selected record by number');
WriteLn(' F - Find Finds the first record with matching key field');
WriteLn(' E - Edit Allows modification of currently displayed record');
WriteLn(' A - Add Allows input and appends a new record into database');
WriteLn(' D - Delete Marks or unmarks current record for deletion by Pack');
WriteLn(' B - Browse Spreadsheet-like view of database');
WriteLn(' C - Pack Purges database of all records marked for deletion');
WriteLn(' I - Index Toggle CALLSIGN Index On/Off');
WriteLn(' Q - Quit Quit viewing of database');
WriteLn;
Wait(' Press any key to return...');
full_window;
DisplayPage(@ScreenBuffer); { restore prior screen }
SayGetColors;
END; { HelpScreen }
{$F+} PROCEDURE EditHelp; { called by SAYGET4.TPU }
{ Displays a help screen when <F1> is pressed while editing }
VAR ScreenBuffer : Array[1..2000] OF Word;
BEGIN
FillPage(@ScreenBuffer); { save contents of current screen }
Set_Color_To(Black,LightGray,Black,LightGray);
Window(5,3,75,23);
ClrScr;
WriteLn(' Editing Commands');
WriteLn;
WriteLn(' <Ctrl-R> or <PgUp> Move to beginning of first field');
WriteLn(' <Ctrl-C> Move to beginning of last field');
WriteLn(' <Ctrl-E> or <Up Arrow> Move to beginning of prior field');
WriteLn(' <Ctrl-X> or <Dn Arrow> Move to beginning of next field');
WriteLn(' <Ctrl-V> or <Ins> Toggle insert/overwrite mode');
WriteLn(' <Ctrl-G> or <Del> Delete character at cursor');
WriteLn(' <Ctrl-T> Delete word to right of cursor ');
WriteLn(' <Ctrl-Y> Delete all characters to right of cursor');
WriteLn(' <Ctrl-U> Restore prior data (Undo)');
WriteLn(' <Ctrl-S> or <Lft Arrow> Move cursor left one character');
WriteLn(' <Ctrl-D> or <Rt Arrow> Move cursor right one character');
WriteLn(' <Ctrl-W> or <PgDn> Exit edit session');
WriteLn(' <Esc> Abandon edit');
WriteLn(' <Home> Move cursor to first character in field');
WriteLn(' <End> Move cursor to last charcter in field');
WriteLn;
Wait(' Press any key to return...');
full_window;
DisplayPage(@ScreenBuffer); { restore prior screen }
SayGetColors;
END; { EditHelp }
{$F-}
{$F+}
FUNCTION CallKey : String; { called by INDEX4.TPU }
BEGIN
CallKey := Upper(HAMLOG._CALLSIGN);
END; { CallKey }
FUNCTION DateTimeKey : String;
BEGIN
WITH HAMLOG do
DateTimeKey := _DATE[7] + _DATE[8] +
_DATE[1] + _DATE[2] +
_DATE[4] + _DATE[5] + _TIME;
END;
{$F-}
PROCEDURE Find_CALLSIGN; { Direct access via index }
BEGIN
SayGet(20,25,' Enter CALLSIGN : ',m_CALLSIGN,_S,9,1);
Picture('@!');
ReadGets;
AT(20,25,'═════════════════════════════════════════════');
IF EditResult > 0 THEN Exit;
IF Length(M_CALLSIGN) > 0 THEN
BEGIN
if IndexOn = DATETIME then Set_Order_To(2);
Find(m_CALLSIGN);
IF NOT Found THEN
BEGIN
GoToXY(20,25);
Wait(' ' + m_CALLSIGN + ' not found. Press any key... ');
AT(20,25,'═════════════════════════════════════════════');
GoBottom;
END;
END;
if IndexOn = DATETIME then Set_Order_To(1);
END; { Find_CALLSIGN }
PROCEDURE HamForm;
begin
AT(1,15,'╔╣Index [ callsign ] ╠═════════════════════════════════════════════════════════╗');
AT(1,16,'║Record # of File Last Update : ║');
AT(1,17,'╠════════════════════╤═════════════════════╤═════════════════╤═════════════════╣');
AT(1,18,'║Callsign │Name │Date │Time ║');
AT(1,19,'╟────────────────────┼───────────┬─────────┼─────────────────┼─────────────────╢');
AT(1,20,'║Freq │Power │Mode │RSTout │RSTin ║');
AT(1,21,'╟────────────────────┴───────────┴─────────┼─────────────────┼─────────────────╢');
AT(1,22,'║Comment │QSLsent │QSLrcvd ║');
AT(1,23,'╠══════════════════════════════════════════╧═════════════════╧═════════════════╣');
AT(1,24,'║Next Prev Top bOttom Go Find Edit Add Del Browse paCk Index Quit ║');
AT(1,25,'╚╣<F1> = Help╠═════════════════════════════════════════════════════════════════╝');
AT(37,16,DBF);
AT(69,16,LUpdate);
end;
PROCEDURE DoGetsWith_HAMLOG;
BEGIN
WITH HAMLOG DO
BEGIN
IF AddMode THEN
BEGIN
ClearRecord;
_DATE := SystemDate;
_TIME := SystemTime;
AT(11,16,SInteger(RecCount+1,4));
AT(21,16,SInteger(RecCount+1,4));
END
ELSE
BEGIN
AT(11,16,SInteger(RecNo,4));
AT(21,16,SInteger(RecCount,4));
END;
IF dBOF OR dEOF THEN RingBell;
SayGet(12,18, '', _CALLSIGN, _S, 9, 0);
Picture('@!');
SayGet(29,18, '', _NAME, _S, 10, 0);
SayGet(51,18, '', _DATE, _D, 8, 0);
SayGet(68,18, '', _TIME, _S, 5, 0);
Picture('99:99');
SayGet( 8,20, '', _FREQ, _R, 10, 5);
SayGet(29,20, '', _POWER, _LI, 4, 0);
SayGet(40,20, '', _MODE, _S, 3, 0);
Picture('@!');
SayGet(52,20, '', _RST_OUT, _S, 3, 0);
SayGet(69,20, '', _RST_IN, _S, 3, 0);
SayGet(12,22, '', _COMMENT, _S, 30, 0);
SayGet(53,22, '', _QSL_SENT, _D, 8, 0);
SayGet(71,22, '', _QSL_RCVD, _D, 8, 0);
IF deleted THEN AT(65,25,'╣ DELETED ╠')
ELSE AT(65,25,'═══════════');
IF EditMode OR AddMode THEN
BEGIN
ReadGets; { edit the fields defined with SayGet() }
IF EditResult <= 0 THEN
IF AddMode
THEN Append
ELSE Replace;
END
ELSE ClearGets; { just display the fields }
END;
END; { DoGetsWith_HAMLOG }
procedure makedatabase;
var FieldList : FieldArray;
database : dbfRECORD;
begin
FillChar(FieldList,SizeOf(FieldList), 0);
FieldList[1].Name := 'CALLSIGN'; { field Name }
FieldList[1].Typ := 'C'; { field Type }
FieldList[1].Len := 9; { field Width }
FieldList[2].Name := 'NAME';
FieldList[2].Typ := 'C';
FieldList[2].Len := 10;
FieldList[3].Name := 'DATE';
FieldList[3].Typ := 'D';
FieldList[4].Name := 'TIME';
FieldList[4].Typ := 'C';
FieldList[4].Len := 5;
FieldList[5].Name := 'FREQ';
FieldList[5].Typ := 'N';
FieldList[5].Len := 10;
FieldList[5].Dec := 5;
FieldList[6].Name := 'POWER';
FieldList[6].Typ := 'N';
FieldList[6].Len := 4;
FieldList[7].Name := 'MODE';
FieldList[7].Typ := 'C';
FieldList[7].Len := 3;
FieldList[8].Name := 'RST_OUT';
FieldList[8].Typ := 'C';
FieldList[8].Len := 3;
FieldList[9].Name := 'RST_IN';
FieldList[9].Typ := 'C';
FieldList[9].Len := 3;
FieldList[10].Name := 'COMMENT';
FieldList[10].Typ := 'C';
FieldList[10].Len := 30;
FieldList[11].Name := 'QSL_SENT';
FieldList[11].Typ := 'D';
FieldList[12].Name := 'QSL_RCVD';
FieldList[12].Typ := 'D';
CreateDBF(database,kam_log_file+'.DBF',12,@FieldList);
USE(kam_log_file+'.DBF', @HAMLOG, SizeOf(HAMLOG)); { open the file }
ClearRecord;
Append;
end;
procedure MakeCallList;
var FieldList : FieldArray;
database : dbfRECORD;
begin
FillChar(FieldList,SizeOf(FieldList), 0);
FieldList[1].Name := 'NAME'; { field Name }
FieldList[1].Typ := 'C'; { field Type }
FieldList[1].Len := 10; { field Width }
FieldList[2].Name := 'ROUTING';
FieldList[2].Typ := 'C';
FieldList[2].Len := 30;
FieldList[3].Name := 'COMMENT';
FieldList[3].Typ := 'C';
FieldList[3].Len := 30;
CreateDBF(database,'CALLLIST.DBF',3,@FieldList);
USE('CALLLIST.DBF', @CALLLIST, SizeOf(CALLLIST)); { open the file }
ClearRecord;
Append;
end;
PROCEDURE OpenIndexes;
begin
Set_Index_To(@DateTimeKey,kam_log_file+'.DTM',1);
Set_Index_To(@CallKey,kam_log_file+ '.CLL',2);
IndexOn := DATETIME;
Set_Order_To(1);
end;
PROCEDURE MakeIndexes;
begin
WriteLn('Indexing HAMLOG on date/time ...');
Index_On(@DateTimeKey, kam_log_file+'.DTM');
CloseIndexes;
WriteLn('Indexing HAMLOG on callsign ...');
Index_On(@CallKey, kam_log_file+'.CLL');
CloseIndexes;
end;
PROCEDURE InitializeDataBase;
BEGIN
Set_Escape_On; { affects SayGet commands }
Set_Safety_Off; { affects Pack command }
SayGetColors;
Select(1); { choose a work area in which to open the database }
IF NOT FileExists(kam_log_file+'.DBF')
THEN makedatabase
ELSE USE(kam_log_file+'.DBF', @HAMLOG, SizeOf(HAMLOG)); { open the file }
IF NOT FileExists(kam_log_file+'.DTM') THEN
MakeIndexes;
Select(1);
OpenIndexes;
EditMode := False;
AddMode := False;
m_CALLSIGN := '';
Select(2);
If NOT FileExists('CALLLIST.DBF')
then MakeCallList
else USE('CALLLIST.DBF',@CALLLIST,SizeOf(CALLLIST));
END; { Initialization }
procedure ToggleIndex;
begin
case IndexOn of
CALLSIGN : begin
Set_Order_To(1);
IndexOn := DATETIME;
end;
DATETIME : begin
Set_Order_To(2);
IndexOn := CALLSIGN;
end;
end;
end;
procedure HAMLOG_MENU;
var MainScreenBuffer : Array[1..2000] OF Word;
begin
Select(1);
Set_FKey(F1, @EditHelp);
Set_Cursor_Off;
HamForm;
REPEAT
DoGetsWith_HAMLOG; { display (or edit) the current record }
case IndexOn of
CALLSIGN : AT(10,15,' CALLSIGN ');
DATETIME : AT(10,15,' DATETIME ');
end;
REPEAT
Choice := ReadKey; { get user request }
IF Choice = CHR(0) THEN { user pressed a special key }
BEGIN
Choice := ReadKey;
Case Choice Of
'P' : Choice := 'N'; { map down-arrow to "Next" }
'H' : Choice := 'P'; { map up-arrow to "Previous" }
';' : Choice := 'H'; { map F1 to "Help" }
ELSE Choice := ' '; { ignore other special keys }
END;
END;
Choice := UpCase(Choice);
UNTIL POS(Choice,'NPTOGFEADHBCIQ') > 0;
EditMode := False;
AddMode := False;
CASE Choice OF
'N' : BEGIN
Skip(1);
IF dEOF THEN GoBottom;
END;
'P' : Skip(-1);
'E' : EditMode := True;
'A' : AddMode := True;
'H' : HelpScreen;
'D' : { toggle the "Deleted" flag }
IF HAMLOG.Deleted THEN RecallRec ELSE DeleteRec;
'T' : GoTop; { position database at first record according to index }
'O' : GoBottom; { position database at last record according to index }
'B' : begin
FillPage(@MainScreenBuffer);
Set_BrowseWindow_To(1,1,80,14,0,'');
Browse('NOMODIFY');
DisplayPage(@MainScreenBuffer);
end;
'F' : Find_CALLSIGN; { user defined }
'G' : BEGIN { GO }
MRecNO := 1;
SayGet(10,25,' Enter record number: ',MRecNo,_LI,6,0);
Range('1',SInteger(RecCount,0));
Set_Repaint_Off;
ReadGets;
Set_Repaint_On;
IF EditResult <= 0 THEN GO(MRecNo);
AT(10,25,'═════════════════════════════');
END;
'C' : BEGIN { Pack }
FillPage(@MainScreenBuffer);
ClrScr;
WriteLn('Removing deleted records...');
Set_Talk_On;
Pack;
MakeIndexes;
OpenIndexes;
GoTop;
DisplayPage(@MainScreenBuffer);
END;
'I' : ToggleIndex;
END; { Case }
UNTIL choice = 'Q';
Set_Cursor_On;
end;
procedure log_qso;
begin
halt_xmt;
save_screen;
HAMLOG_MENU;
restore_screen;
end;
procedure MaintainCallList;
var MainScreenBuffer : Array[1..2000] OF Word;
begin
Select(2);
FillPage(@MainScreenBuffer);
Set_BrowseWindow_To(1,1,80,15,2,'');
Browse('');
DisplayPage(@MainScreenBuffer);
PKCall := CALLLIST.ROUTING;
end;