home *** CD-ROM | disk | FTP | other *** search
/ DOKAN 16 / DOKAN16.iso / Progs / Jviewer / SRCCODE / SAMPLE3 / JVIEWU.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-06-14  |  17.5 KB  |  665 lines

  1. unit jviewu;
  2.  
  3. // Pulsar jViewer Source Code (c)1999 Pulsar Studio, & Lord Trancos.
  4. // Please distribute the source code without any modification.
  5.  
  6. // FREEWARE
  7.  
  8. interface
  9.  
  10. uses
  11.   Windows, Messages, SysUtils, Classes, Graphics, Controls,
  12.   Forms, Dialogs, Printers, Nihongo, StdCtrls;
  13.  
  14. type
  15.   TForm1 = class(TForm)
  16.     OpenDlg: TOpenDialog;
  17.     PrtDlg: TPrintDialog;
  18.     procedure FormCreate(Sender: TObject);
  19.     procedure FormPaint(Sender: TObject);
  20.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  21.       Shift: TShiftState);
  22.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  23.   private
  24.     { Private declarations }
  25.   public
  26.     { Public declarations }
  27.   end;
  28.  
  29. var
  30.   Form1  : TForm1;
  31.   ChrSiz : word;     // Charcter width n height
  32.   ChrX   : longint;  // Left OffSet for Scroll L/R
  33.   LinScr : word;     // Lines in Screen
  34.   ChrScr : word;     // Max Char per Line
  35.  
  36.   // File vars
  37.   EUC     : boolean; // if TRUE is EUC format else SJS format
  38.   FName   : string;  // Filename
  39.   FSize   : longint; // File size
  40.   FData   : pointer; // File in memory
  41.   FLoaded : boolean; // File loaded ?
  42.   FLin    : longint; // First line drawed
  43.   FLines  : longint; // Used to limit movement
  44.   FPos    : longint; // File position
  45.   FPages  : longint; // FIle Pages
  46.  
  47. const
  48.   EOFDOS = $D; // Do not change
  49.   EOFWIN = $A; // Do not change
  50.  
  51.   EUCEXT = '.EUC';  // default EUC extension
  52.   SJSEXT = '.SJS';  // default SJS extension
  53.   USEEUC = '-E'; // 2nd parameter, EUC (only required if file ext <> EUCEXT)
  54.   USESJS = '-S'; // 2nd parameter, SJS (only required if file ext <> SJSEXT)
  55.  
  56.   ABOUT = 'Pulsar jViewer v0.3a - SJS/EUC Viewer'+#10+
  57.           '(c)1999 Pulsar Studio'+#10+
  58.           'Developed by Lord Trancos'+#10+
  59.           ''+#10+'Keys;'+#10+
  60.           '[ESC] - Exit'+#10+
  61.           '[F1] - About/Help'+#10+
  62.           '[F2] - Open File'+#10+
  63.           '[F10] - Print File'+#10+
  64.           '[UP][DOWN] - Scroll Up/Down'+#10+
  65.           '[LEFT][RIGHT] - Scroll Left/Right'+#10+
  66.           '[PGUP] - Page Up'+#10+
  67.           '[PGDOWN] - Page Down'+#10+
  68.           '[SPACEBAR] - Redraw Text'+#10+
  69.           '[BACKSPACE] - Change between EUC/SJS'+#10+#10+
  70.           'Greetings to:'+#10+
  71.           'Dark Shadow, R⌠nin, Multidimensional Careto,'+#10+
  72.           'FidoNet r34.Japones, FIC BBS, DOKAN and'+#10+
  73.           'ONELIST.COM MLJ (Mail List Japones)'+#10+#10+
  74.           'This program is FREEWARE' + #10+
  75.           'Full Source Code are Available for FREE!';
  76.  
  77.   TXT00 = 'Can not open file: ';
  78.   TXT01 = 'Can not load file: ';
  79.   TXT02 = 'Error while initializing Nihongo Engine!'+#10+
  80.           '(Remerber: '+jJAPFNT+' and '+jASCFNT+
  81.           ' must be in program''s folder!)';
  82.   TXT03 = '>> LOADING';
  83.   TXT04 = 'File empty: ';
  84.   TXT05 = ' PULSAR jVIEWER - ';
  85.   TXT06 = 'File format not specified.';
  86.   TXT07 = ' - page: ';
  87.   TXT08 = ' - line: ';
  88.   TXT09 = 'Top/Left: (';
  89.   TXT10 = ') - Pos: ';
  90.   TXT11 = 'Printing... ';
  91.   TXT12 = 'Counting... ';
  92.   TXT13 = '%';
  93.   TXT15 = 'Lines: ';
  94.   TXT16 = 'Skiping ';
  95.   TXT17 = 'Printing ';
  96.   NHG00 = #$93 + #$FA + #$96 + #$7B + #$8C + #$EA;
  97.  
  98. implementation
  99.  
  100. uses jViewu2;
  101.  
  102. {$R *.DFM}
  103.  
  104. // -----------------------------------------------------------------------
  105.  
  106. procedure ErrH(_err: string);
  107.  
  108. begin
  109.   MessageDlg(_err, mtError, [mbOk], 0);
  110.   Halt;
  111. end;
  112.  
  113. // -----------------------------------------------------------------------
  114.  
  115. function GetCurrentLine(var _ptr: pointer; var _pos: longint): string;
  116.  
  117. var _s: string;
  118.     _l: longint;
  119.     _b: byte;
  120.  
  121. begin
  122.   _l := 0;
  123.   _s := '';
  124.   while (byte(_ptr^) <> EOFDOS) and (byte(_ptr^) <> EOFWIN)
  125.     and (_pos < FSize) do
  126.       begin
  127.         inc(_l);
  128.         if (_l >= ChrX) and (length(_s) <= ChrScr)
  129.           then _s := _s + char(_ptr^);
  130.         inc(longint(_ptr));
  131.         inc(_pos);
  132.       end;
  133.   case byte(_ptr^) of
  134.     EOFDOS : _b := 2;
  135.     EOFWIN : _b := 1;
  136.     else _b := 0;
  137.   end;
  138.   if _pos = FSize
  139.     then FLines := FLin else
  140.       begin
  141.         inc(longint(_ptr), _b);
  142.         inc(_pos, _b);
  143.       end;
  144.   GetCurrentLine := _s;
  145. end;
  146.  
  147. // -----------------------------------------------------------------------
  148.  
  149. procedure DrawText(_zeta: byte);
  150.  
  151. var _line  : byte;
  152.     _s     : string;
  153.     _point : pointer;
  154.     _pos   : longint;
  155.  
  156. begin
  157.   jWriteSJS(0, 0, ChrSiz, ChrSiz, TXT05 + FName + ' - '
  158.             + TXT09 + IntToStr(FLin) + '/' + IntToStr(ChrX) + TXT10
  159.             + IntToStr(FPos) + '  ', true, Form1.Canvas.handle);
  160.   _line  := 1;
  161.   _pos   := FPos;
  162.   _point := FData;
  163.   inc(longint(_point), _pos);
  164.   repeat
  165.     _s := GetCurrentLine(_point, _pos);
  166.     if (_zeta = 0) or                       // Draw all
  167.        ((_zeta = 1) and (_line = 1)) or     // Draw only first line
  168.        ((_zeta = 2) and (_line = LinScr - 1)) // Draw only last line
  169.        then
  170.          if EUC = false
  171.            then jWriteSJS(0, _line * ChrSiz, ChrSiz, ChrSiz, _s,
  172.                           false, Form1.Canvas.handle)
  173.              else jWriteEUC(0, _line * ChrSiz, ChrSiz, ChrSiz, _s,
  174.                             false, Form1.Canvas.handle);
  175.     inc(_line);
  176.   until _line = LinScr;
  177. end;
  178.  
  179. // -----------------------------------------------------------------------
  180.  
  181. procedure LineBack(var _ptr: pointer; var _pos: longint);
  182.  
  183. begin
  184.   if (FPos = 0) or (Flin = 1) then exit;
  185.  
  186.   if (FPos > 2) then
  187.     begin
  188.       dec(longint(_ptr), 2);
  189.       dec(_pos, 2);
  190.     end else begin FPos := 0; exit; end;
  191.  
  192.   while (byte(_ptr^) <> EOFWIN) and (FPos > 0) do
  193.     begin
  194.       dec(longint(_ptr));
  195.       dec(_pos);
  196.     end;
  197.   if FPos <> 0 then
  198.     begin
  199.       inc(longint(_ptr));
  200.       inc(_pos);
  201.     end;
  202. end;
  203.  
  204. // -----------------------------------------------------------------------
  205.  
  206. function LineDown: boolean;
  207.  
  208. var _p: pointer;
  209.     _x: longint;
  210.  
  211. begin
  212.   LineDown := false;
  213.  
  214.   if Flines <> 0 then if FLin >= FLines then exit;
  215.   _x := FPos;
  216.   _p := FData;
  217.   inc(longint(_p), FPos);
  218.   GetCurrentLine(_p, FPos);
  219.   if FPos > _x then inc(FLin);
  220.  
  221.   LineDown := true;
  222. end;
  223.  
  224. // -----------------------------------------------------------------------
  225.  
  226. function LineUp: boolean;
  227.  
  228. var _p: pointer;
  229.     _x: longint;
  230.  
  231. begin
  232.   LineUp := false;
  233.  
  234.   if FLin = 1 then exit;
  235.   _x := FPos;
  236.   _p := FData;
  237.   inc(longint(_p), FPos);
  238.   LineBack(_p, FPos);
  239.   if FPos < _x then dec(FLin);
  240.  
  241.   LineUp := true;
  242. end;
  243.  
  244. // -----------------------------------------------------------------------
  245.  
  246. procedure SoftScroll(_down: boolean);
  247.  
  248. var _pos: integer;
  249.  
  250. begin
  251.   // Draw lines
  252.   if _down = true then
  253.     for _pos := 1 to LinScr - 2 do
  254.       if BitBlt(Form1.Canvas.Handle, 0, _pos * ChrSiz, Screen.Width,
  255.                 ChrSiz, Form1.Canvas.Handle, 0, (_pos + 1) * ChrSiz,
  256.                 SRCCOPY) = false then exit;
  257.   if _down = false then
  258.     for _pos := LinScr - 2 downto 1 do
  259.       if BitBlt(Form1.Canvas.Handle, 0, (_pos + 1) * ChrSiz, Screen.Width,
  260.                 ChrSiz, Form1.Canvas.Handle, 0, _pos * ChrSiz,
  261.                 SRCCOPY) = false then exit;
  262. end;
  263.  
  264. // -----------------------------------------------------------------------
  265.  
  266. function IdentifyFileType(_fn: string): boolean;
  267.  
  268. var _ex : string[4];
  269.     _r  : boolean;
  270.  
  271. begin
  272.   _r := true;
  273.   _ex := UpperCase(ExtractFileExt(_fn));
  274.     if _ex = EUCEXT then EUC := true else
  275.       if _ex = SJSEXT then EUC := false else _r := false;
  276.   IdentifyFileType := _r;
  277. end;
  278.  
  279. // -----------------------------------------------------------------------
  280.  
  281. procedure ChkFileFormat;
  282.  
  283. begin
  284.   case Form1.OpenDlg.FilterIndex of
  285.     1: if IdentifyFileType(Form1.OpenDlg.Filename) = false
  286.          then ErrH(TXT06);
  287.     2: EUC := false;
  288.     3: EUC := true;
  289.   end;
  290. end;
  291.  
  292. // -----------------------------------------------------------------------
  293.  
  294. function UseOpenDialog: string;
  295.  
  296. begin
  297.   if Form1.OpenDlg.Execute = false then Halt;
  298.   ChkFileFormat;
  299.   UseOpenDialog := Form1.OpenDlg.Filename;
  300. end;
  301.  
  302. // -----------------------------------------------------------------------
  303.  
  304. function GetFileSize(_fn: string): longint;
  305.  
  306. var _r: longint;
  307.     _f: file;
  308.  
  309. begin
  310.   if jOpenBinFile(_fn, _f) = false then ErrH(TXT00 + _fn);
  311.   _r := filesize(_f);
  312.   CloseFile(_f);
  313.   GetFileSize := _r;
  314. end;
  315.  
  316. // -----------------------------------------------------------------------
  317.  
  318. procedure InitVars1;
  319.  
  320. begin
  321.   FPos    := 0;
  322.   FLin    := 1;
  323.   ChrX    := 1;
  324.   FPages  := 0;
  325.   FLines  := 0;
  326.   FLoaded := false;
  327. end;
  328.  
  329. // -----------------------------------------------------------------------
  330.  
  331. procedure TForm1.FormCreate(Sender: TObject);
  332.  
  333. var _f  : file;
  334.  
  335. begin
  336.   // Init vars
  337.   InitVars1;
  338.  
  339.   // check char size n lines in screen
  340.   if Screen.Width < 1280 then ChrSiz := 16 else ChrSiz := 32;
  341.   ChrScr := Screen.Width  div (ChrSiz shr 1);
  342.   LinScr := Screen.Height div ChrSiz;
  343.  
  344.   // init n display form
  345.   Form1.BorderStyle := bsNone;
  346.   Form1.Color  := clBlack;
  347.   Form1.Canvas.Brush.Color := clWhite;
  348.   Form1.Top    := (Screen.Height shr 1) - 30;
  349.   Form1.Left   := (Screen.Width shr 1) - 50;
  350.   Form1.Height := 60;
  351.   Form1.Width  := 100;
  352.   ShowWindow(Form1.handle, SW_SHOW);
  353.  
  354.   // init nihongo engine
  355.   if jInitialize = false then ErrH(TXT02 + #10 + paramstr(0));
  356.  
  357.   // draw 'Loading...' banner
  358.   jWriteSJS(0, 4, 32, 32, NHG00, false, Form1.Canvas.handle);
  359.   jWriteSJS(8, 40, 16, 16, TXT03, false, Form1.Canvas.handle);
  360.  
  361.   // Choose file n file format
  362.   EUC := false;
  363.   if paramcount = 0 then
  364.     begin
  365.       FName := UseOpenDialog
  366.     end else begin
  367.                FName := paramstr(1);
  368.                if IdentifyFileType(FName) = false then
  369.                  if (paramcount > 1) then
  370.                    begin
  371.                      if UpperCase(paramstr(2)) = USEEUC
  372.                        then EUC := true
  373.                          else if UpperCase(paramstr(2)) = USESJS
  374.                            then EUC := false
  375.                              else FName := UseOpenDialog;
  376.                    end else FName := UseOpenDialog;
  377.              end;
  378.  
  379.   // draw 'Loading...' banner (yes, another time)
  380.   jWriteSJS(0, 4, 32, 32, NHG00, false, Form1.Canvas.handle);
  381.   jWriteSJS(8, 40, 16, 16, TXT03, false, Form1.Canvas.handle);
  382.  
  383.   // check file
  384.   FSize := GetFileSize(FName);
  385.   if FSize = 0 then ErrH(TXT04 + FName);
  386.  
  387.   // Load file in memory
  388.   GetMem(FData, FSize);
  389.   if jLoadFile(FName, FData) = false then ErrH(TXT01 + FName);
  390.   FLoaded := true;
  391.  
  392.   // Get only the file name
  393.   Fname := ExtractFileName(FName);
  394.  
  395.   // Init form
  396.   Form1.Top    := 0;
  397.   Form1.Left   := 0;
  398.   Form1.Width  := Screen.Width;
  399.   Form1.Height := Screen.Height;
  400. //  Form1.FormStyle := fsStayOnTop;
  401. end;
  402.  
  403. // -----------------------------------------------------------------------
  404.  
  405. procedure CountPages;
  406.  
  407. var _p   : pointer;
  408.     _l   : longint;
  409.     _lin : longint;
  410.     _chrsiz  : word;
  411.     _pagelin : word;
  412.  
  413. begin
  414.   _l := 0;
  415.   _p := FData;
  416.   _lin := 0;
  417.   bAbort := false;
  418.   Form1.Enabled := false;
  419.   Form2.Caption := TXT12;
  420.   Form2.Visible := true;
  421.   while (_l < FSize) and (bAbort = false) do
  422.     begin
  423.       if _lin and $08 = $08 then Application.ProcessMessages;
  424.       Form2.Caption := TXT12 + IntToStr((_l * 100) div FSize) + TXT13;
  425.       Form2.Label1.Caption := TXT15 + IntToStr(_lin);
  426.       GetCurrentLine(_p, _l);
  427.       inc(_lin);
  428.     end;
  429.   if bAbort = false then
  430.     begin
  431.       _chrsiz  := (Printer.PageWidth * 16) div 640;
  432.       _pagelin := Printer.Pageheight div _chrsiz;
  433.       FPages   := _lin div _pagelin;
  434.       if _lin mod _pagelin <> 0 then inc(FPages);
  435.     end;
  436.   Form2.Visible := false;
  437.   Form1.Enabled := true;
  438.   Form1.SetFocus;
  439. end;
  440.  
  441. // -----------------------------------------------------------------------
  442.  
  443. procedure PrtTxt(_page, _line: longint; _plus: string);
  444.  
  445. begin
  446.   Form2.Label1.Caption := _plus + TXT07 + IntToStr(_page) + TXT08
  447.                         + IntToStr(_line);
  448. end;
  449.  
  450. // -----------------------------------------------------------------------
  451.  
  452. procedure PrintIt;
  453.  
  454. var _pos     : longint;
  455.     _line    : longint;
  456.     _page    : longint;
  457.     _point   : pointer;
  458.     _s       : string;
  459.     _chrsiz  : word;
  460.     _pagelin : word;
  461.     _xyz     : longint;
  462.  
  463.     _from    : longint;
  464.     _to      : longint;
  465.  
  466. begin
  467.   // Count pages if required
  468.   if FPages = 0 then CountPages;
  469.   if FPages = 0 then exit;
  470.  
  471.   // Prt Dialog
  472.   Form1.PrtDlg.MinPage := 1;
  473.   Form1.PrtDlg.MaxPage := FPages;
  474.   Form1.PrtDlg.FromPage := 1;
  475.   Form1.PrtDlg.ToPage   := FPages;
  476.   if Form1.PrtDlg.Execute = false then exit;
  477.  
  478.   // Set _copies, _from & _to
  479.   if Form1.PrtDlg.PrintRange = prPageNums then
  480.     begin
  481.       _from := Form1.PrtDlg.FromPage;
  482.       _to   := Form1.PrtDlg.ToPage;
  483.     end else begin
  484.                _from   := 1;
  485.                _to     := FPages;
  486.              end;
  487.  
  488.   // Reset Left Pos (ir required)
  489.   if ChrX <> 1 then
  490.     begin
  491.       ChrX := 1;
  492.       Form1.RePaint;
  493.     end;
  494.  
  495.   // Init some values
  496.   bAbort := false;
  497.   _pos   := 0;
  498.   _point := FData;
  499.   _page  := 1;
  500.   _chrsiz  := (Printer.PageWidth * 16) div 640;
  501.   _pagelin := Printer.Pageheight div _chrsiz;
  502.   Form1.Enabled := false;
  503.   Form2.Caption := TXT11;
  504.   Form2.Visible := true;
  505.  
  506.   // Print
  507.   Printer.BeginDoc;
  508.   Printer.Canvas.Pen.Color := clBlack;
  509.   Printer.Canvas.Brush.Color := clWhite;
  510.   repeat
  511.     _line   := 1;
  512.     repeat // Print current page
  513.       Application.ProcessMessages;
  514.       if _page < _from
  515.         then PrtTxt(_page, _line, TXT16)
  516.           else PrtTxt(_page, _line, TXT17);
  517.  
  518.       _xyz := _pos;
  519.       _s   := GetCurrentLine(_point, _pos);
  520.       if _page >= _from then
  521.         if EUC = false
  522.           then jWriteSJS(_chrsiz shr 1, _line * _chrSiz, _chrSiz,
  523.                          _chrSiz, _s, true, Printer.Canvas.handle)
  524.             else jWriteEUC(_chrsiz shr 1, _line * _chrSiz, _chrSiz,
  525.                            _chrSiz, _s, true, Printer.Canvas.handle);
  526.       inc(_line);
  527.     until (_line = _pagelin) or (_pos = _xyz) or (bAbort = true);
  528.     if (_page >= _from) and (_page < _to) then Printer.NewPage;
  529.     inc(_page);
  530.   until (_pos = _xyz) or (bAbort = true) or (_page > _to);
  531.   if bAbort = true then Printer.Abort else Printer.EndDoc;
  532.  
  533.   // Done
  534.   Form2.Visible := false;
  535.   Form1.Enabled := true;
  536.   Form1.SetFocus;
  537. end;
  538.  
  539. // -----------------------------------------------------------------------
  540.  
  541. procedure UnloadCurrentFile;
  542.  
  543. begin
  544.   if FLoaded = true then FreeMem(FData, FSize);
  545. end;
  546.  
  547. // -----------------------------------------------------------------------
  548.  
  549. procedure OpenAnotherFile;
  550.  
  551. var _sz : longint;
  552.  
  553. begin
  554.   if Form1.OpenDlg.Execute = false then exit;
  555.   _sz := GetFileSize(Form1.OpenDlg.Filename);
  556.   if _sz = 0 then
  557.     begin
  558.       ShowMessage(TXT04 + Form1.OpenDlg.Filename);
  559.       exit;
  560.     end;
  561.   ChkFileFormat;
  562.   UnloadCurrentFile;
  563.   InitVars1;
  564.   FName := Form1.OpenDlg.Filename;
  565.   FSize := _sz;
  566.  
  567.   // Load file in memory
  568.   GetMem(FData, FSize);
  569.   if jLoadFile(FName, FData) = false then ErrH(TXT01 + FName);
  570.   FLoaded := true;
  571.  
  572.   // Get only the file name
  573.   Fname := ExtractFileName(FName);
  574.  
  575.   // Redraw form
  576.   Form1.Repaint;
  577. end;
  578.  
  579. // -----------------------------------------------------------------------
  580.  
  581. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  582.                              Shift: TShiftState);
  583.  
  584. var _cnt: word;
  585.     _xyz: longint;
  586.  
  587. begin
  588.   case key of
  589.     27 : Application.Terminate; // Esc
  590.     112: ShowMessage(ABOUT);    // F1
  591.     113: OpenAnotherFile;       // F2
  592.   end;
  593.  
  594.   if FLoaded = true then
  595.     case key of
  596.       32 : begin
  597.              ChrX := 0;
  598.              Form1.repaint;  // SpaceBar
  599.            end;
  600.       8  : begin  // BackSpace
  601.              if EUC = true then EUC := false else EUC := true;
  602.              Form1.repaint;
  603.            end;
  604.       33 : begin  // PgUp
  605.              _xyz := Fpos;
  606.              for _cnt := 3 to LinScr do LineUp;
  607.              if FPos <> _xyz then Form1.repaint else Beep;
  608.            end;
  609.       34 : begin  // PgDown
  610.              _xyz := Fpos;
  611.              for _cnt := 3 to LinScr do LineDown;
  612.              if FPos <> _xyz then Form1.repaint else Beep;
  613.            end;
  614.       38 : if LineUp = true then   // Up
  615.              begin
  616.                SoftScroll(false);
  617.                Form1.Canvas.Brush.Color := clBlack;
  618.                Form1.Canvas.Rectangle(0, ChrSiz, Width, ChrSiz shl 1);
  619.                Form1.Canvas.Brush.Color := clWhite;
  620.                DrawText(1);
  621.              end else beep;
  622.       40 : if LineDown = true then // Down
  623.              begin
  624.                SoftScroll(true);
  625.                Form1.Canvas.Brush.Color := clBlack;
  626.                Form1.Canvas.Rectangle(0, (LinScr - 1) * ChrSiz, Width,
  627.                                       Height);
  628.                Form1.Canvas.Brush.Color := clWhite;
  629.                DrawText(2);
  630.              end else beep;
  631.       37 : if ChrX > 1 then // left
  632.              begin
  633.                dec(ChrX, ChrScr shr 1);
  634.                Form1.repaint;
  635.              end;
  636.       39 : begin // right
  637.              inc(ChrX, ChrScr shr 1);
  638.              Form1.repaint;
  639.            end;
  640.       121: PrintIt;               // F10
  641.      {else ShowMessage(IntToStr(key)); }
  642.     end;
  643. end;
  644.  
  645. // -----------------------------------------------------------------------
  646.  
  647. procedure TForm1.FormPaint(Sender: TObject);
  648.  
  649. begin
  650.   if FLoaded = true then DrawText(0);
  651. end;
  652.  
  653. // -----------------------------------------------------------------------
  654.  
  655. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  656.  
  657. begin
  658.   UnloadCurrentFile;
  659.   jClose;
  660. end;
  661.  
  662. // -----------------------------------------------------------------------
  663.  
  664. end.
  665.