{ - ini soubory osetrit proti spatnym hodnotam (mimo obrazovku) - praci se soubory presunout pod vlastni tridu - projit kod a vytvorit private metody k opakujicim se akcim } unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Inifiles, Player, NewPlayerForm, PassForm, ChangeColorForm, ChessBoardForm; type TFormMenu = class(TForm) MainMenu: TMainMenu; StartMenu: TMenuItem; SettingsMenu: TMenuItem; NewGame: TMenuItem; LoadGame: TMenuItem; SwitchPlayers: TMenuItem; Quit: TMenuItem; ChangeSkin: TMenuItem; GBPlayerInfo: TGroupBox; GBLogin: TGroupBox; BtnLogin: TButton; BtnNewPlayer: TButton; LBPlayersList: TListBox; BtnDeletePlayer: TButton; LblName: TLabel; LblWins: TLabel; LblLose: TLabel; LblStaleMates: TLabel; LblSavedGame: TLabel; GBOperations: TGroupBox; BtnNewGame: TButton; BtnLoadGame: TButton; BtnSwitchPlayers: TButton; BtnQuit: TButton; procedure QuitClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BtnNewPlayerClick(Sender: TObject); procedure BtnDeletePlayerClick(Sender: TObject); procedure BtnLoginClick(Sender: TObject); procedure NewGameClick(Sender: TObject); procedure BtnSwitchPlayersClick(Sender: TObject); procedure ChangeSkinClick(Sender: TObject); procedure BtnLoadGameClick(Sender: TObject); private MainPlayer : TPlayer; procedure RefreshPlayersList; public { Public declarations } const CFilename = 'players.dat'; end; var FormMenu: TFormMenu; implementation {$R *.dfm} procedure TFormMenu.RefreshPlayersList; var DataFile : File of TFileRec; TempData : TFileRec; begin LBPlayersList.Clear; if FileExists(CFilename) then begin AssignFile(DataFile,CFilename); Reset(DataFile); while not eof(DataFile) do begin Read(DataFile,TempData); LBPlayersList.Items.Add(TempData.Name); end; CloseFile(DataFile); end; end; procedure TFormMenu.BtnDeletePlayerClick(Sender: TObject); var Player : TPlayer; DataFile, TempFile : File of TFileRec; TempData : TFileRec; begin // nacteni udaju o hraci Player := TPlayer.Create; Player.LoadUserData(CFilename,LBPlayersList.Items[LBPlayersList.ItemIndex]); // zadani hesla pro overeni Application.CreateForm(TFrmPassword, FrmPassword); FrmPassword.LblPlayerName.Caption := FrmPassword.LblPlayerName.Caption + LBPlayersList.Items[LBPlayersList.ItemIndex]; FrmPassword.ShowModal; if FrmPassword.ModalResult=mrOK then begin if FrmPassword.EPassword.Text = Player.GetPassword then begin // smazani zaznamu ze souboru if FileExists(CFilename) then begin AssignFile(DataFile,CFilename); AssignFile(TempFile,'temp.dat'); Reset(DataFile); Rewrite(TempFile); while not eof(DataFile) do begin Read(DataFile,TempData); if TempData.Name <> LBPlayersList.Items[LBPlayersList.ItemIndex] then Write(TempFile,TempData); end; CloseFile(DataFile); CloseFile(TempFile); Erase(DataFile); Rename(TempFile,CFilename); end; // obnova zaznamu do seznamu RefreshPlayersList; // pokud neni zadny zaznam vypni tlacitka if LBPlayersList.Items.Count=0 then begin BtnLogin.Enabled := false; BtnDeletePlayer.Enabled := false; end; end else ShowMessage('Nelze smazat. Špatně zadané heslo!'); end; FrmPassword.Free; Player.Free; end; procedure TFormMenu.BtnLoadGameClick(Sender: TObject); var FormChessBoard : TFormChessBoard; begin // zobrazeni hraci plochy FormChessboard := TFormChessBoard.Create(self); FormChessboard.FormCreate(self); FormChessboard.playername := MainPlayer.GetName; FormChessboard.isLoad(true); FormChessboard.ShowModal; // zapis vysledku case FormChessboard.win of 1: begin MainPlayer.SetWinGames(MainPlayer.GetWinGames+1); LblWins.Caption := 'Počet vyhraných her: '+IntToStr(MainPlayer.GetWinGames); end; 2: begin MainPlayer.SetLoseGames(MainPlayer.GetLoseGames+1); LblLose.Caption := 'Počet prohraných her: '+IntToStr(MainPlayer.GetLoseGames); end; else begin MainPlayer.SetStaleMates(MainPlayer.GetStaleMates+1); LblStaleMates.Caption := 'Počet remíz: ' +IntToStr(MainPlayer.GetStaleMates); if FileExists(MainPlayer.GetName+'.dat') then begin MainPlayer.SetLastGame(MainPlayer.GetName+'.dat'); MainPlayer.SaveUserData(CFilename); LblSavedGame.Caption := 'Nedohraná hra: ANO'; BtnLoadGame.Enabled := true; end else begin MainPlayer.SetLastGame(''); MainPlayer.SaveUserData(CFilename); LblSavedGame.Caption := 'Nedohraná hra: NE'; BtnLoadGame.Enabled := false; end; end; end; FormChessBoard.Free; end; procedure TFormMenu.BtnLoginClick(Sender: TObject); begin // nacteni hracova profilu if LBPlayersList.ItemIndex=-1 then ShowMessage('Vyberte hráče!') else begin MainPlayer := TPlayer.Create; MainPlayer.LoadUserData(CFilename, LBPlayersList.Items[LBPlayersList.ItemIndex]); // zadani hesla pro overeni Application.CreateForm(TFrmPassword, FrmPassword); FrmPassword.LblPlayerName.Caption := FrmPassword.LblPlayerName.Caption + LBPlayersList.Items[LBPlayersList.ItemIndex]; FrmPassword.ShowModal; if FrmPassword.ModalResult=mrOK then begin if FrmPassword.EPassword.Text = MainPlayer.GetPassword then begin // aktualizace udaju v info boxu LblName.Caption := 'Jméno: ' + MainPlayer.GetName; LblWins.Caption := 'Počet vyhraných her: ' + IntToStr(MainPlayer.GetWinGames); LblLose.Caption := 'Počet prohraných her: ' + IntToStr(MainPlayer.GetLoseGames); LblStaleMates.Caption := 'Počet remíz: ' + IntToStr(MainPlayer.GetStaleMates); if MainPlayer.GetLastGame<>'' then LblSavedGame.Caption := 'Nedohraná hra: ANO' else LblSavedGame.Caption := 'Nedohraná hra: NE'; // aktualizece start nabidky NewGame.Enabled := true; SwitchPlayers.Enabled := true; if MainPlayer.GetLastGame<>'' then BtnloadGame.Enabled := true; // zmizeni nabidy hracu GBLogin.Visible := false; // zobrazeni nabikdy operaci GBOperations.Visible := true; end else begin ShowMessage('Špatné heslo!'); MainPlayer.Free; end; end; end; end; procedure TFormMenu.BtnNewPlayerClick(Sender: TObject); var Player : TPlayer; PlayerExist : boolean; i : integer; begin // zadani udaju noveho hrace Application.CreateForm(TFrmNewPlayer, FrmNewPlayer); FrmNewPlayer.ShowModal; if FrmNewPlayer.ModalResult=mrOK then begin // kontrola, jestli uz zadany hrac existuje PlayerExist := false; for i := 0 to LBPlayersList.Count - 1 do begin if LBPlayersList.Items[i]=FrmNewPlayer.EName.Text then begin PlayerExist := true; Break; end; end; // ulozeni noveho hrace do souboru pokud neexistuje if not PlayerExist then begin Player := TPlayer.Create; Player.SetName(FrmNewPlayer.EName.Text); Player.SetPassword(FrmNewPlayer.EPass.Text); Player.SaveUserData(CFilename); Player.Free; // aktualizace obsahu listu hracu RefreshPlayersList; BtnLogin.Enabled := true; BtnDeletePlayer.Enabled := true; end else ShowMessage('Chyba: Nelze uložit, zadaný hráč existuje!'); end; FrmNewPlayer.Free; end; procedure TFormMenu.BtnSwitchPlayersClick(Sender: TObject); begin // ulozeni udaju o hraci na disk MainPlayer.SaveUserData(CFilename); // aktualizace nabidek GBOperations.Visible := false; BtnLoadGame.Enabled := false; GBLogin.Visible := true; // zmena udaju v infu o hraci LblName.Caption := 'Jméno:'; LblWins.Caption := 'Počet vyhraných her:'; LblLose.Caption := 'Počet prohraných her:'; LblStaleMates.Caption := 'Počet remíz:'; LblSavedGame.Caption := 'Nedohraná hra:'; MainPlayer.Free; end; procedure TFormMenu.ChangeSkinClick(Sender: TObject); var INIFile : TINIFile; begin // vyvoreni okna pro zmenu vzhledu Application.CreateForm(TFrmChangeSkin, FrmChangeSkin); // nacteni barev ze souboru INIFile := TiniFile.Create((ExtractFilePath(Application.exename))+'chess.ini'); FrmChangeskin.ColorBox1.Selected := INIFile.ReadInteger('Chessboard','Color1',8421504); FrmChangeskin.ColorBox2.Selected := INIFile.ReadInteger('Chessboard','Color2',16777215); INIFile.Free; FrmChangeSkin.ShowModal; if FrmChangeSkin.ModalResult=mrOK then begin // ulozeni nastaveni do souboru INIFile := TiniFile.Create((ExtractFilePath(Application.exename))+'chess.ini'); INIFile.WriteInteger('Chessboard','Color1',FrmChangeskin.ColorBox1.Selected); INIFile.WriteInteger('Chessboard','Color2',FrmChangeskin.ColorBox2.Selected); INIFile.Free; // pokud jiz je vyvoren formular s hracim polem prekresli pole if Assigned(FormChessboard) then begin FormChessboard.Chessboard.SetColorSheme(FrmChangeskin.ColorBox1.Selected, FrmChangeskin.ColorBox2.Selected); FormChessboard.PBChessboard.Repaint; end; end; // uvolneni okna FrmChangeSkin.Free; end; procedure TFormMenu.FormClose(Sender: TObject; var Action: TCloseAction); var INIFile : TINIFile; begin // ulozeni aktualni pozice okna do ini souboru INIFile := TiniFile.Create((ExtractFilePath(Application.exename))+'winpos.ini'); INIFile.WriteInteger('FormOptions','Left',self.Left); INIFile.WriteInteger('FormOptions','Top',self.Top); INIFile.Free; end; procedure TFormMenu.FormCreate(Sender: TObject); var INIFile : TINIFile; begin // nacteni pozice okna z ini souboru INIFile := TiniFile.Create((ExtractFilePath(Application.exename))+'winpos.ini'); self.Left := INIFile.ReadInteger('FormOptions','Left',100); self.Top := INIFile.ReadInteger('FormOptions','Top',100); INIFile.Free; // naplneni seznamu hracu ze souboru RefreshPlayersList; // povoleni tlacitka prihlasit a smazat if LBPlayersList.Items.Count<>0 then begin BtnLogin.Enabled := true; BtnDeletePlayer.Enabled := true; end; end; procedure TFormMenu.NewGameClick(Sender: TObject); var FormChessboard : TFormChessboard; begin // zobrazeni hraci plochy FormChessboard := TFormChessboard.Create(self); FormChessboard.FormCreate(self); FormChessboard.isLoad(false); FormChessboard.playername := MainPlayer.GetName; FormChessboard.ShowModal; // zapis vysledku case FormChessboard.win of 1: begin MainPlayer.SetWinGames(MainPlayer.GetWinGames+1); LblWins.Caption := 'Počet vyhraných her: '+IntToStr(MainPlayer.GetWinGames); end; 2: begin MainPlayer.SetLoseGames(MainPlayer.GetLoseGames+1); LblLose.Caption := 'Počet prohraných her: '+IntToStr(MainPlayer.GetLoseGames); end; else begin MainPlayer.SetStaleMates(MainPlayer.GetStaleMates+1); LblStaleMates.Caption := 'Počet remíz: ' +IntToStr(MainPlayer.GetStaleMates); if FileExists(MainPlayer.GetName+'.dat') then begin MainPlayer.SetLastGame(MainPlayer.GetName+'.dat'); MainPlayer.SaveUserData(CFilename); LblSavedGame.Caption := 'Nedohraná hra: ANO'; BtnLoadGame.Enabled := true; end else begin MainPlayer.SetLastGame(''); MainPlayer.SaveUserData(CFilename); LblSavedGame.Caption := 'Nedohraná hra: NE'; BtnLoadGame.Enabled := false; end; end; end; FormChessBoard.Free; end; procedure TFormMenu.QuitClick(Sender: TObject); begin // ulozeni hracskych dat MainPlayer.SaveUserData(CFilename); // ukonceni aplikace Self.Close; end; end.