unit untScore;
interface
uses
System.Classes,
System.SysUtils,
System.Generics.Collections,
System.IOUtils,
System.Types,
FMX.Dialogs,
System.UITypes;
type
TScoreRecord = class
private
function getIsCorrect: boolean;
const
DELIMITER_CHAR = ',';
public
DateTime: TDateTime;
SessionIndex: Integer;
YomifudaSerial: Integer;
TorifudaSerial: Integer;
ResponceTime: Single;
constructor Create();
destructor Destroy; override;
procedure DecodedString(aCodedString: String);
function EncodeString(): String;
property IsCorrect: boolean read getIsCorrect;
end;
type
TScoreList = class
private
public
Items: TList<TScoreRecord>;
constructor Create();
destructor Destroy; override;
procedure Init();
procedure Load(aPathFileName: String);
procedure Save(aPathFileName: String);
procedure Add(aDateTime: TDateTime;
aSessionIndex: Integer;
aYomifudaSerial: Integer;
aTorifudaSerial: Integer;
aResponceTime: Single);
end;
type
TScoreManager = class
const
INITIAL_PLAYER_NAME = 'ゲスト';
private
FScoreRootPathName: String;
public
constructor Create(aScoreRootPathName: String);
destructor Destroy; override;
procedure PlayerList(vStringList: TStringList);
procedure AddPlayer(aPlayerName: String);
procedure DeletePlayer(aPlayerName: String);
function IsPlayerExists(aPlayerName: String): Boolean;
end;
var
ScoreManager: TScoreManager;
const
ON_SKIP = -1;
ON_TIMEOUT = -2;
implementation
// 要 System.IOUtils System.Types
procedure fileListOfFolder(aFolderName: string; vFileList: TStringList);
var
SearchPattern: string;
Option: TSearchOption;
FileNames: TStringDynArray;
FileName: string;
begin
// ファイル名に一致する検索パターン
SearchPattern := '*.*';
// ディレクトリの列挙モード
Option := TSearchOption.soTopDirectoryOnly; // トップレベル列挙モード
// Option := TSearchOption.soAllDirectories; // 再帰列挙モード
//指定のディレクトリ内のファイルのリスト
FileNames := TDirectory.GetFiles(aFolderName, SearchPattern, Option);
vFileList.Clear;
for FileName in FileNames do
vFileList.Add(TPath.GetFileName(FileName));
end;
{ TScoreRecord }
constructor TScoreRecord.Create;
begin
end;
destructor TScoreRecord.Destroy;
begin
inherited;
end;
procedure TScoreRecord.DecodedString(aCodedString: String);
var
i: Integer;
tmpFieldStringList: TStringList;
begin
tmpFieldStringList := TStringList.Create;
tmpFieldStringList.Delimiter := DELIMITER_CHAR;
tmpFieldStringList.DelimitedText := aCodedString;
Self.DateTime := StrToDateTime(tmpFieldStringList[0]);
Self.SessionIndex := StrToInt (tmpFieldStringList[1]);
Self.YomifudaSerial := StrToInt (tmpFieldStringList[2]);
Self.TorifudaSerial := StrToInt (tmpFieldStringList[3]);
Self.ResponceTime := StrToFloat (tmpFieldStringList[4]);
tmpFieldStringList.Free;
end;
function TScoreRecord.EncodeString: String;
var
tmpFieldStringList: TStringList;
tmpResult: string;
begin
tmpFieldStringList := TStringList.Create;
tmpFieldStringList.Delimiter := DELIMITER_CHAR;
tmpFieldStringList.Add(DateTimeToStr(Self.DateTime));
tmpFieldStringList.Add(IntToStr (Self.SessionIndex));
tmpFieldStringList.Add(IntToStr (Self.YomifudaSerial));
tmpFieldStringList.Add(IntToStr (Self.TorifudaSerial));
tmpFieldStringList.Add(FloatToStr (Self.ResponceTime));
tmpResult := tmpFieldStringList.DelimitedText;
tmpFieldStringList.Free;
Result := tmpResult;
end;
function TScoreRecord.getIsCorrect: boolean;
begin
end;
{ TScoreList }
constructor TScoreList.Create;
begin
Items := TList<TScoreRecord>.Create;
Init();
end;
destructor TScoreList.Destroy;
begin
Init();
Items.Free;
inherited;
end;
procedure TScoreList.Init;
var
i: Integer;
begin
for i := 0 to Items.Count - 1 do
Items[i].Free;
Items.Clear;
end;
procedure TScoreList.Add(aDateTime: TDateTime;
aSessionIndex: Integer;
aYomifudaSerial,
aTorifudaSerial: Integer;
aResponceTime: Single);
var
tmpScoreRecord: TScoreRecord;
begin
tmpScoreRecord := TScoreRecord.Create;
tmpScoreRecord.DateTime := aDateTime;
tmpScoreRecord.SessionIndex := aSessionIndex;
tmpScoreRecord.YomifudaSerial := aYomifudaSerial;
tmpScoreRecord.TorifudaSerial := aTorifudaSerial;
tmpScoreRecord.ResponceTime := aResponceTime;
Items.Add(tmpScoreRecord);
end;
procedure TScoreList.Load(aPathFileName: String);
var
i: Integer;
tmpRecordStringList: TStringList;
tmpScoreRecord: TScoreRecord;
begin
Self.Init();
if FileExists(aPathFileName) then
begin
tmpRecordStringList := TStringList.Create;
tmpRecordStringList.LoadFromFile(aPathFileName);
for i := 0 to tmpRecordStringList.Count - 1 do
begin
tmpScoreRecord := TScoreRecord.Create();
tmpScoreRecord.DecodedString(tmpRecordStringList[i]);
Items.Add(tmpScoreRecord);
end;
tmpRecordStringList.Free;
end;
end;
procedure TScoreList.Save(aPathFileName: String);
var
i: Integer;
tmpRecordStringList: TStringList;
begin
tmpRecordStringList := TStringList.Create;
tmpRecordStringList.Clear;
for i := 0 to Self.Items.Count - 1 do
tmpRecordStringList.Add(Self.Items[i].EncodeString);
tmpRecordStringList.SaveToFile(aPathFileName);
tmpRecordStringList.Free;
end;
{ TScoreManager }
constructor TScoreManager.Create(aScoreRootPathName: String);
begin
FScoreRootPathName := aScoreRootPathName;
ForceDirectories(aScoreRootPathName);
if not IsPlayerExists(INITIAL_PLAYER_NAME) then AddPlayer(INITIAL_PLAYER_NAME);
end;
destructor TScoreManager.Destroy;
begin
inherited;
end;
function TScoreManager.IsPlayerExists(aPlayerName: String): Boolean;
var
tmpPathFileName: String;
begin
tmpPathFileName := FScoreRootPathName + aPlayerName + '.txt';
Result := TFile.Exists(tmpPathFileName);
end;
procedure TScoreManager.AddPlayer(aPlayerName: String);
var
tmpPathFileName: String;
tmpStringList: TStringList;
begin
tmpPathFileName := FScoreRootPathName + aPlayerName + '.txt';
tmpStringList := TStringList.Create;
tmpStringList.Clear;
tmpStringList.SaveToFile(tmpPathFileName);
tmpStringList.Free;
end;
procedure TScoreManager.DeletePlayer(aPlayerName: String);
var
tmpPathFileNameOld: String;
tmpPathFileNameNew: String;
begin
if aPlayerName = INITIAL_PLAYER_NAME then
begin
MessageDlg('このプレイヤーは削除できません。', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOk], 0);
Exit;
end;
tmpPathFileNameOld := FScoreRootPathName + aPlayerName + '.txt';
tmpPathFileNameNew := FScoreRootPathName + aPlayerName + '.dum';
RenameFile(tmpPathFileNameOld, tmpPathFileNameNew)
end;
procedure TScoreManager.PlayerList(vStringList: TStringList);
var
i: Integer;
tmpStringList: TStringList;
begin
tmpStringList:= TStringList.Create;
fileListOfFolder(FScoreRootPathName, tmpStringList);
vStringList.Clear;
for i := 0 to tmpStringList.Count - 1 do
if ExtractFileExt(tmpStringList[i]) = '.txt' then
vStringList.add(ChangeFileExt(ExtractFileName(tmpStringList[i]),''));
tmpStringList.Free;
end;
end.
スコアマネージャー
コメントをどうぞ