home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / win95 / wpchessb.exe / Source / MainForm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-06-13  |  20.0 KB  |  627 lines

  1. unit MainForm;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   ChessBrd, StdCtrls, WinpointAPI, WPAPICommon, ExtCtrls, Menus, FidoAddr,
  8.   ComCtrls;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     WinPointAPI: TWinPointAPI;
  13.     Serv_NewGame: TAreaService;
  14.     MainMenu1: TMainMenu;
  15.     Datei1: TMenuItem;
  16.     Bevel3: TBevel;
  17.     Serv_NewMove: TMsgService;
  18.     Schlieen1: TMenuItem;
  19.     Hilfe1: TMenuItem;
  20.     Info1: TMenuItem;
  21.     Panel1: TPanel;
  22.     Panel2: TPanel;
  23.     Label1: TLabel;
  24.     Label2: TLabel;
  25.     Label3: TLabel;
  26.     Container: TPanel;
  27.     SenderName: TEdit;
  28.     SenderAddr: TEdit;
  29.     ReceiverName: TEdit;
  30.     ReceiverAddr: TEdit;
  31.     Subject: TEdit;
  32.     Panel4: TPanel;
  33.     Ok: TButton;
  34.     Cancel: TButton;
  35.     Undo: TButton;
  36.     Panel5: TPanel;
  37.     Panel6: TPanel;
  38.     ChessBoard: TChessBrd;
  39.     Bevel2: TBevel;
  40.     StatusBar1: TStatusBar;
  41.     Bevel1: TBevel;
  42.     Panel7: TPanel;
  43.     Panel8: TPanel;
  44.     Memo: TMemo;
  45.     Panel9: TPanel;
  46.     Panel10: TPanel;
  47.     Moves: TListBox;
  48.     procedure ChessBoardLegalMove(Sender: TObject; oldSq, newSq: Square);
  49.     procedure UndoClick(Sender: TObject);
  50.     procedure ChessBoardMate(Sender: TObject; oldSq, newSq: Square);
  51.     procedure ChessBoardDraw(Sender: TObject);
  52.     procedure WinPointAPIServerDisconnected(Sender: TObject);
  53.     procedure WinPointAPIConnectFailed(Sender: TObject);
  54.     procedure Serv_NewGameCommand(Areas: TStringList; Msg: TMsg);
  55.     procedure ChessBoardCheck(Sender: TObject; oldSq, newSq: Square);
  56.     procedure OkClick(Sender: TObject);
  57.     procedure CancelClick(Sender: TObject);
  58.     procedure Serv_NewMoveCommand(Msgs: TList; Msg: TMsg);
  59.     procedure FormCreate(Sender: TObject);
  60.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  61.     procedure Schlieen1Click(Sender: TObject);
  62.     procedure FormHide(Sender: TObject);
  63.     procedure FormShow(Sender: TObject);
  64.     procedure Info1Click(Sender: TObject);
  65.     procedure WinPointAPIWrongVersion(Sender: TObject);
  66.     procedure ContainerResize(Sender: TObject);
  67.   protected
  68.   private
  69.     { Private-Deklarationen }
  70.     AT        :Integer;
  71.     DestArea  :String;
  72.     Reply     :String;
  73.     eMail     :String;
  74.     Rebuilding:Boolean;
  75.     WasCheck  :Boolean;
  76.     WasMate   :Boolean;
  77.     WasRemis  :Boolean;
  78.     procedure ResetBoard;
  79.     procedure SetupAddressMode;
  80.     procedure UpdateMoves;
  81.   public
  82.     { Public-Deklarationen }
  83.   end;
  84.  
  85. var
  86.   Form1: TForm1;
  87.  
  88. implementation
  89.  
  90. uses AboutForm;
  91.  
  92. {$R *.DFM}
  93.  
  94. procedure TForm1.UpdateMoves;
  95. var
  96.   Temp:TSTringList;
  97. begin
  98.      Temp :=TSTringList.Create;
  99.      ChessBoard.GetMoveList(Temp);
  100.      Moves.Items :=Temp;
  101.      Temp.Destroy;
  102. end;
  103.  
  104. procedure TForm1.ChessBoardLegalMove(Sender: TObject; oldSq, newSq: Square);
  105. begin
  106.      if not Rebuilding then
  107.      begin
  108.           ChessBoard.Enabled :=False;
  109.           Undo.Enabled       :=True;
  110.           Ok.Enabled         :=True;
  111.           UpdateMoves;
  112.      end;
  113. end;
  114.  
  115. procedure TForm1.UndoClick(Sender: TObject);
  116. begin
  117.      ChessBoard.MoveBackward;
  118.      Undo.Enabled       :=False;
  119.      Ok.Enabled         :=False;
  120.      Chessboard.Enabled :=True;
  121.      UpdateMoves;
  122. end;
  123.  
  124. procedure TForm1.ChessBoardMate(Sender: TObject; oldSq, newSq: Square);
  125. begin
  126.      WasMate:=True;
  127.      if not Rebuilding then ShowMessage('Matt!');
  128. end;
  129.  
  130. procedure TForm1.ChessBoardDraw(Sender: TObject);
  131. begin
  132.      WasRemis:=True;
  133.      if not Rebuilding then ShowMessage('Remis!');
  134. end;
  135.  
  136. procedure TForm1.WinPointAPIServerDisconnected(Sender: TObject);
  137. begin
  138.      Application.Terminate;
  139. end;
  140.  
  141. procedure TForm1.WinPointAPIConnectFailed(Sender: TObject);
  142. begin
  143.      Application.Terminate;
  144. end;
  145.  
  146. procedure TForm1.ResetBoard;
  147. begin
  148.      with Chessboard do
  149.      begin
  150.           ComputerPlaysBlack :=False;
  151.           ComputerPlaysWhite :=False;
  152.           Enabled            :=True;
  153.           NewGame;
  154.           CancelThinking;
  155.      end;
  156.      Undo.Enabled       :=False;
  157.      Ok.Enabled         :=False;
  158. end;
  159.  
  160. procedure TForm1.ChessBoardCheck(Sender: TObject; oldSq, newSq: Square);
  161. begin
  162.      WasCheck:=True;
  163.      if not Rebuilding then ShowMessage('Schach');
  164. end;
  165.  
  166. procedure TForm1.OkClick(Sender: TObject);
  167. var
  168.   Newmail :PNewMail;
  169.   NewSize :Integer;
  170.   i,j     :Integer;
  171.   Lines   :String;
  172.   Temp    :String;
  173.   Moves   :TStringList;
  174.   function XLat(C:Char):Char;
  175.   begin
  176.        case C of
  177.        'r':Result:='t';
  178.        'n':Result:='s';
  179.        'b':Result:='l';
  180.        'p':Result:='b';
  181.        'q':Result:='d';
  182.        'R':Result:='T';
  183.        'N':Result:='S';
  184.        'B':Result:='L';
  185.        'P':Result:='B';
  186.        'Q':Result:='D';
  187.        #0 :Result:=' ';
  188.        else Result:=C;
  189.        end;
  190.   end;
  191. begin
  192.      Moves :=TStringList.Create;
  193.      // use new email if entered and interesting
  194.      if (AT in [AT_NET,AT_EMAIL]) and (Pos('@',SenderName.Text)>0) then
  195.      begin
  196.           email           :=SenderName.Text;
  197.           SenderName.Text :='UUCP';
  198.      end;
  199.      // Text
  200.      Lines   :=#1'WPPLUGINCMD <WPChess> 2049'+#$0d+#$0a+
  201.                'WPC> WinPoint Schach Partie zur automatischen Verarbeitung '+
  202.                'durch das WinPoint 95 Schach Plugin. '+
  203.                'WPC> Hinweise zur manuellen Bearbeitung befinden sich am Ende '+
  204.                'dieser Mail!'#$0d#$0a+
  205.                #$0d#$0a+
  206.                'Zuege: '+#$0d+#$0a+
  207.                '==================='+#$0d+#$0a;
  208.      if (AT in [AT_NET,AT_EMAIL]) and (email<>'')
  209.      then Lines:='to: '+email+#$0d#$0a#$0d#$0a+Lines;
  210.      if Reply<>'' then Lines:=#1'REPLY: '+Reply+#$0d+#$0a+Lines;
  211.      ChessBoard.GetMoveList(Moves);
  212.      for i:=1 to Moves.Count do Lines:=Lines+Moves[i-1]+#$0d+#$0a;
  213.      Lines:=Lines+'==================='+#$0d#$0a#$0d#$0a;
  214.      // Show Board
  215.      Temp  :=ChessBoard.Position;
  216.      Lines :=Lines+'   A B C D E F G H '#$0d#$0a;
  217.      Lines :=Lines+'  +-+-+-+-+-+-+-+-+'#$0d#$0a;
  218.      for i:=0 to 7 do
  219.      begin
  220.           Lines :=Lines+IntToStr(i+1)+' |';
  221.           for j:=0 to 7 do Lines:=Lines+XLat(Temp[i*8+j+1])+'|';
  222.           Lines :=Lines+#$0d#$0a;
  223.           Lines :=Lines+'  +-+-+-+-+-+-+-+-+'#$0d#$0a;
  224.      end;
  225.      // Show Leged
  226.      Lines :=Lines+#$0d#$0a+
  227.                    'Farben:'#$0d#$0a+
  228.                    '======='#$0d#$0a+
  229.                    '  Weiss   Grossbuchstaben'#$0d#$0a+
  230.                    '  Schwarz Kleinbuchstaben'#$0d#$0a+
  231.                    #$0d#$0a+
  232.                    'Figuren:'#$0d#$0a+
  233.                    '========'#$0d#$0a+
  234.                    '  B Bauer'#$0d#$0a+
  235.                    '  L LΣufer'#$0d#$0a+
  236.                    '  S Springer'#$0d#$0a+
  237.                    '  T Turm'#$0d#$0a+
  238.                    '  D Dame'#$0d#$0a+
  239.                    '  K K÷nig'#$0d#$0a;
  240.      // Add note for foe program users
  241.      Lines :=Lines+#$0d#$0a+
  242.                    'Antworten ohne WinPoint 95 Schach Plugin:'#$0d#$0a+
  243.                    '========================================='#$0d#$0a+
  244.                    'Um ohne Verwendung des WinPoint 95 Schach Plugins auf '+
  245.                    'diesen Schachzug zu antworten tragen Sie bitte den neuen '+
  246.                    'Zug oben in der Liste der Zuege ein. Nur so kann das '+
  247.                    'WinPoint 95 Schach Plugin den neuen Zug korrekt auswerten!';
  248.      // Add Custom text
  249.      with Memo.Lines do
  250.      if Count>0 then
  251.      begin
  252.           Lines :=Lines+#$0d#$0a#+
  253.                   'Bemerkungen:'+#$0d#$0a+
  254.                   '============'+#$0d#$0a;
  255.           for i:=0 to Count-1 do Lines:=Lines+Strings[i]+#$0d+#$0a;
  256.      end;
  257.      // Get SIze
  258.      NewSize :=SizeOf(TNewMail)+Length(Lines)+1;
  259.      // Get clear buffer
  260.      GetMem(NewMail,NewSize);
  261.      FillChar(NewMail^,NewSize,0);
  262.      // fill header
  263.      with NewMail^ do
  264.      begin
  265.           TFidonetAddress.StrToAddr(SenderAddr.Text,OrigAddress);
  266.           TFidonetAddress.StrToAddr(ReceiverAddr.Text,DestAddress);
  267.           OrigName    :=SenderName.Text;
  268.           DestName    :=ReceiverName.Text;
  269.           Subject     :=Self.Subject.Text;
  270.           Origin      :='Winpoint Schach Plugin';
  271.           Flags       :=MFLG_SEND or MFLG_Created;
  272.           Size        :=NewSize;
  273.      end;
  274.      // Add Lines to header
  275.      Move(Lines[1],Pointer(Integer(NewMail)+SizeOf(TNewMail))^,Length(Lines)+1);
  276.      WinPointAPI.OpenArea(DestArea);
  277.      WinPointAPI.StoreMsg(NewMail);
  278.      WinPointAPI.CloseArea;
  279.      // Free resources
  280.      FreeMem(NewMail);
  281.      Moves.Destroy;
  282.      Hide;
  283. end;
  284.  
  285. procedure TForm1.CancelClick(Sender: TObject);
  286. begin
  287.      Hide;
  288. end;
  289.  
  290. procedure TForm1.SetupAddressMode;
  291. // Determine requiered addressing
  292. var
  293.   AT :Integer;
  294. begin
  295.      AT       :=WinPointAPI.GetAreaType(DestArea);
  296.      Caption  :='WinPoint Schach - Partie in '+DestArea;
  297.      // Get Addresses
  298.      ReceiverAddr.Visible :=AT=AT_NET;
  299.      SenderAddr.Visible   :=AT in [AT_NET, AT_ECHO];
  300.      ContainerResize(Self);
  301. end;
  302.  
  303. procedure TForm1.Serv_NewGameCommand(Areas: TStringList; Msg: TMsg);
  304. var
  305.   Link  :TNetLinkInfo;
  306.   Links :TNetLinkList;
  307. begin
  308.      Memo.Lines.Clear;
  309.      // No Reply Kludge!
  310.      Reply    :='';
  311.      // No eMail address found yet
  312.      eMail    :='';
  313.      // Reset Chessboard
  314.      ResetBoard;
  315.      DestArea :=Areas[0];
  316.      AT       :=WinPointAPI.GetAreaType(DestArea);
  317.      Caption  :='WinPoint Schach - Partie in '+DestArea;
  318.      SetupAddressMode;
  319.      // Get Addresses
  320.      ReceiverName.Text    :='';
  321.      ReceiverAddr.Text    :='';
  322.      SenderName.Text      :='';
  323.      SenderAddr.Text      :='';
  324.      Subject.Text         :='Schach Partie vom '+DateTimeToStr(Now);
  325.      case AT of
  326.      AT_ECHO:
  327.        begin
  328.             WinPointAPI.GetAreaUplink(DestArea,Link);
  329.             ReceiverName.Text    :='Alle';
  330.             SenderName.Text      :=Link.SysopName;
  331.             SenderAddr.Text      :=TFidonetAddress.AddrToStr(Link.SysopAddress);
  332.        end;
  333.      AT_NET:
  334.        begin
  335.             // Use default Netlink for Netmail
  336.             ReceiverAddr.Visible :=True;
  337.             Links                :=TNetLinkList.Create;
  338.             WinPointAPI.GetUplinks(Links);
  339.             if Links.Count>0 then
  340.             begin
  341.                  Link:=Links[0]^;
  342.                  ReceiverName.Text :='';
  343.                  SenderName.Text   :=Link.SysopName;
  344.                  SenderAddr.Text   :=TFidonetAddress.AddrToStr(Link.SysopAddress);
  345.             end;
  346.             Links.Destroy;
  347.        end;
  348.      end;
  349.      // Display window
  350.      Show;
  351.      SetForegroundWindow(Handle);
  352. end;
  353.  
  354. const
  355.   BrdSquare:array[0..7,0..7]of Square =((A1,B1,C1,D1,E1,F1,G1,H1),
  356.                                         (A2,B2,C2,D2,E2,F2,G2,H2),
  357.                                         (A3,B3,C3,D3,E3,F3,G3,H3),
  358.                                         (A4,B4,C4,D4,E4,F4,G4,H4),
  359.                                         (A5,B5,C5,D5,E5,F5,G5,H5),
  360.                                         (A6,B6,C6,D6,E6,F6,G6,H6),
  361.                                         (A7,B7,C7,D7,E7,F7,G7,H7),
  362.                                         (A8,B8,C8,D8,E8,F8,G8,H8));
  363.  
  364. procedure TForm1.Serv_NewMoveCommand(Msgs: TList; Msg: TMsg);
  365. var
  366.   MsgList :TMessagelist;
  367.   TheMsg  :PPakdMessage;
  368.   Idx     :Integer;
  369.   Link    :TNetLinkInfo;
  370.   Links   :TNetLinkList;
  371.   Line    :String;
  372.   Data    :PChar;
  373.   i,p     :Integer;
  374.   BestM   :Integer;
  375.   BestL   :Integer;
  376.   MatchL  :Integer;
  377.   Found   :Boolean;
  378.   function GetLine(var Dest:String):String;
  379.   var
  380.     P    :Integer;
  381.   begin
  382.        P    :=Pos(#$0d,Data);
  383.        if P>0 then
  384.        begin
  385.             Data[p-1] :=#0;
  386.             Dest      :=Data;
  387.             Inc(Integer(Data),Length(Dest)+1);
  388.        end else
  389.        begin
  390.             Dest :=Data;
  391.             Inc(Integer(Data),Length(Dest));
  392.        end;
  393.        Result:=Dest;
  394.   end;
  395. begin
  396.      memo.Lines.Clear;
  397.      Undo.Enabled       :=False;
  398.      Ok.Enabled         :=False;
  399.      Reply :='';
  400.      email :='';
  401.      with WinPointAPI do
  402.      begin
  403.           DestArea :=GetCurrentArea;
  404.           // Reset Chessboard
  405.           ResetBoard;
  406.           SetupAddressMode;
  407.           // Get Mail Header
  408.           MsgList  :=TMessagelist.Create;
  409.           Idx      :=Integer(Msgs[0]);
  410.           AT       :=GetAreaType(DestArea);
  411.           GetMsgList(MsgList);
  412.           // Load Mail
  413.           GetMsg(Idx,TheMsg);
  414.           // Fix destination area if necessary
  415.           if AT=AT_INTERNAL then
  416.           begin
  417.                // try to find original Area for mail
  418.                Data  :=Pointer(TheMsg);
  419.                Found :=False;
  420.                Inc(Integer(Data),SizeOf(TPakdMessage));
  421.                Inc(Integer(Data),Length(Data)+1);
  422.                Inc(Integer(Data),Length(Data)+1);
  423.                Inc(Integer(Data),Length(Data)+1);
  424.                repeat
  425.                      GetLine(Line);
  426.                      if Copy(Line,1,5)='AREA:' then
  427.                      begin
  428.                           Found :=True;
  429.                           Delete(Line,1,5);
  430.                           DestArea :=Line;
  431.                           AT       :=GetAreaType(DestArea);
  432.                      end;
  433.                until (Data[0]=#0) or Found;
  434.           end;
  435.           with MsgList[Idx]^ do
  436.           with MessageInfo do
  437.           begin
  438.                // Set Origin
  439.                case AT of
  440.                AT_ECHO:
  441.                  begin
  442.                       ReceiverAddr.Visible :=False;
  443.                       GetAreaUplink(DestArea,Link);
  444.                       with Link do
  445.                       SenderAddr.Text :=TFidonetAddress.AddrToStr(SysopAddress);
  446.                       SenderName.Text :=Link.SysopName;
  447.                  end;
  448.                AT_NET:
  449.                  begin
  450.                       // Find best matching Netlink for Netmail
  451.                       ReceiverAddr.Visible :=True;
  452.                       Links                :=TNetLinkList.Create;
  453.                       WinPointAPI.GetUplinks(Links);
  454.                       if Links.Count>0 then
  455.                       begin
  456.                            BestL :=-1;
  457.                            for i:=0 to Links.Count-1 do
  458.                            begin
  459.                                 Link  :=Links[i]^;
  460.                                 // Determine match Level
  461.                                 MatchL :=0;
  462.                                 with Link do
  463.                                 if SysopAddress.Zone=OrigAddress.Zone then
  464.                                 begin
  465.                                      Inc(MatchL);
  466.                                      if SysopAddress.Net=OrigAddress.Net then
  467.                                      begin
  468.                                           Inc(MatchL);
  469.                                           if SysopAddress.Node=OrigAddress.Node
  470.                                           then Inc(MatchL);
  471.                                      end;
  472.                                 end;
  473.                                 if MatchL>BestL then
  474.                                 begin
  475.                                      BestL :=MatchL;
  476.                                      BestM :=i;
  477.                                 end;
  478.                            end;
  479.                            Link            :=Links[BestM]^;
  480.                            SenderName.Text :=Link.SysopName;
  481.                            SenderAddr.Text :=TFidonetAddress.AddrToStr(Link.SysopAddress);
  482.                       end;
  483.                       Links.Destroy;
  484.                  end;
  485.                else
  486.                  // Dont know how to handle adressing here
  487.                  begin
  488.                       ReceiverAddr.Visible :=False;
  489.                       SenderName.Text      :='';
  490.                       SenderAddr.Text      :='';
  491.                  end;
  492.                end;
  493.                // Set Destination
  494.                ReceiverName.Text :=MessageInfo.OrigName;
  495.                ReceiverAddr.Text :=TFidonetAddress.AddrToStr(OrigAddress);
  496.                Self.Subject.Text :=MessageInfo.Subject;
  497.                DestArea          :=MessageInfo.Area;
  498.           end;
  499.           // Free Area
  500.           CloseArea;
  501.      end;
  502.      // Display Window
  503.      Show;
  504.      SetForegroundWindow(Handle);
  505.      //=== Perform old moves ====
  506.      Rebuilding :=True;
  507.      WasMate    :=False;
  508.      WasCheck   :=False;
  509.      WasRemis   :=False;
  510.      Data       :=Pointer(TheMsg);
  511.      Inc(Integer(Data),SizeOf(TPakdMessage));
  512.      Inc(Integer(Data),Length(Data)+1);
  513.      Inc(Integer(Data),Length(Data)+1);
  514.      Inc(Integer(Data),Length(Data)+1);
  515.      Chessboard.AnimateMoves :=False;
  516.      // Find moves start
  517.      repeat
  518.            GetLine(Line);
  519.            if (Length(Reply)=0) and (Copy(Line,1,8)=#1'MSGID: ') then
  520.            begin
  521.                 Delete(Line,1,8);
  522.                 Reply:=Line;
  523.            end;
  524.            if (Length(email)=0) and (UpperCase(Copy(Line,1,6))='FROM: ') then
  525.            begin
  526.                 // Get email address
  527.                 Delete(Line,1,6);
  528.                 i:=Pos('@',Line);
  529.                 if i>0 then
  530.                 begin
  531.                      while (i>1) and (line[i-1]>' ') do Dec(i);
  532.                      while (i<=Length(line)) and (line[i]>' ') do
  533.                      begin
  534.                           email:=email+line[i];
  535.                           Inc(i);
  536.                      end;
  537.                      if email[1] in ['(','<'] then Delete(email,1,1);
  538.                      if email[Length(email)] in [')','>']
  539.                      then Delete(email,Length(email),1);
  540.                 end;
  541.            end;
  542.      until (Data[0]=#0) or (Line='===================');
  543.      while (Data[0]<>#0) and (GetLine(Line)<>'===================') do
  544.      if Length(Line)>0 then
  545.      begin
  546.           // Process move
  547.           while (Length(Line)>5) and not ((Line[1] in ['A'..'H']) and
  548.                                           (Line[2] in ['1'..'8']) and
  549.                                           (Line[3]='-')         and
  550.                                           (Line[4] in ['A'..'H']) and
  551.                                           (Line[5] in ['1'..'8']))
  552.           do Delete(Line,1,1);
  553.           WasMate    :=False;
  554.           WasCheck   :=False;
  555.           WasRemis   :=False;
  556.           if Length(Line)>4 then
  557.           with Chessboard do
  558.           PerformMove(BrdSquare[Ord(Ord(Line[2])-Ord('1')),
  559.                                 Ord(Ord(Line[1])-Ord('A'))],
  560.                       BrdSquare[Ord(Ord(Line[5])-Ord('1')),
  561.                                 Ord(Ord(Line[4])-Ord('A'))]);
  562.      end;
  563.      Chessboard.AnimateMoves :=True;
  564.      Rebuilding              :=False;
  565.      UpdateMoves;
  566.      // Handle State
  567.      if WasCheck then ShowMessage('Schach!');
  568.      if WasMate  then ShowMessage('Matt!');
  569.      // Free Mail
  570.      Dispose(TheMsg);
  571.      // Make the board ready
  572.      Chessboard.Enabled :=not WasMate;
  573. end;
  574.  
  575. procedure TForm1.FormCreate(Sender: TObject);
  576. begin
  577.      Rebuilding:=False;
  578. end;
  579.  
  580. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  581. begin
  582.      CancelClick(Sender);
  583.      Action:=caNone;
  584. end;
  585.  
  586. procedure TForm1.Schlieen1Click(Sender: TObject);
  587. begin
  588.      WinPointAPI.Disconnect;
  589.      Application.Terminate;
  590. end;
  591.  
  592. procedure TForm1.FormHide(Sender: TObject);
  593. begin
  594.      ShowWindow(Application.Handle,SW_HIDE);
  595. end;
  596.  
  597. procedure TForm1.FormShow(Sender: TObject);
  598. begin
  599.      ShowWindow(Application.Handle,SW_Show);
  600. end;
  601.  
  602. procedure TForm1.Info1Click(Sender: TObject);
  603. begin
  604.      About.ShowModal;
  605. end;
  606.  
  607. procedure TForm1.WinPointAPIWrongVersion(Sender: TObject);
  608. begin
  609.      MessageDlg('Das WinPoint Schach Plugin funktioniert nur mit '+
  610.                 'WinPoint 95 Release 1.1 oder h÷her!',mtError,[mbok],0);
  611. end;
  612.  
  613. procedure TForm1.ContainerResize(Sender: TObject);
  614. begin
  615.      Subject.Width     :=Container.Width;
  616.      ReceiverAddr.Left :=Container.Width-ReceiverAddr.Width;
  617.      SenderAddr.Left   :=Container.Width-SenderAddr.Width;
  618.      if ReceiverAddr.Visible
  619.      then ReceiverName.Width :=Container.Width-ReceiverAddr.Width-4
  620.      else ReceiverName.Width :=Container.Width;
  621.      if SenderAddr.Visible
  622.      then SenderName.Width :=Container.Width-SenderAddr.Width-4
  623.      else SenderName.Width :=Container.Width;
  624. end;
  625.  
  626. end.
  627.