home *** CD-ROM | disk | FTP | other *** search
/ synchro.net / synchro.net.tar / synchro.net / main / COMM / CTA6_SRC.ZIP / main.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-01-20  |  21.8 KB  |  747 lines

  1. {-$DEFINE WINNT}
  2. unit main;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  8.   ExtCtrls, TnCnx, StdCtrls, Buttons, ComCtrls, ImgList, DIB, VgaEmu, IOBuf;
  9.  
  10. type
  11.   TMF = class(TForm)
  12.     Panel_SysBar: TPanel;
  13.     Panel_StatusBar: TPanel;
  14.     ImgSizer: TImage;
  15.     ButtonsImageList: TImageList;
  16.     MainScrollBar: TScrollBar;
  17.     ImgSysBar: TImage;
  18.     ButtonImages: TImage;
  19.     VgaEmu1: TVgaEmu;
  20.     MainSocket: TTnCnx;
  21.     procedure FormCreate(Sender: TObject);
  22.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  23.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  24.       Shift: TShiftState);
  25.     procedure MainSocketDataAvailable(Sender: TTnCnx; Buffer: PChar;
  26.       Len: Integer);
  27.     procedure MaxResWin;
  28.     procedure ImgSysBarMouseMove(Sender: TObject; Shift: TShiftState; X,
  29.       Y: Integer);
  30.     procedure ImgSysBarMouseDown(Sender: TObject; Button: TMouseButton;
  31.       Shift: TShiftState; X, Y: Integer);
  32.     procedure ImgSysBarDblClick(Sender: TObject);
  33.     procedure ImgSizerMouseDown(Sender: TObject; Button: TMouseButton;
  34.       Shift: TShiftState; X, Y: Integer);
  35.     procedure ImgSizerMouseMove(Sender: TObject; Shift: TShiftState; X,
  36.       Y: Integer);
  37.     procedure ButtonImagesMouseDown(Sender: TObject; Button: TMouseButton;
  38.       Shift: TShiftState; X, Y: Integer);
  39.     procedure ButtonImagesMouseUp(Sender: TObject; Button: TMouseButton;
  40.       Shift: TShiftState; X, Y: Integer);
  41.     procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  42.     procedure ImgSizerMouseUp(Sender: TObject; Button: TMouseButton;
  43.       Shift: TShiftState; X, Y: Integer);
  44.     procedure FormDestroy(Sender: TObject);
  45.     procedure MainSocketSessionClosed(Sender: TTnCnx; Error: Word);
  46.  
  47.     procedure UpdateScrollBar;
  48.     procedure MainScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
  49.       var ScrollPos: Integer);
  50.     procedure FormResize(Sender: TObject);
  51.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  52.     procedure VgaEmu1MouseDown(Sender: TObject; Button: TMouseButton;
  53.       Shift: TShiftState; X, Y: Integer);
  54.     procedure VgaEmu1MouseMove(Sender: TObject; Shift: TShiftState; X,
  55.       Y: Integer);
  56.     procedure VgaEmu1MouseUp(Sender: TObject; Button: TMouseButton;
  57.       Shift: TShiftState; X, Y: Integer);
  58.   private
  59.      Xbase, Ybase, LeftBase, Topbase, Xnew, Ynew : integer;
  60.      AfterStep : Boolean;
  61.      OldHeight, OldWidth : Word;
  62.      color     : tColor;
  63.      dataScope : boolean;
  64.      fullscreen : boolean;
  65.      procedure toggle50Col;
  66.      procedure toggleDataScope;
  67.      procedure appfocuson(Sender: TObject);
  68.      procedure appfocusoff(Sender: TObject);
  69.      procedure Resetwindowsize;
  70.   public
  71. {    Parser : TIOBuf;}
  72.     procedure DataIn( strIn : PChar; Len : integer ); overload;
  73.     procedure DataIn( strIn : String ); overload;
  74.     procedure DataOut(chr: string);
  75.     procedure Connect;
  76.     procedure Disconnect;
  77.     procedure SendMsg(msg:string);
  78.     Procedure Logchar(ch:char);
  79.     procedure AddArea(x0,y0,x1,y1 : integer; cmdType : word; cmd : string);
  80.     procedure DeleteArea(pos : integer);
  81.     procedure ClearAreas;
  82.     procedure ExecuteAreas(x,y : integer; execType : word);
  83.   end;
  84.  
  85. var
  86.   MF: TMF;
  87.   repaintok : boolean = true;
  88.   RipLine : boolean;
  89.  
  90. implementation
  91.  
  92. uses DialForm, IceAnsi, RipParse, MsgForm, Globals, Config, Help;
  93. {$R *.DFM}
  94.  
  95. {###############################################################################
  96.                           FORM SECTION
  97. ###############################################################################}
  98.  
  99. {--------------------- ================ -------------------
  100.                   avoid clearing the background
  101.                (causes flickering and speed penalty)
  102.  --------------------- ================ -------------------}
  103. procedure TMF.WMEraseBkgnd(var Message: TWMEraseBkgnd);
  104. begin Message.Result:=1; end;
  105.  
  106. {--------------------- ================ -------------------
  107.                        Form Create
  108.  --------------------- ================ -------------------}
  109. procedure TMF.FormCreate(Sender: TObject);
  110. begin
  111.   //handles focus and alt-tab etc
  112.   Application.OnActivate := appfocuson;
  113.   Application.OnDeactivate := appfocusoff;
  114.   fullscreen := false;
  115.  
  116.   //init VgaEmu1
  117.   VgaEmu1.Init;
  118.   VgaEmu1.setResolution(640,400);
  119.  
  120.  
  121.   //Initalize ScrollBack Buffer
  122.   LogingMode := lmPlainText;
  123.   LogingBuffer := TstringList.Create;
  124.   LogingStr := '';
  125.   UpdateScrollBar;
  126.  
  127.   //init Form content
  128.   OldHeight := 0;
  129.   AfterStep := False;
  130.   ImgSysBar.Align := AlNone;
  131.   ImgSysBar.SendToBack;
  132.   ImgSysBar.Width := MF.Width;
  133.   ButtonImages.BringToFront;
  134.  
  135.   AreaList := tList.Create;
  136.  
  137.   //initalize ansi
  138.   InitAnsi;
  139.  
  140. {  Parser := TIOBuf.Create(false);}
  141. end;
  142.  
  143. {--------------------- ================ -------------------
  144.                          Destroy Form
  145.  --------------------- ================ -------------------}
  146. procedure TMF.FormDestroy(Sender: TObject);
  147. begin
  148.    {$IFDEF WINNT}
  149.    DXDrawFinalize(Sender);
  150.    {$ENDIF}
  151.    VgaEmu1.Free;
  152.    if MainSocket.IsConnected then
  153.       MainSocket.Close;
  154.    MainSocket.Destroy;
  155. end;
  156.  
  157. {--------------------- ================ -------------------
  158.                        Form keypressed
  159.  --------------------- ================ -------------------}
  160. procedure TMF.FormKeyPress(Sender: TObject; var Key: Char);
  161. begin
  162.   DataOut(Key);
  163. end;
  164.  
  165. {--------------------- ================ -------------------
  166.                        Form KeyDown
  167.  --------------------- ================ -------------------}
  168. procedure TMF.FormKeyDown(Sender: TObject; var Key: Word;
  169.   Shift: TShiftState);
  170. var
  171.   keyChr : string;
  172. begin //do hot keys
  173.   if ssAlt in Shift then
  174.     case Key of
  175.       13 : MaxResWin; //ALT-ENTER
  176.       67 : begin //Alt-C
  177.              frmConfig.ShowModal
  178.            end;
  179.       68 : begin  //ALT-D
  180.              if frmDial.ShowModal = mrOk then
  181.                Connect;
  182.            end;
  183.       72 : Disconnect; //ALT-H
  184.       84 : VgaEmu1.InvertText(1,1,80,25); //alt-T
  185.       86 : toggle50Col;
  186.     end; //ends case key statement
  187.  
  188. //  VgaEmu1.write(inttostr(key));  //debug stuff for finding keys
  189. //  VgaEmu1.textBuf.Canvas.TextOut(10,10,inttostr(Key));
  190.  
  191.   keyChr := #0;
  192.   case Key of
  193. //  33 : ; //pgup  (broken ???)
  194. //  34 : ; //pgdn  (broken ???)
  195.     35 : keyChr := #27 + '[K'; //end
  196.     36 : keyChr := #27 + '[H'; //home
  197.     37 : keyChr := #27 + '[D'; //left
  198.     38 : keyChr := #27 + '[A'; //up
  199.     39 : keyChr := #27 + '[C'; //right
  200.     40 : keyChr := #27 + '[B'; //down
  201.     45 : keyChr := #22;        //insert key
  202.     46 : keyChr := #127;       //delete key
  203.     112 : begin //f1
  204.             frmHelp.ShowModal;
  205.           end;
  206.     122 : Resetwindowsize; //F11
  207.     123 : ToggleDataScope; //F12
  208.   end;
  209.   IF keyChr <> #0 then DataOut(keyChr);
  210. end;
  211.  
  212. {--------------------- ================ -------------------
  213.                     Form Normal/Maximize
  214.  --------------------- ================ -------------------}
  215. procedure TMF.MaxResWin;
  216. begin
  217.   if MF.windowState <> wsMaximized then
  218.   begin
  219.     if OldHeight <> 0 then
  220.       ImgSysBarDblClick(self);
  221.     ButtonImages.Hide;
  222.     Panel_SysBar.Hide;
  223.     ImgSizer.Hide;
  224.     Panel_StatusBar.Hide;
  225.     MainScrollBar.Hide;
  226.     MF.WindowState := wsMaximized;
  227.     fullscreen := true;
  228.   end else begin
  229.     MF.WindowState := wsNormal;
  230.     Panel_SysBar.Show;
  231.     ButtonImages.Show;
  232.     Panel_StatusBar.Show;
  233.     ImgSizer.Show;
  234.     MainScrollBar.Show;
  235.     fullscreen := False;
  236.   end;
  237. end;
  238.  
  239. {--------------------- ================ -------------------
  240.                   Reset window size to screen res;
  241.  --------------------- ================ -------------------}
  242. procedure TMF.Resetwindowsize;
  243. var
  244.   h : Integer;
  245. begin
  246.   if fullscreen then //then switch back to normal
  247.      MaxResWin;    
  248.  
  249.   h := VgaEmu1.textbuf.Picture.Bitmap.Height;
  250.   inc(h,panel_statusbar.height);
  251.   inc(h,panel_sysbar.height);
  252.   clientwidth := VgaEmu1.textbuf.Picture.Bitmap.Width + MainScrollBar.width;
  253.   clientheight := h;
  254. end;
  255.  
  256. {--------------------- ================ -------------------
  257.                   System Toolbar Start moving
  258.  --------------------- ================ -------------------}
  259. procedure TMF.ImgSysBarMouseDown(Sender: TObject; Button: TMouseButton;
  260.   Shift: TShiftState; X, Y: Integer);
  261. begin
  262.     Xbase := X;
  263.     LeftBase := MF.Left;
  264.  
  265.     YBase := Y;
  266.     TopBase := MF.Top;
  267. end;
  268.  
  269. {--------------------- ================ -------------------
  270.                    System Toolbar Move around
  271.  --------------------- ================ -------------------}
  272. procedure TMF.ImgSysBarMouseMove(Sender: TObject; Shift: TShiftState; X,
  273.   Y: Integer);
  274.  
  275. begin
  276.    if (ssLeft in Shift) then begin
  277.       Xnew := LeftBase + (X - Xbase);
  278.       Ynew := TopBase + (Y - Ybase);
  279.       MF.Top := YNew;
  280.       MF.left  := Xnew;
  281.       LeftBase := MF.Left;
  282.       TopBase := MF.Top;
  283.   end;
  284. end;
  285.  
  286. {--------------------- ================ -------------------
  287.                    System Toolbar Shrink
  288.  --------------------- ================ -------------------}
  289. procedure TMF.ImgSysBarDblClick(Sender: TObject);
  290. var
  291.  min : integer;
  292. begin
  293.     AfterStep := AfterStep xor true;
  294.    if AfterStep then
  295.    begin
  296.       Panel_StatusBar.Visible := false;
  297.       OldHeight := MF.Height;
  298.       min := Panel_SysBar.Height + ((Panel_SysBar.BevelWidth-1) * 2);
  299.       MF.Height := min;
  300.    end
  301.    else
  302.     begin
  303.       MF.Height := OldHeight;
  304.       OldHeight := 0;
  305.       Panel_StatusBar.Visible := true;
  306.     end;
  307. end;
  308.  
  309. {--------------------- ================ -------------------
  310.                    Form Sizer start movement
  311.  --------------------- ================ -------------------}
  312. procedure TMF.ImgSizerMouseDown(Sender: TObject; Button: TMouseButton;
  313.   Shift: TShiftState; X, Y: Integer);
  314. begin
  315.   OldWidth := MF.Width;
  316.   OldHeight := MF.Height;
  317.   XBase := X;
  318.   YBase := Y;
  319. end;
  320.  
  321. {--------------------- ================ -------------------
  322.                    Form Sizer resize form
  323.  --------------------- ================ -------------------}
  324. procedure TMF.ImgSizerMouseMove(Sender: TObject; Shift: TShiftState; X,
  325.   Y: Integer);
  326. var
  327.    xx,yy : integer;
  328. begin
  329.    if (ssLeft in Shift) then
  330.     begin
  331.       if MF.WindowState = wsMaximized then
  332.       begin
  333.          xNew := MF.Width;
  334.          yNew := MF.Height;
  335.          xx   := MF.top;
  336.          yy   := MF.Left;
  337.          MF.WindowState := wsNormal;
  338.          MF.Width := xNew;
  339.          MF.Height := yNew;
  340.          MF.Top := xx;
  341.          MF.Left := yy;
  342.       end;
  343.       Xnew := OldWidth + (X - Xbase);
  344.       Ynew := OldHeight + (Y - Ybase);
  345.       MF.Height := YNew;
  346.       MF.width := Xnew;
  347.       OldWidth := MF.Width;
  348.       OldHeight := MF.Height;
  349.     end;
  350. end;
  351.  
  352. {--------------------- ================ -------------------
  353.                    Form sizer stop sizing
  354.  --------------------- ================ -------------------}
  355. procedure TMF.ImgSizerMouseUp(Sender: TObject; Button: TMouseButton;
  356.   Shift: TShiftState; X, Y: Integer);
  357. begin OldHeight := 0; end;
  358.  
  359. {--------------------- ================ -------------------
  360.                      System Button Click
  361.  --------------------- ================ -------------------}
  362. procedure TMF.ButtonImagesMouseDown(Sender: TObject;
  363.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  364. var
  365.    Bitmap : Tbitmap;
  366. begin
  367.    if ssLeft in shift then
  368.    begin
  369.    bitmap := tBitmap.create;
  370.    bitmap.PixelFormat := pf8bit;
  371.    ButtonsImageList.getBitmap(1,Bitmap);
  372.  
  373.    color := bitmap.Canvas.Pixels[x,y];
  374.    if color <> clWhite then
  375.    begin
  376.    if Color = clRed then
  377.    begin
  378.    ButtonsImageList.GetBitmap(2,ButtonImages.Picture.Bitmap);
  379.    end
  380.    else
  381.    if color = clYellow then
  382.    begin
  383.    ButtonsImageList.GetBitmap(3,ButtonImages.Picture.Bitmap);
  384.    end
  385.    else
  386.    if color = clBlue then
  387.    begin
  388.    ButtonsImageList.GetBitmap(4,ButtonImages.Picture.Bitmap);
  389.    end
  390.    else
  391.    if color = clLime then
  392.    begin
  393.    ButtonsImageList.GetBitmap(5,ButtonImages.Picture.Bitmap);
  394.    end;
  395.    ButtonImages.Invalidate;
  396.    end;
  397.    bitmap.Destroy;
  398.    end;
  399. end;
  400.  
  401. {--------------------- ================ -------------------
  402.                  System Buttons Preform tasks
  403.  --------------------- ================ -------------------}
  404. procedure TMF.ButtonImagesMouseUp(Sender: TObject; Button: TMouseButton;
  405.   Shift: TShiftState; X, Y: Integer);
  406. begin
  407.    if color <> clWhite then
  408.    begin
  409.    if Color = clRed then
  410.    begin
  411.      Resetwindowsize;
  412.    end
  413.    else
  414.    if color = clYellow then
  415.    begin
  416.       MF.WindowState := wsMinimized;
  417.    end
  418.    else
  419.    if color = clBlue then
  420.    begin
  421.       MaxResWin;
  422.    end
  423.    else
  424.    if color = clLime then
  425.    begin
  426.      Application.Terminate;
  427.    end;
  428.    color := clWhite;
  429.    ButtonsImageList.GetBitmap(0,ButtonImages.Picture.Bitmap);
  430.    ButtonImages.Invalidate;
  431.    end;
  432. end;
  433.  
  434. {--------------------- ================ -------------------
  435.                      Form Resize capture
  436.  --------------------- ================ -------------------}
  437. procedure TMF.FormResize(Sender: TObject);
  438. begin
  439.    ImgSysBar.Width := Panel_SysBar.Width;
  440. end;
  441.  
  442.  
  443. {###############################################################################
  444.                           TELNET SECTION
  445. ###############################################################################}
  446.  
  447. {--------------------- ================ -------------------
  448.                        Connect to Telnet
  449.  --------------------- ================ -------------------}
  450. procedure TMF.Connect;
  451. begin
  452.   MainSocket.Host := frmDial.HostEdit.Text;
  453.   MainSocket.Port :=  frmDial.PortEdit.Text;
  454.   MainSocket.Connect;
  455. end;
  456.  
  457. {--------------------- ================ -------------------
  458.                     Disconnect from Telnet
  459.  --------------------- ================ -------------------}
  460. procedure TMF.Disconnect;
  461. begin
  462.   MainSocket.Close;
  463. end;
  464.  
  465. {--------------------- ================ -------------------
  466.                 Send Data out through telnet
  467.  --------------------- ================ -------------------}
  468. procedure TMF.DataOut(chr : string);
  469. begin
  470.   IF MainSocket.IsConnected THEN
  471.     MainSocket.SendStr(chr)
  472.   ELSE begin
  473.     VgaEmu1.write(chr);
  474.   end;
  475. end;
  476.  
  477. {--------------------- ================ -------------------
  478.                       Telnet Data Avalible
  479.  --------------------- ================ -------------------}
  480. procedure TMF.MainSocketDataAvailable(Sender: TTnCnx; Buffer: PChar;
  481.   Len: Integer);
  482. begin
  483.   DataIn(Buffer, Len);
  484. end;
  485.  
  486. {--------------------- ================ -------------------
  487.                          Close Telnet
  488.  --------------------- ================ -------------------}
  489. procedure TMF.MainSocketSessionClosed(Sender: TTnCnx; Error: Word);
  490. begin
  491.   SendMsg('Disconnected from host.');
  492. end;
  493.  
  494.  
  495. {###############################################################################
  496.                       DATA PROCESSING SECTION
  497. ###############################################################################}
  498.  
  499. {--------------------- ================ -------------------
  500.                       Process input data (Pchar)
  501.  --------------------- ================ -------------------}
  502. procedure TMF.DataIn( strIn : PChar; Len : integer );
  503. var
  504.   I : integer;
  505. begin
  506.   for I := 0 to len-1 do begin
  507.      if StrIn[i] <> #$0F then
  508.      begin
  509.         if (Display_Rip(strIn[I]) = false) then
  510.           Ice_Display_ANSI(strIn[I]);
  511.         LogChar(StrIn[i]);
  512.      end;
  513.   end;
  514.  
  515. {  Parser.Add(strIn);}
  516. end;
  517.  
  518. {--------------------- ================ -------------------
  519.                       Process input data (String)
  520.                       (Not Active)
  521.  --------------------- ================ -------------------}
  522. procedure TMF.DataIn( strIn : string );
  523. var
  524.   I,L : integer;
  525. begin
  526.   L := Length(Strin);
  527.   for I := 0 to L do
  528.   begin
  529.     Ice_Display_ANSI(strIn[I]);
  530.     //Display_Rip(strIn[I]);
  531.     LogChar(StrIn[i]);
  532.   end;
  533.  
  534. {  Parser.Add(strIn);}
  535. end;
  536.  
  537. {--------------------- ================ -------------------
  538.           Create a ~2-3 Second Dialog with MSG
  539.  --------------------- ================ -------------------}
  540. procedure TMF.SendMsg(msg:string);
  541. begin
  542.   Form2.Label1.Font.Color := clLime;
  543.   Form2.Label1.Caption := msg;
  544.   Form2.Show;
  545. end;
  546.  
  547.  
  548. {###############################################################################
  549.                        Logging Section
  550. ###############################################################################}
  551.  
  552. {--------------------- ================ -------------------
  553.                     Add a char to Log buffer
  554.  --------------------- ================ -------------------}
  555. Procedure TMF.Logchar(ch:char);
  556. begin
  557.    LogingStr := LogingStr + Ch;
  558.    if Ch = #10 then //#10 should be a future option for dilimiter
  559.    begin
  560.       LogingBuffer.add(LogingStr);
  561.       LogingStr := '';
  562.       UpdateScrollBar;
  563.    end;
  564. end;
  565.  
  566.  
  567. {###############################################################################
  568.                      Scrolling buffer section
  569. ###############################################################################}
  570.  
  571. {--------------------- ================ -------------------
  572.                      Update Scrollbar position
  573.  --------------------- ================ -------------------}
  574. Procedure TMF.UpdateScrollBar;
  575. var
  576.   X : Integer;
  577. begin
  578.    if not VgaEmu1.Scrolling then
  579.    begin
  580.       X := (LogingBuffer.count-VgaEmu1.ChrRows+1);
  581.       if X < 1 then
  582.          X := 1;
  583.       if MainScrollBar.Max <> X then
  584.          MainScrollBar.Max := X;
  585.          MainScrollBar.Position := X;
  586.    end;
  587. end;
  588.  
  589. {--------------------- ================ -------------------
  590.                   Start/Stop/Scroll buffer
  591.  --------------------- ================ -------------------}
  592. procedure TMF.MainScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
  593.   var ScrollPos: Integer);
  594. begin
  595.    if LogingBuffer.count > VgaEmu1.chrRows then
  596.    begin
  597.       if ScrollPos = MainScrollBar.Max then
  598.       begin
  599.          VgaEmu1.ScrollOff;
  600.       end
  601.       else
  602.       if not VgaEmu1.Scrolling then
  603.          VgaEmu1.ScrollOn;
  604.       if VgaEmu1.Scrolling then
  605.          VgaEmu1.ScrollTo(ScrollPos,LogingBuffer);
  606.    end;
  607. end;
  608.  
  609.  
  610. {###############################################################################
  611.                       Misc Timer Section (blink/cursor)
  612. ###############################################################################}
  613. procedure TMF.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  614. begin
  615.   repaintok := false;
  616. end;
  617.  
  618. {--------------------- ================ -------------------
  619.                         Cursor Timer
  620.  --------------------- ================ -------------------}
  621. procedure TMF.toggle50Col;
  622. var
  623.   i,
  624.   x,y : byte;
  625. begin
  626.   if VgaEmu1.chrRows = 25 then begin
  627.     VgaEmu1.setFont('8x8.raw',0,8,8,2048); //set font bank 1 to a outside 50 col font rom file.
  628.     VgaEmu1.setChrDim(80,50);
  629.   end else begin
  630.     y := VgaEmu1.WhereY;
  631.     x := VgaEmu1.WhereX;
  632.     if (y > 25) then begin
  633.       VgaEmu1.GotoXY(x,50);
  634.       for i := 1 to 25 do VgaEmu1.Write(#10);
  635.       VgaEmu1.GotoXY(x,25);
  636.       end;
  637.     VgaEmu1.setFont('default',0,8,16,4096); //set font bank 1
  638.     VgaEmu1.setChrDim(80,25);
  639.   end;
  640. end;
  641.  
  642. procedure TMF.toggleDataScope;
  643. var x,y,i :byte;
  644. begin
  645.   if DataScope then begin
  646.     VgaEmu1.setFont('hex.raw',0,8,8,2048); //set font bank 1 to a outside 50 col font rom file.
  647.     VgaEmu1.setChrDim(80,50);
  648.   end else begin
  649.     y := VgaEmu1.WhereY;
  650.     x := VgaEmu1.WhereX;
  651.     if (y > 25) then begin
  652.       VgaEmu1.GotoXY(x,50);
  653.       for i := 1 to 25 do VgaEmu1.Write(#10);
  654.       VgaEmu1.GotoXY(x,25);
  655.       end;
  656.     VgaEmu1.setFont('default',0,8,16,4096); //set font bank 1
  657.     VgaEmu1.setChrDim(80,25);
  658.   end;
  659.   DataScope := DataScope xor true;
  660. end;
  661.  
  662. procedure TMF.appfocuson(Sender: TObject);
  663. begin
  664.   imgsysbar.visible := true;
  665. end;
  666.  
  667. procedure TMF.appfocusoff(Sender: TObject);
  668. begin
  669.   imgsysbar.visible := false;
  670. end;
  671.  
  672. procedure TMF.AddArea(x0,y0,x1,y1 : integer; cmdType : word; cmd : string);
  673. var
  674.   newArea : pArea;
  675. begin
  676. //adds a new mouse area command
  677.   new(newArea);
  678.   newArea^.x0 := x0;
  679.   newArea^.y0 := y0;
  680.   newArea^.x1 := x1;
  681.   newArea^.y1 := y1;
  682.   newArea^.cmdType := cmdType;
  683.   newArea^.cmd := cmd;
  684.   Arealist.Add(newArea);
  685. //  dispose(newArea);  //I was being a naughty monkey =)
  686. end;
  687.  
  688. procedure TMF.DeleteArea(pos : integer);
  689. begin
  690. //deletes a record out of the list
  691.   AreaList.Delete(pos);
  692. end;
  693.  
  694. procedure TMF.ClearAreas;
  695. begin
  696. //deletes all records in the area list
  697.   Arealist.Clear;
  698. end;
  699.  
  700. procedure TMF.ExecuteAreas(x,y : integer; execType : word);
  701. var
  702.   areaPos : integer;
  703.   curArea : pArea;
  704. begin
  705. //find and execute cmd based on position x,y
  706.   if AreaList.Count > 0 then
  707.    begin
  708.      new(curArea);
  709.      for areaPos := 0 to AreaList.Count-1 do
  710.       begin
  711.         curArea := AreaList.Items[areaPos];
  712.         if (curArea^.x0 <= x) and (curArea^.x1 >= x) then
  713.          if (curArea^.y0 <= y) and (curArea^.y1 >= y) then
  714.           begin
  715.             case curArea^.cmdType of
  716.               0  : begin  // cmdtype 0 sends stored command to connection
  717.                      if execType = 1 then //only executes on mouse click
  718.                       DataOut(curArea^.cmd);
  719.                    end;
  720.             end;
  721.           end;
  722.       end;
  723. //     dispose(curArea);
  724.    end;
  725. end;
  726.  
  727. procedure TMF.VgaEmu1MouseDown(Sender: TObject; Button: TMouseButton;
  728.   Shift: TShiftState; X, Y: Integer);
  729. begin
  730.   ExecuteAreas(x,y,1);  //send mouse position as mouse pointer is possiably clicking on a area
  731. end;
  732.  
  733. procedure TMF.VgaEmu1MouseMove(Sender: TObject; Shift: TShiftState; X,
  734.   Y: Integer);
  735. begin
  736.   //ExecuteAreas(x,y,0);  //send mouse position as mouse pointer is possiably overend
  737. end;
  738.  
  739. procedure TMF.VgaEmu1MouseUp(Sender: TObject; Button: TMouseButton;
  740.   Shift: TShiftState; X, Y: Integer);
  741. begin
  742.   ExecuteAreas(x,y,2);  //send mouse position as mouse pointer is possiably unclicked from a area
  743. end;
  744.  
  745. end.
  746.  
  747.