ClientFrm.pas
上传用户:llfxmlw
上传日期:2009-09-14
资源大小:335k
文件大小:25k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit ClientFrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   ScktComp, ExtCtrls, ComCtrls, FormSettings, Menus, StdCtrls, Buttons,
  6.   RemConMessages, ZLib;
  7. const
  8.    DEFAULT_SERVER_DELAY = 500;
  9.    DEFAULT_VIEW_MODE    = vmColor4;
  10.    DEFAULT_COMP_MODE    = clDefault;
  11.    DEFAULT_SVR_PRIORITY = THREAD_PRIORITY_HIGHEST;
  12. type
  13.    TMoveObj = class
  14.       X, Y  : integer;
  15.       Time  : integer;
  16.    end;
  17.   TClientForm = class(TForm)
  18.     StatPanel: TPanel;
  19.     StatusBar1: TStatusBar;
  20.     ScrollBox1: TScrollBox;
  21.     Image1: TImage;
  22.     ClientSocket1: TClientSocket;
  23.     Timer1: TTimer;
  24.     FormSettings1: TFormSettings;
  25.     MainMenu1: TMainMenu;
  26.     File1: TMenuItem;
  27.     Connect1: TMenuItem;
  28.     N1: TMenuItem;
  29.     Exit1: TMenuItem;
  30.     Disconnect1: TMenuItem;
  31.     View1: TMenuItem;
  32.     RefreshComplete1: TMenuItem;
  33.     UpdateChanges1: TMenuItem;
  34.     ResponseTimer: TTimer;
  35.     ClickTimer: TTimer;
  36.     Options1: TMenuItem;
  37.     ServerPause1: TMenuItem;
  38.     N005sec1: TMenuItem;
  39.     N010sec1: TMenuItem;
  40.     N050sec1: TMenuItem;
  41.     N100sec1: TMenuItem;
  42.     N200sec1: TMenuItem;
  43.     N500sec1: TMenuItem;
  44.     LogList: TListBox;
  45.     Splitter1: TSplitter;
  46.     N2: TMenuItem;
  47.     Log1: TMenuItem;
  48.     CommStat1: TMenuItem;
  49.     N3: TMenuItem;
  50.     Shutdown1: TMenuItem;
  51.     Special1: TMenuItem;
  52.     FocusServerWindow1: TMenuItem;
  53.     BitmapFormat1: TMenuItem;
  54.     Color4: TMenuItem;
  55.     Gray4: TMenuItem;
  56.     Gray8: TMenuItem;
  57.     Color24: TMenuItem;
  58.     Default1: TMenuItem;
  59.     WaitImage: TImage;
  60.     CompressionLevel1: TMenuItem;
  61.     HighSlow1: TMenuItem;
  62.     Medium1: TMenuItem;
  63.     LowFast1: TMenuItem;
  64.     ServerPriority1: TMenuItem;
  65.     Critical1: TMenuItem;
  66.     Highest1: TMenuItem;
  67.     AboveNormal1: TMenuItem;
  68.     Normal1: TMenuItem;
  69.     BelowNormal1: TMenuItem;
  70.     Lowest1: TMenuItem;
  71.     Idle1: TMenuItem;
  72.     N4: TMenuItem;
  73.     ScaleImage1: TMenuItem;
  74.     ProcessList1: TMenuItem;
  75.     N5: TMenuItem;
  76.     FileList1: TMenuItem;
  77.     Panel1: TPanel;
  78.     SendCRBut: TSpeedButton;
  79.     SendBut: TSpeedButton;
  80.     SendPanel: TPanel;
  81.     SendEdit: TEdit;
  82.     Help1: TMenuItem;
  83.     About1: TMenuItem;
  84.     StatBarMenu: TMenuItem;
  85.     FullScreen1: TMenuItem;
  86.     procedure FormShow(Sender: TObject);
  87.     procedure Timer1Timer(Sender: TObject);
  88.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  89.     procedure ClientSocket1Lookup(Sender: TObject;
  90.       Socket: TCustomWinSocket);
  91.     procedure ClientSocket1Connecting(Sender: TObject;
  92.       Socket: TCustomWinSocket);
  93.     procedure ClientSocket1Connect(Sender: TObject;
  94.       Socket: TCustomWinSocket);
  95.     procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
  96.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  97.     procedure Exit1Click(Sender: TObject);
  98.     procedure Connect1Click(Sender: TObject);
  99.     procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  100.     procedure ClientSocket1Disconnect(Sender: TObject;
  101.       Socket: TCustomWinSocket);
  102.     procedure Disconnect1Click(Sender: TObject);
  103.     procedure RefreshComplete1Click(Sender: TObject);
  104.     procedure UpdateChanges1Click(Sender: TObject);
  105.     procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  106.       Y: Integer);
  107.     procedure ResponseTimerTimer(Sender: TObject);
  108.     procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
  109.       Shift: TShiftState; X, Y: Integer);
  110.     procedure Image1Click(Sender: TObject);
  111.     procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
  112.       Shift: TShiftState; X, Y: Integer);
  113.     procedure Image1DblClick(Sender: TObject);
  114.     procedure ClickTimerTimer(Sender: TObject);
  115.     procedure PauseChange(Sender: TObject);
  116.     procedure SendButClick(Sender: TObject);
  117.     procedure SendCRButClick(Sender: TObject);
  118.     procedure Log1Click(Sender: TObject);
  119.     procedure CommStat1Click(Sender: TObject);
  120.     procedure FormCreate(Sender: TObject);
  121.     procedure Shutdown1Click(Sender: TObject);
  122.     procedure FormDestroy(Sender: TObject);
  123.     procedure FocusServerWindow1Click(Sender: TObject);
  124.     procedure ColorClick(Sender: TObject);
  125.     procedure CompClick(Sender: TObject);
  126.     procedure PriorityClick(Sender: TObject);
  127.     procedure ScaleImage1Click(Sender: TObject);
  128.     procedure ProcessList1Click(Sender: TObject);
  129.     procedure FileList1Click(Sender: TObject);
  130.     procedure SendPanelResize(Sender: TObject);
  131.     procedure About1Click(Sender: TObject);
  132.     procedure StatBarMenuClick(Sender: TObject);
  133.     procedure FullScreen1Click(Sender: TObject);
  134.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  135.       Shift: TShiftState);
  136.   protected
  137.     NumRec     : double;
  138.     NumSend    : double;
  139.     CurMsg     : string;
  140.     NeedReply  : integer;
  141.     LastX      : integer;
  142.     LastY      : integer;
  143.     t1         : DWORD;
  144.     but        : integer;
  145.     NumClick   : integer;
  146.     MoveList   : TList;
  147.     Anim       : integer;
  148.     LastRec    : DWORD;
  149.     ServerDelay: integer;
  150.     ViewMode   : TViewMode;
  151.     CompMode   : TCompressionLevel;
  152.     SvrPriority: integer;
  153.     ProcForm   : TForm;
  154.     FileForm   : TForm;
  155.     LastCPS    : string;
  156.     BeforeFull : TRect;
  157.     procedure  SetStat(i: integer; s: string);
  158.     procedure  UpdateStats;
  159.     procedure  SendText(const Text: string);
  160.     procedure  Log(const s: string);
  161.     procedure  EnableButs;
  162.     procedure  ClearMoveList;
  163.     procedure  AddMove(x, y: integer);
  164.     procedure  ParseComLine;
  165.     procedure  StopAnim;
  166.     procedure  StartAnim;
  167.     procedure  EnableInput;
  168.     procedure  WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  169.     function   CanSendMenuMsg: boolean;
  170.     procedure  Send_Current_Settings;
  171.     procedure  ScaleXY(var X, Y: integer);
  172.     procedure  UpdateLogVis;
  173.   public
  174.     procedure  SendMsg(MsgNum: integer; const MsgData: string; Socket: TCustomWinSocket);
  175.     procedure  ProcessMessage(const Msg: string; Socket: TCustomWinSocket);
  176.     property   Stat[i: integer]: string write SetStat;
  177.   end;
  178. var
  179.   ClientForm: TClientForm;
  180. implementation
  181. uses ConnectDlg, ProcListDlg, FilesDlg, About, FsTopDlg;
  182. {$R *.DFM}
  183. procedure TClientForm.FormShow(Sender: TObject);
  184. begin
  185.    UpdateLogVis;
  186.    if not ClientSocket1.Active then
  187.       Timer1.Enabled := True;
  188. end;
  189. function IsDotAddress(const s: string): boolean;
  190. var
  191.    i : integer;
  192. begin
  193.    Result := True;
  194.    for i := 1 to Length(s) do
  195.       if not (s[i] in ['0'..'9', '.']) then Result := False;
  196. end;
  197. procedure TClientForm.Timer1Timer(Sender: TObject);
  198. var
  199.    f : TForm;
  200. begin
  201.    Timer1.Enabled := False;
  202.    f := Self;
  203.    with ClientConnectForm do begin
  204.       Left := (f.Left + f.Width div 2) - Width div 2;
  205.       Top  := (f.Top + f.Height div 2) - Height div 2;
  206.       if ShowModal = mrOK then with ClientSocket1 do begin
  207.          if IsDotAddress(ServerCombo.Text) then begin
  208.             Host    := '';
  209.             Address := ServerCombo.Text;
  210.          end else begin
  211.             Address := '';
  212.             Host    := ServerCombo.Text;
  213.          end;
  214.          Port := StrToInt(PortEdit.Text);
  215.          StartAnim;
  216.          Active := True;
  217.       end;
  218.    end;
  219. end;
  220. procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
  221. begin
  222.    if BorderStyle<>bsNone then FormSettings1.SaveSettings;
  223.    Disconnect1Click(nil);
  224. end;
  225. procedure TClientForm.ClientSocket1Lookup(Sender: TObject;
  226.   Socket: TCustomWinSocket);
  227. begin
  228.    Stat[0] := ('Looking up: ' + ClientSocket1.Host);
  229. end;
  230. procedure TClientForm.SetStat(i: integer; s: string);
  231. begin
  232.    FSTopForm.StatLabel.Caption := s;
  233.    StatusBar1.Panels[i].Text := s;
  234.    Update;
  235. end;
  236. procedure TClientForm.ClientSocket1Connecting(Sender: TObject;
  237.   Socket: TCustomWinSocket);
  238. begin
  239.    Stat[0] := ('Connecting: ' + ClientSocket1.Host);
  240. end;
  241. procedure TClientForm.ClientSocket1Connect(Sender: TObject;
  242.   Socket: TCustomWinSocket);
  243. begin
  244.    Log(Format('%-7s %s', ['LogOn', DateTimeToStr(Now)]));
  245.    EnableButs;
  246.    Stat[0] := ('Connected: ' + Socket.RemoteHost);
  247.    Caption := 'Remote Control Client - ' + Socket.RemoteHost;
  248.    NumSend   := 0;
  249.    NumRec    := 0;
  250.    NeedReply := 0;
  251.    StopAnim;
  252.    EnableInput;
  253.    SendMsg(MSG_LOGON, ClientConnectForm.PassEdit.Text, ClientSocket1.Socket);
  254.    Send_Current_Settings;
  255. end;
  256. procedure TClientForm.ClientSocket1Error(Sender: TObject;
  257.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  258.   var ErrorCode: Integer);
  259. begin
  260.    Stat[0] := ('Error: ' + IntToStr(ErrorCode));
  261.    ErrorCode := 0;
  262.    if not Socket.Connected then StopAnim;
  263. end;
  264. procedure TClientForm.Exit1Click(Sender: TObject);
  265. begin
  266.    Close;
  267. end;
  268. procedure TClientForm.Connect1Click(Sender: TObject);
  269. begin
  270.    Image1.Picture.Bitmap := nil;
  271.    Timer1Timer(nil);
  272. end;
  273. procedure TClientForm.SendMsg(MsgNum: integer; const MsgData: string; Socket: TCustomWinSocket);
  274. var
  275.    s : string;
  276. begin
  277.    Log(Format('%-7s #%2.2d', ['Send', MsgNum]));
  278.    Stat[0] := Format('Sending Message (Len = %1.0n)', [Length(MsgData)+0.0]);
  279.     
  280.    s := IntToByteStr(MsgNum) + IntToByteStr(Length(MsgData)) + MsgData;
  281.    Socket.SendText(s);
  282.    NumSend := NumSend + Length(s);
  283.    UpdateStats;
  284.    Inc(NeedReply);
  285.    StartAnim;
  286. end;
  287. procedure TClientForm.UpdateStats;
  288. begin
  289.    // Stat[0] := Format('Sent: %1.0n', [NumSend]);
  290.    // Stat[1] := Format('Recv: %1.0n', [NumRec]);
  291. end;
  292. procedure TClientForm.ClientSocket1Read(Sender: TObject;
  293.   Socket: TCustomWinSocket);
  294. var
  295.    s      : string;
  296.    msg    : integer;
  297.    len    : integer;
  298.    PerStr : string;
  299.    tdif   : double;
  300.    cps    : string;
  301. begin
  302.    // WaitImage.Hint := 'Data Last Received:' + #13#10 + CurTime;
  303.    s := Socket.ReceiveText;
  304.    NumRec := NumRec + Length(s);
  305.    UpdateStats;
  306.    if CurMsg = '' then LastRec := GetTickCount;
  307.    CurMsg := CurMsg + s;
  308.    if Length(CurMsg) >= 8 then begin
  309.       Move(CurMsg[1], msg, sizeof(integer));
  310.       Move(CurMsg[5], len, sizeof(integer));
  311.       PerStr := Format('(%1.0n%%)', [Length(CurMsg) / (len + 8.0) * 100.0]);
  312.       tdif := (GetTickCount - LastRec) / 1000.0;
  313.       if tdif > 0.5 then cps := Format('%1.0n cps', [Length(CurMsg) / tdif])
  314.          else cps := '';
  315.       Stat[0] := Format('Received: %1.0n of %1.0n  %s  %s',
  316.          [Length(CurMsg) + 0.0, len + 8.0, PerStr, cps]);
  317.       LastCPS := cps;
  318.    end else begin
  319.       if Length(s) > 0 then
  320.          Stat[0] := 'Received: ' + IntToStr(Length(CurMsg));
  321.    end;
  322.    while IsValidMessage(CurMsg) do begin
  323.       s := TrimFirstMsg(CurMsg);
  324.       ProcessMessage(s, Socket);
  325.    end;
  326. end;
  327. procedure TClientForm.ProcessMessage(const Msg: string; Socket: TCustomWinSocket);
  328. var
  329.    MsgNum   : integer;
  330.    Data     : string;
  331.    bmp      : TBitmap;
  332.    R        : TRect;
  333. begin
  334.    Move(Msg[1], MsgNum, sizeof(integer));
  335.    if MsgNum <> MSG_STAT_MSG then
  336.       Log(Format('%-7s #%0.2d  %6.0n bytes  %s', ['Recv', MsgNum, Length(Msg)+0.0, LastCPS]));
  337.    Data := Copy(Msg, 9, Length(Msg));
  338.    if MsgNum = MSG_STAT_MSG then begin
  339.       Stat[0] := Data;
  340.       exit;
  341.    end;
  342.    Dec(NeedReply);
  343.    if NeedReply = 0 then begin
  344.       StopAnim;
  345.    end;
  346.    if MsgNum = MSG_LOGON then begin
  347.       if Data <> '0' then begin
  348.          Stat[0] := 'Log on Successful';
  349.          if ClientConnectForm.StartScreenBox.Checked then
  350.             SendMsg(MSG_REFRESH, '', ClientSocket1.Socket);
  351.       end else begin
  352.          Stat[0] := 'Invalid Password!';
  353.          MessageDlg('Invalid Password!', mtWarning, [mbOK], 0);
  354.       end;
  355.    end;
  356.    if MsgNum = MSG_REFRESH then begin
  357.       Stat[0] := 'Decompressing';
  358.       SaveString(Data, 'Temp2.txt');
  359.       UnCompressBitmap(Data, Image1.Picture.Bitmap);
  360.       Stat[0] := 'Ready';
  361.    end;
  362.    if MsgNum = MSG_SCREEN_UPDATE then begin
  363.       bmp := TBitmap.Create;
  364.       Stat[0] := 'Decompressing';
  365.       UnCompressBitmap(Data, bmp);
  366.       R := Rect(0, 0, bmp.Width, bmp.Height);
  367.       with Image1.Picture.Bitmap.Canvas do begin
  368.          CopyMode := cmSrcInvert;
  369.          CopyRect(R, bmp.Canvas, R);
  370.       end;
  371.       Stat[0] := 'Ready';
  372.       bmp.Free;
  373.    end;
  374.    if MsgNum = MSG_SEVER_DELAY then begin
  375.       Stat[0] := 'Server Delay Set';
  376.    end;
  377.    if MsgNum = MSG_VIEW_MODE then begin
  378.       Stat[0] := 'View Mode Set';
  379.    end;
  380.    if MsgNum = MSG_COMP_MODE then begin
  381.       Stat[0] := 'Compression Mode Set';
  382.    end;
  383.    if MsgNum = MSG_PRIORITY_MODE then begin
  384.       Stat[0] := 'Priority Mode Set';
  385.    end;
  386.    if MsgNum = MSG_PROCESS_LIST then begin
  387.       if ProcForm = nil then
  388.          ProcForm := TProcListForm.Create(Self);
  389.       (ProcForm as TProcListForm).SetList(Data);
  390.       ProcForm.Show;
  391.       Stat[0] := 'Received Process List';
  392.    end;
  393.    if MsgNum = MSG_DRIVE_LIST then begin
  394.       if FileForm = nil then
  395.          FileForm := TFilesForm.Create(Self);
  396.       (FileForm as TFilesForm).SetDriveList(Data);
  397.       FileForm.Show;
  398.       Stat[0] := 'Received Drive List';
  399.    end;
  400.    if MsgNum = MSG_DIRECTORY then begin
  401.       Assert(FileForm <> nil);
  402.       (FileForm as TFilesForm).SetDirData(Data);
  403.       FileForm.Show;
  404.       Stat[0] := 'Received Directory';
  405.    end;
  406.    if MsgNum = MSG_FILE then begin
  407.       Assert(FileForm <> nil);
  408.       Stat[0] := 'Received File';
  409.       (FileForm as TFilesForm).SetFileData(Data);
  410.    end;
  411.    if MsgNum = MSG_REMOTE_LAUNCH then begin
  412.       Stat[0] := 'Launched File: ' + Data;
  413.    end;
  414. end;
  415. procedure TClientForm.ClientSocket1Disconnect(Sender: TObject;
  416.   Socket: TCustomWinSocket);
  417. begin
  418.    Log(Format('%-7s %s', ['LogOff', DateTimeToStr(Now)]));
  419.    ClientSocket1.Active := False;
  420.    EnableButs;
  421.    Stat[0] := ('Disconnected: ' + Socket.RemoteHost);
  422.    Caption := 'Remote Control Client';
  423.    StopAnim;
  424. end;
  425. procedure TClientForm.Disconnect1Click(Sender: TObject);
  426. begin
  427.    Stat[0] := 'Disconnecting...';
  428.    ClientSocket1.Active := False;
  429.    EnableButs;
  430.    StopAnim;
  431. end;
  432. procedure TClientForm.RefreshComplete1Click(Sender: TObject);
  433. begin
  434.    SendMsg(MSG_REFRESH, '', ClientSocket1.Socket);
  435. end;
  436. procedure TClientForm.UpdateChanges1Click(Sender: TObject);
  437. begin
  438.    SendMsg(MSG_SCREEN_UPDATE, '', ClientSocket1.Socket);
  439. end;
  440. procedure TClientForm.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  441.   X, Y: Integer);
  442. begin
  443.    ScaleXY(X, Y);
  444.    LastX := X;
  445.    LastY := Y;
  446.    AddMove(X, Y);
  447. end;
  448. procedure TClientForm.AddMove(x, y: integer);
  449. var
  450.    MoveObj  : TMoveObj;
  451. begin
  452.    MoveObj := TMoveObj.Create;
  453.    MoveObj.X := X;
  454.    MoveObj.Y := Y;
  455.    MoveObj.Time := GetTickCount;
  456.    MoveList.Add(MoveObj);
  457. end;
  458. procedure TClientForm.ResponseTimerTimer(Sender: TObject);
  459. var
  460.    bm : TBitmap;
  461.    x, y  : integer;
  462. begin
  463.    WaitImage.Hint := Format('Wait: %3.1n seconds', [(GetTickCount-t1)/1000.0]);
  464.    bm := TBitmap.Create;
  465.    bm.Width := WaitImage.Width;
  466.    bm.Height := WaitImage.Height;
  467.    Anim := Anim + 1;
  468.    Anim := Anim and 31;
  469.    for x := -1 to 1 do
  470.       for y := -1 to 1 do
  471.          bm.Canvas.Draw(Anim + x*32, Anim + y*32, Application.Icon);
  472.    WaitImage.Picture.Assign(bm);
  473.    bm.Free;
  474. end;
  475. procedure TClientForm.Image1MouseDown(Sender: TObject;
  476.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  477. begin
  478.    ScaleXY(X, Y);
  479.    but := 1;
  480.    if Button = mbRight then but := 2;
  481.    ClearMoveList;
  482.    AddMove(x, y);
  483. end;
  484. procedure TClientForm.Image1Click(Sender: TObject);
  485. begin
  486.    NumClick := 1;
  487.    ClickTimer.Enabled := True;
  488. end;
  489. procedure TClientForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  490.   Shift: TShiftState; X, Y: Integer);
  491. begin
  492.    ScaleXY(X, Y);
  493.    if but = 2 then begin
  494.       // Only do this for Right Clicks
  495.       SendMsg(MSG_CLICK, IntToByteStr(LastX) + IntToByteStr(LastY) +
  496.          IntToByteStr(1 {Single}) + IntToByteStr(but), ClientSocket1.Socket);
  497.    end;
  498.    AddMove(x, y);
  499. end;
  500. procedure TClientForm.Image1DblClick(Sender: TObject);
  501. begin
  502.    NumClick := 2;
  503.    ClickTimer.Enabled := True;
  504. end;
  505. procedure TClientForm.ClickTimerTimer(Sender: TObject);
  506. var
  507.    s        : string;
  508.    MoveObj  : TMoveObj;
  509.    i        : integer;
  510. begin
  511.    ClickTimer.Enabled := False;
  512.    if (MoveList.Count < 5) or (NumClick = 2) then begin
  513.       // This is a Click or Double-click
  514.       SendMsg(MSG_CLICK, IntToByteStr(LastX) + IntToByteStr(LastY) +
  515.          IntToByteStr(NumClick) + IntToByteStr(but), ClientSocket1.Socket);
  516.    end else begin
  517.       // This is a "drag" operation
  518.       s := IntToByteStr(but) + IntToByteStr(MoveList.Count);
  519.       for i := 0 to MoveList.Count-1 do begin
  520.          MoveObj := MoveList[i];
  521.          s := s + IntToByteStr(MoveObj.X) + IntToByteStr(MoveObj.Y)
  522.             + IntToByteStr(MoveObj.time);
  523.       end;
  524.       SendMsg(MSG_DRAG, s, ClientSocket1.Socket);
  525.    end;
  526. end;
  527. procedure TClientForm.SendButClick(Sender: TObject);
  528. begin
  529.    SendText(SendEdit.Text);
  530. end;
  531. procedure TClientForm.SendCRButClick(Sender: TObject);
  532. begin
  533.    SendText(SendEdit.Text + #13);
  534. end;
  535. procedure TClientForm.SendText(const Text: string);
  536. begin
  537.    SendMsg(MSG_KEYS, Text, ClientSocket1.Socket);
  538. end;
  539. procedure TClientForm.Log1Click(Sender: TObject);
  540. begin
  541.    Log1.Checked := not Log1.Checked;
  542.    UpdateLogVis;
  543. end;
  544. procedure TClientForm.UpdateLogVis;
  545. begin
  546.    LogList.Visible := Log1.Checked;
  547.    Splitter1.Visible := Log1.Checked;
  548.    if Log1.Checked then
  549.       LogList.Left := Splitter1.Left - 1;
  550. end;
  551. procedure TClientForm.Log(const s: string);
  552. begin
  553.    LogList.ItemIndex := LogList.Items.Add(s);
  554. end;
  555. procedure TClientForm.CommStat1Click(Sender: TObject);
  556. begin
  557.    CommStat1.Checked := not CommStat1.Checked;
  558.    StatPanel.Visible := CommStat1.Checked;
  559. end;
  560. procedure TClientForm.EnableButs;
  561. var
  562.    b : boolean;
  563. begin
  564.    b := ClientSocket1.Active;
  565.    Connect1.Enabled := not b;
  566.    Disconnect1.Enabled := b;
  567. end;
  568. procedure TClientForm.FormCreate(Sender: TObject);
  569. begin
  570.    EnableButs;
  571.    MoveList := TList.Create;
  572.    ParseComLine;
  573.    StopAnim;
  574.    EnableInput;
  575.    ServerDelay := DEFAULT_SERVER_DELAY;
  576.    ViewMode    := DEFAULT_VIEW_MODE;
  577.    CompMode    := DEFAULT_COMP_MODE;
  578.    SvrPriority := DEFAULT_SVR_PRIORITY;
  579. end;
  580. procedure TClientForm.Shutdown1Click(Sender: TObject);
  581. begin
  582.    Close;
  583.    Application.MainForm.Close;
  584. end;
  585. procedure TClientForm.FormDestroy(Sender: TObject);
  586. begin
  587.    ClearMoveList;
  588.    MoveList.Free;
  589. end;
  590. procedure TClientForm.ClearMoveList;
  591. var
  592.    i : integer;
  593. begin
  594.    for i := 0 to MoveList.Count-1 do
  595.       TObject(MoveList[i]).Free;
  596.    MoveList.Clear;
  597. end;
  598. procedure TClientForm.FocusServerWindow1Click(Sender: TObject);
  599. begin
  600.    SendMsg(MSG_FOCUS_SERVER, '', ClientSocket1.Socket);
  601. end;
  602. procedure TClientForm.ParseComLine;
  603. var
  604.    i           : integer;
  605.    s           : string;
  606. begin
  607.    for i := 1 to ParamCount do begin
  608.       s := UpperCase(ParamStr(i));
  609.       if s = '/CLIENT' then begin
  610.          Visible := True;
  611.       end;
  612.    end;
  613. end;
  614. procedure TClientForm.EnableInput;
  615. var
  616.    b : boolean;
  617. begin
  618.    b := (NeedReply = 0) and ClientSocket1.Active;
  619.    SendBut.Enabled := b;
  620.    SendCRBut.Enabled := b;
  621.    Image1.Enabled := b;
  622.    Special1.Enabled := b;
  623.    // Options1.Enabled := b;
  624. end;
  625. procedure TClientForm.StopAnim;
  626. var
  627.    bmp : TBitmap;
  628. begin
  629.    Screen.Cursor := crDefault;
  630.    ResponseTimer.Enabled := False;
  631.    // Stat[2] := 'Not Waiting';
  632.    bmp := TBitmap.Create;
  633.    bmp.Width := WaitImage.Width;
  634.    bmp.Height := WaitImage.Height;
  635.    bmp.Canvas.Draw(2, 2, Application.Icon);
  636.    WaitImage.Picture.Assign(bmp);
  637.    bmp.Free;
  638.    
  639.    EnableInput;
  640. end;
  641. procedure TClientForm.StartAnim;
  642. begin
  643.    Anim := 2;
  644.    ResponseTimer.Enabled := True;
  645.    // Stat[2] := 'Waiting';
  646.    t1 := GetTickCount;
  647.    Screen.Cursor := crAppStart;
  648.    EnableInput;
  649. end;
  650. procedure TClientForm.WMSysCommand(var Message: TWMSysCommand);
  651. begin
  652.    if (Message.CmdType and $FFF0 = SC_MINIMIZE) then
  653.       Application.Minimize
  654.    else
  655.       inherited;
  656. end;
  657. function TClientForm.CanSendMenuMsg: boolean;
  658. begin
  659.    Result := ClientSocket1.Active;
  660. end;
  661. procedure TClientForm.PauseChange(Sender: TObject);
  662. var
  663.    d : integer;
  664. begin
  665.    d := 0;
  666.    (Sender as TMenuItem).Checked := True;
  667.    if Sender = N005sec1 then d :=   50;
  668.    if Sender = N010sec1 then d :=  100;
  669.    if Sender = N050sec1 then d :=  500;
  670.    if Sender = N100sec1 then d := 1000;
  671.    if Sender = N200sec1 then d := 2000;
  672.    if Sender = N500sec1 then d := 5000;
  673.    ServerDelay := d;
  674.    if CanSendMenuMsg then
  675.       SendMsg(MSG_SEVER_DELAY, IntToByteStr(d), ClientSocket1.Socket);
  676. end;
  677. procedure TClientForm.ColorClick(Sender: TObject);
  678. var
  679.    vm : TViewMode;
  680.    x  : integer;
  681. begin
  682.    (Sender as TMenuItem).Checked := True;
  683.    vm := vmDefault;
  684.    if Sender = Color4   then vm := vmColor4;
  685.    if Sender = Gray4    then vm := vmGray4;
  686.    if Sender = Gray8    then vm := vmGray8;
  687.    if Sender = Color24  then vm := vmColor24;
  688.    if Sender = Default1 then vm := vmDefault;
  689.    ViewMode := vm;
  690.    if CanSendMenuMsg then begin
  691.       x := integer(vm);
  692.       SendMsg(MSG_VIEW_MODE, IntToByteStr(x), ClientSocket1.Socket);
  693.       SendMsg(MSG_REFRESH, '', ClientSocket1.Socket);
  694.    end;
  695. end;
  696. procedure TClientForm.CompClick(Sender: TObject);
  697. var
  698.    cm : TCompressionLevel;
  699. begin
  700.    (Sender as TMenuItem).Checked := True;
  701.    cm := clDefault;
  702.    if Sender = HighSlow1 then cm := clMax;
  703.    if Sender = Medium1   then cm := clDefault;
  704.    if Sender = LowFast1  then cm := clFastest;
  705.    CompMode := cm;
  706.    if CanSendMenuMsg then
  707.       SendMsg(MSG_COMP_MODE, IntToByteStr(integer(cm)), ClientSocket1.Socket);
  708. end;
  709. procedure TClientForm.PriorityClick(Sender: TObject);
  710. var
  711.    x : integer;
  712. begin
  713.    (Sender as TMenuItem).Checked := True;
  714.    x := THREAD_PRIORITY_NORMAL;
  715.    if Sender = Critical1      then x := THREAD_PRIORITY_TIME_CRITICAL;
  716.    if Sender = Highest1       then x := THREAD_PRIORITY_HIGHEST;
  717.    if Sender = AboveNormal1   then x := THREAD_PRIORITY_ABOVE_NORMAL;
  718.    if Sender = Normal1        then x := THREAD_PRIORITY_NORMAL;
  719.    if Sender = BelowNormal1   then x := THREAD_PRIORITY_BELOW_NORMAL;
  720.    if Sender = Lowest1        then x := THREAD_PRIORITY_LOWEST;
  721.    if Sender = Idle1          then x := THREAD_PRIORITY_IDLE;
  722.    SvrPriority := x;
  723.    if CanSendMenuMsg then
  724.       SendMsg(MSG_PRIORITY_MODE, IntToByteStr(x), ClientSocket1.Socket);
  725. end;
  726. procedure TClientForm.Send_Current_Settings;
  727. begin
  728.    SendMsg(MSG_SEVER_DELAY,   IntToByteStr(ServerDelay), ClientSocket1.Socket);
  729.    SendMsg(MSG_VIEW_MODE,     IntToByteStr(integer(ViewMode)), ClientSocket1.Socket);
  730.    SendMsg(MSG_COMP_MODE,     IntToByteStr(integer(CompMode)), ClientSocket1.Socket);
  731.    SendMsg(MSG_PRIORITY_MODE, IntToByteStr(SvrPriority), ClientSocket1.Socket);
  732. end;
  733. procedure TClientForm.ScaleImage1Click(Sender: TObject);
  734. begin
  735.    ScaleImage1.Checked := not ScaleImage1.Checked;
  736.    if ScaleImage1.Checked then begin
  737.       Image1.AutoSize := False;
  738.       Image1.Stretch  := True;
  739.       Image1.Align    := alClient;
  740.    end else begin
  741.       Image1.AutoSize := True;
  742.       Image1.Stretch  := False;
  743.       Image1.Align    := alNone;
  744.       Image1.Picture.Assign(Image1.Picture.Graphic);  // To trigger the Autosize property
  745.    end;
  746. end;
  747. procedure TClientForm.ScaleXY(var X, Y: integer);
  748. begin
  749.    if not ScaleImage1.Checked then exit;
  750.    with Image1 do begin
  751.       X := X * Picture.Width div Width;
  752.       Y := Y * Picture.Height div Height;
  753.    end;
  754. end;
  755. procedure TClientForm.ProcessList1Click(Sender: TObject);
  756. begin
  757.    SendMsg(MSG_PROCESS_LIST, '', ClientSocket1.Socket);
  758. end;
  759. procedure TClientForm.FileList1Click(Sender: TObject);
  760. begin
  761.    SendMsg(MSG_DRIVE_LIST, '', ClientSocket1.Socket);
  762. end;
  763. procedure TClientForm.SendPanelResize(Sender: TObject);
  764. begin
  765.    SendEdit.Width := SendPanel.ClientWidth - 8;
  766. end;
  767. procedure TClientForm.About1Click(Sender: TObject);
  768. begin
  769.    AboutBox.ShowModal;
  770. end;
  771. procedure TClientForm.StatBarMenuClick(Sender: TObject);
  772. begin
  773.    StatBarMenu.Checked := not StatBarMenu.Checked;
  774.    StatusBar1.Visible := StatBarMenu.Checked; 
  775. end;
  776. procedure TClientForm.FullScreen1Click(Sender: TObject);
  777. begin
  778.    if BorderStyle = bsSizeable then begin
  779.       BeforeFull  := BoundsRect;
  780.       Menu        := nil;
  781.       Left        := 0;
  782.       Top         := 0;
  783.       Width       := Screen.Width;
  784.       Height      := Screen.Height;
  785.       BorderStyle := bsNone;
  786.       StatPanel.Visible := False;
  787.       StatusBar1.Visible := False;
  788.       ScrollBox1.BorderStyle := bsNone;
  789.       FSTopForm.Show;
  790.    end else begin
  791.       BoundsRect := BeforeFull;
  792.       Menu := MainMenu1;
  793.       BorderStyle := bsSizeable;
  794.       StatPanel.Visible := True;
  795.       StatusBar1.Visible := True;
  796.       ScrollBox1.BorderStyle := bsSingle;
  797.       FSTopForm.Hide;
  798.    end;
  799. end;
  800. procedure TClientForm.FormKeyDown(Sender: TObject; var Key: Word;
  801.   Shift: TShiftState);
  802. begin
  803.    // If in Full-Screen mode, do an extra check for Hot-Keys on the popup menu
  804.    if BorderStyle = bsNone then begin
  805.       FSTopForm.CheckShortCut(Key, Shift);
  806.    end;
  807. end;
  808. end.