Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit UnitIntro;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.ExtCtrls,
- Vcl.Buttons, UnitStrings;
- type
- TMyString = string[11];
- TData = record
- Name: TMyString;
- end;
- TNamesPt = ^TNames;
- TNames = record
- Data: TData;
- Next: TNamesPt;
- end;
- TPlMenu = class(TForm)
- Empty: TPopupMenu;
- iBackground: TImage;
- laQuestion: TLabel;
- sbYes: TSpeedButton;
- sbNo: TSpeedButton;
- laYesCase: TLabel;
- eName: TEdit;
- sbAcceptName: TSpeedButton;
- laWelcome: TLabel;
- EndTimer: TTimer;
- cbNames: TComboBox;
- procedure sbYesClick(Sender: TObject);
- procedure sbAcceptNameClick(Sender: TObject);
- procedure EndTimerTimer(Sender: TObject);
- procedure eNameKeyPress(Sender: TObject; var Key: Char);
- procedure eNameChange(Sender: TObject);
- function CheckAndSaveName(Name: TMyString): Boolean;
- procedure AddElem(Data: TData; var Prev: TNamesPt);
- procedure sbNoClick(Sender: TObject);
- procedure NameAcception(Name: string);
- procedure InputFromFile(Sender: TObject);
- procedure cbNamesChange(Sender: TObject);
- procedure cbNamesKeyPress(Sender: TObject; var Key: Char);
- procedure FormCreate(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure eNameKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure DeleteList(var Head: TNamesPt);
- function IsNameFounded(var IsFound: Boolean; Head: TNamesPt;
- var Prev: TNamesPt; Name: TMyString): Boolean;
- procedure WriteList(Head: TNamesPt; FileName: string);
- function IsFileCorrect(FileName: string): Boolean;
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- PlMenu: TPlMenu;
- implementation
- {$R *.dfm}
- uses UnitMain;
- const
- PreStartDelay = 2000;
- var
- TimeLeft: Integer;
- State: Byte; //1 for Yes; 2 for No
- procedure TPlMenu.eNameChange(Sender: TObject);
- begin
- if Length(eName.Text) > 0 then
- sbAcceptName.Enabled := True
- else
- sbAcceptName.Enabled := False;
- end;
- procedure TPlMenu.eNameKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if ssShift in Shift then
- Key := 0;
- end;
- procedure TPlMenu.eNameKeyPress(Sender: TObject; var Key: Char);
- const
- Latin: set of Char = ['A'..'Z', 'a'..'z', #8];
- begin
- if (Key = #13) and sbAcceptName.Enabled then
- sbAcceptNameClick(Sender);
- if not (Key in Latin) then
- Key := #0;
- end;
- procedure TPlMenu.EndTimerTimer(Sender: TObject);
- begin
- TimeLeft := TimeLeft - 1000;
- if (TimeLeft = 0) then
- Self.Close;
- end;
- procedure TPlMenu.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- CanClose := False;
- if TimeLeft = 0 then
- CanClose := True;
- end;
- function TPlMenu.IsFileCorrect(FileName: string): Boolean;
- const
- Letters: set of Char = ['A'..'Z', 'a'..'z'];
- var
- OutputFile: file of TData;
- i: Integer;
- FileData: TData;
- IsCorrect: Boolean;
- begin
- IsCorrect := True;
- AssignFile(OutputFile, FileName);
- Reset(OutputFile);
- if EOF(OutputFile) then
- begin
- CloseFile(OutputFile);
- Erase(OutputFile);
- IsCorrect := False;
- ShowMessage(msgFileIsInvalid);
- end
- else
- begin
- Reset(OutputFile);
- Read(OutputFile, FileData);
- CloseFile(OutputFile);
- i := 1;
- while (i <= Length(FileData.Name)) and IsCorrect do
- begin
- if not(FileData.Name[i] in Letters) then
- begin
- IsCorrect := False;
- ShowMessage(msgFileIsInvalid);
- DeleteFile(FileName);
- end;
- Inc(i);
- end;
- end;
- Result := IsCorrect;
- end;
- procedure TPlMenu.FormCreate(Sender: TObject);
- const
- FileName = 'Names';
- begin
- iBackground.Picture.Bitmap.LoadFromResourceName(HInstance, 'IMAGE6');
- TimeLeft := PreStartDelay;
- if FileExists(FileName) and IsFileCorrect(FileName) then
- sbNo.Enabled := True
- else
- sbNo.Enabled := False;
- end;
- procedure TPlMenu.AddElem(Data: TData; var Prev: TNamesPt);
- var
- Curr: TNamesPt;
- begin
- New(Curr);
- Curr.Data := Data;
- Prev.Next := Curr;
- Curr.Next := nil;
- end;
- procedure TPlMenu.cbNamesChange(Sender: TObject);
- begin
- if Length(cbNames.Text) > 0 then
- sbAcceptName.Enabled := True
- else
- sbAcceptName.Enabled := False;
- end;
- procedure TPlMenu.cbNamesKeyPress(Sender: TObject; var Key: Char);
- begin
- if (Key = #13) and sbAcceptName.Enabled then
- sbAcceptNameClick(Sender);
- end;
- procedure TPlMenu.DeleteList(var Head: TNamesPt);
- var
- Curr: TNamesPt;
- begin
- while (Head <> nil) do
- begin
- Curr := Head.Next;
- Dispose(Head);
- Head := Curr;
- end;
- end;
- function TPlMenu.IsNameFounded(var IsFound: Boolean; Head: TNamesPt;
- var Prev: TNamesPt; Name: TMyString): Boolean;
- var
- Curr: TNamesPt;
- begin
- Curr := Head;
- Result := True;
- IsFound := False;
- while (Curr <> nil) and not IsFound do
- begin
- if Curr.Data.Name = Name then
- begin
- Result := False;
- IsFound := True;
- end;
- Prev := Curr;
- Curr := Curr.Next;
- end;
- end;
- procedure TPlMenu.WriteList(Head: TNamesPt; FileName: string);
- var
- Curr: TNamesPt;
- i: Integer;
- OutputFile: file of TData;
- begin
- AssignFile(OutputFile, FileName);
- Reset(OutputFile);
- Curr := Head;
- i := 0;
- while (Curr <> nil) do
- begin
- Seek(OutputFile, i);
- Write(OutputFile, Curr.Data);
- Curr := Curr.Next;
- Inc(i);
- end;
- CloseFile(OutputFile);
- end;
- function TPlMenu.CheckAndSaveName(Name: TMyString): Boolean;
- const
- FileName = 'Names';
- var
- Head, Curr, Prev: TNamesPt;
- FileData, Data: TData;
- OutputFile: file of TData;
- IsFound: Boolean;
- i: Integer;
- begin
- Result := True;
- if FileExists(FileName) then
- begin
- AssignFile(OutputFile, FileName);
- Reset(OutputFile);
- Read(OutputFile, FileData);
- New(Head);
- Head.Data := FileData;
- Head.Next := nil;
- Curr := Head;
- Seek(OutputFile, 1);
- while not EOF(OutputFile) do
- begin
- Read(OutputFile, FileData);
- AddElem(FileData, Curr);
- Curr := Curr.Next;
- end;
- CloseFile(OutputFile);
- Result := IsNameFounded(IsFound, Head, Curr, Name);
- if not IsFound then
- begin
- Data.Name := Name;
- AddElem(Data, Curr);
- WriteList(Head, FileName);
- end;
- DeleteList(Head);
- end
- else
- begin
- Data.Name := Name;
- AssignFile(OutputFile, FileName);
- Rewrite(OutputFile);
- Write(OutputFile, Data);
- CloseFile(OutputFile);
- end;
- end;
- procedure TPlMenu.NameAcception(Name: string);
- begin
- if FileAvailable then
- Main.mpSound.Play;
- laYesCase.Visible := False;
- eName.Visible := False;
- cbNames.Visible := False;
- sbAcceptName.Visible := False;
- laQuestion.Visible := False;
- laWelcome.Visible := True;
- laWelcome.Caption := msgWelcomeStart + Name + msgWelcomeEnd;
- Main.laPlayerName.Caption := Name ;
- EndTimer.Enabled := True;
- end;
- procedure TPlMenu.sbAcceptNameClick(Sender: TObject);
- var
- IsCorrect: Boolean;
- begin
- if State = 1 then
- begin
- IsCorrect := CheckAndSaveName(eName.Text);
- if IsCorrect then
- NameAcception(eName.Text)
- else
- begin
- MessageDlg(msgNameIsTaken, mtWarning, [mbOk], 0);
- eName.Clear;
- end;
- end
- else
- begin
- NameAcception(cbNames.Text);
- end;
- end;
- procedure TPlMenu.InputFromFile(Sender: TObject);
- const
- FileName = 'Names';
- var
- InputFile: File of TData;
- FileData: TData;
- begin
- AssignFile(InputFile, FileName);
- Reset(InputFile);
- while not EOF(InputFile) do
- begin
- Read(InputFile, FileData);
- cbNames.AddItem(FileData.Name, Sender);
- end;
- CloseFile(InputFile);
- end;
- procedure TPlMenu.sbNoClick(Sender: TObject);
- begin
- if FileAvailable then
- Main.mpSound.Play;
- State := 2;
- laQuestion.Caption := msgChooseName;
- sbYes.Visible := False;
- sbNo.Visible := False;
- cbNames.Visible := True;
- InputFromFile(Sender);
- sbAcceptName.Visible := True;
- end;
- procedure TPlMenu.sbYesClick(Sender: TObject);
- begin
- if FileAvailable then
- Main.mpSound.Play;
- State := 1;
- laQuestion.Visible := False;
- sbYes.Visible := False;
- sbNo.Visible := False;
- sbAcceptName.Visible := True;
- laYesCase.Visible := True;
- eName.Visible := True;
- eName.SetFocus;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement