home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / math / daylite / ui.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1989-07-17  |  5.3 KB  |  208 lines

  1. unit UI;
  2.  
  3. interface
  4.  
  5.   uses Globals,Calculate;
  6.  
  7.   procedure InitInputs(var Lat,Long,Zone:Float;
  8.                        var theYear:Longint; var theMonth,theDay:integer);
  9.  
  10.   function GetInputs(var Lat,Long,Zone:Float;
  11.                      var theYear:Longint; var theMonth,theDay:integer)
  12.                      :Boolean;
  13.  
  14.   procedure ShowResults(var Day:DayTime);
  15.  
  16. implementation
  17.  
  18.   uses DOS,CRT,Forms;
  19.  
  20.  
  21.   type
  22.        Sexidecimal = record
  23.          d,m,s: longint;
  24.          end;
  25.  
  26.   procedure Float2Sex(n:Float;var sex:Sexidecimal);
  27.     begin with sex do begin
  28.       d := trunc(n);
  29.         n := n - d;
  30.       n := n * 60;
  31.         m := trunc(n);
  32.         n := n - m;
  33.       s := round(n*60);
  34.     end end;
  35.  
  36.   type
  37.        Place = record
  38.          yyyy,mm,dd:LongInt;
  39.          La,Lo:Sexidecimal;
  40.          Z:Real;
  41.          end;
  42.  
  43.   const Calgary : Place = (yyyy:1989;
  44.                            mm:6;
  45.                            dd:23;
  46.                            La:(d:51;m:02;s:26);
  47.                            Lo:(d:114;m:3;s:24);
  48.                            Z:6.0
  49.                            );
  50.  
  51.   var F: Form;
  52.       P: Place;
  53.  
  54.   function dd(n:integer):string;
  55.     var s:string[2];
  56.     begin
  57.       str(n,s);
  58.       if length(s)=1 then
  59.         s := '0'+s;
  60.       dd := ':'+s;
  61.     end;
  62.  
  63.   function HHMMSS(hours:float):string;
  64.     var
  65.       h : longint;
  66.       m,s: integer;
  67.       v : string;
  68.     begin
  69.       Dec2Sex(hours+1/7200,h,m,s);
  70.       str(h,v);
  71.       HHMMSS := v+dd(m)+dd(s);
  72.     end;
  73.  
  74.   function HHMM(hours:float):string;
  75.     var
  76.       h : longint;
  77.       m,s: integer;
  78.       v : string;
  79.     begin
  80.       Dec2Sex(hours+1/120,h,m,s);
  81.       str(h,v);
  82.       HHMM := v+dd(m);
  83.     end;
  84.  
  85.   procedure WriteHeader;
  86.     var i : integer;
  87.     begin
  88.       Window(1,1,80,25);
  89.       Color(BackColor);
  90.       ClrScr;
  91.       Color(ForeColor);
  92.       GotoXY(1,1);ClrEol;
  93.       GotoXY(1,25);ClrEol;
  94.       GotoXY(27,25);Write('F2-Calculate   Esc-Quit');
  95.       GotoXY(27,1);Write('Sunrise/Sunset Calculator');
  96.     end;
  97.  
  98.  
  99.   procedure InitInputs(var Lat,Long,Zone:Float;
  100.                        var theYear:Longint; var theMonth,theDay:integer);
  101.     var y,m,d,dayOfWeek: word;
  102.     begin
  103.       P := Calgary;
  104.       with P do begin
  105.         Lat  := Sex2Dec(La.d,La.m,La.s);
  106.         Long := Sex2Dec(Lo.d,Lo.m,Lo.s);
  107.         Zone := Z;
  108.         DOS.GetDate(y,m,d,dayOfWeek);
  109.         yyyy := y;
  110.         mm   := m;
  111.         dd   := d;
  112.         theYear := yyyy;
  113.         theMonth:= mm;
  114.         theDay  := dd;
  115.       end;
  116.       WriteHeader;
  117.     end;
  118.  
  119.  
  120.   function GetInputs(var Lat,Long,Zone:Float;
  121.                      var theYear:Longint; var theMonth,theDay:integer)
  122.                      :Boolean;
  123.     var ok:boolean;
  124.         code : char;
  125.     begin
  126.       Window(1,1,80,25);
  127.       F.Init(22,3,59,11);
  128.       F.Add(New(FIntPtr, Init( 3, 2, ' Year ', -99999999,99999999)));
  129.       F.Add(New(FIntPtr, Init(18, 2, ' Month ', 1,12)));
  130.       F.Add(New(FIntPtr, Init(27, 2, ' Day ', 1,31)));
  131.       F.Add(New(FIntPtr, Init(3, 4, ' Latitude  - Deg:', 0, 359)));
  132.       F.Add(New(FIntPtr, Init(23, 4, ' Min:', 0, 59)));
  133.       F.Add(New(FIntPtr, Init(30, 4, ' Sec:', 0, 59)));
  134.       F.Add(New(FIntPtr, Init(3, 6, ' Longitude - Deg:', 0, 359)));
  135.       F.Add(New(FIntPtr, Init(23, 6, ' Min:', 0, 59)));
  136.       F.Add(New(FIntPtr, Init(30, 6, ' Sec:', 0, 59)));
  137.       F.Add(New(FRealPtr, Init(3, 8, ' Time Zone ', 5, 2)));
  138.  
  139.       with P do begin
  140.         Float2Sex(Lat,La);
  141.         Float2Sex(long,Lo);
  142.         Z    := Zone;
  143.         yyyy := theYear;
  144.         mm   := theMonth;
  145.         dd   := theDay;
  146.       end;
  147.       GetInputs := False;
  148.       repeat
  149.         F.Put(P);
  150.         F.Show(True);
  151.         code := F.Edit;
  152.         if code in [CSave,CEsc] then begin
  153.           F.Get(P);
  154.           with P do begin
  155.             ok := ValidDate(yyyy,mm,dd);
  156.             if not ok then begin
  157.               yyyy := theYear;
  158.               mm   := theMonth;
  159.               dd   := theDay;
  160.             end;
  161.           end;
  162.          end
  163.       until ok;
  164.       F.Done;
  165.       if code=CSave then with P do begin
  166.         Lat  := Sex2Dec(La.d,La.m,La.s);
  167.         Long := Sex2Dec(Lo.d,Lo.m,Lo.s);
  168.         Zone := Z;
  169.         theYear  := yyyy;
  170.         theMonth := mm;
  171.         theDay   := dd;
  172.       end;
  173.       GetInputs := (code=CSave);
  174.     end;
  175.  
  176.   procedure TimeWindow;
  177.     begin
  178.       Window(22,12,59,25);
  179.       GotoXY(1,1);
  180.       Color(ForeColor);
  181.     end;
  182.  
  183.   procedure WriteTime(prompt:string;t:float);
  184.     var i:integer;
  185.     begin
  186.       for i := 24 downto length(prompt) do prompt[i] := ' ';
  187.       prompt[0] := #24;
  188.       ClrEol;
  189.       GotoXY(4,whereY);
  190.       Writeln(prompt,HHMM(t):5);
  191.     end;
  192.  
  193.   procedure ShowResults(var Day:DayTime);
  194.     begin
  195.       TimeWindow;
  196.       WriteLn;
  197.       WriteTime('Astronomical Dawn : ',Day.Astronomical.Dawn);
  198.       WriteTime('Nautical Dawn : ',    Day.Nautical.Dawn);
  199.       WriteTime('Civil Dawn : ',       Day.Civil.Dawn);
  200.       WriteTime('Sunrise : ',          Day.Actual.Dawn);
  201.       WriteLn;
  202.       WriteTime('Sunset  : ',          Day.Actual.Dusk);
  203.       WriteTime('Civil Dusk : ',       Day.Civil.Dusk);
  204.       WriteTime('Nautical Dusk : ',    Day.Nautical.Dusk);
  205.       WriteTime('Astronomical Dusk : ',Day.Astronomical.Dusk);
  206.     end;
  207.  
  208. end.