Advertisement
Guest User

Untitled

a guest
May 17th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.69 KB | None | 0 0
  1. unit UnitIntro;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.ExtCtrls,
  8.   Vcl.Buttons, UnitStrings;
  9.  
  10. type
  11.    TMyString = string[11];
  12.    TData = record
  13.       Name: TMyString;
  14.    end;
  15.    TNamesPt = ^TNames;
  16.    TNames = record
  17.       Data: TData;
  18.       Next: TNamesPt;
  19.    end;
  20.   TPlMenu = class(TForm)
  21.     Empty: TPopupMenu;
  22.     iBackground: TImage;
  23.     laQuestion: TLabel;
  24.     sbYes: TSpeedButton;
  25.     sbNo: TSpeedButton;
  26.     laYesCase: TLabel;
  27.     eName: TEdit;
  28.     sbAcceptName: TSpeedButton;
  29.     laWelcome: TLabel;
  30.     EndTimer: TTimer;
  31.     cbNames: TComboBox;
  32.     procedure sbYesClick(Sender: TObject);
  33.     procedure sbAcceptNameClick(Sender: TObject);
  34.     procedure EndTimerTimer(Sender: TObject);
  35.     procedure eNameKeyPress(Sender: TObject; var Key: Char);
  36.     procedure eNameChange(Sender: TObject);
  37.     function CheckAndSaveName(Name: TMyString): Boolean;
  38.     procedure AddElem(Data: TData; var Prev: TNamesPt);
  39.     procedure sbNoClick(Sender: TObject);
  40.     procedure NameAcception(Name: string);
  41.     procedure InputFromFile(Sender: TObject);
  42.     procedure cbNamesChange(Sender: TObject);
  43.     procedure cbNamesKeyPress(Sender: TObject; var Key: Char);
  44.     procedure FormCreate(Sender: TObject);
  45.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  46.     procedure eNameKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  47.     procedure DeleteList(var Head: TNamesPt);
  48.     function IsNameFounded(var IsFound: Boolean; Head: TNamesPt;
  49.       var Prev: TNamesPt; Name: TMyString): Boolean;
  50.     procedure WriteList(Head: TNamesPt; FileName: string);
  51.     function IsFileCorrect(FileName: string): Boolean;
  52.   private
  53.     { Private declarations }
  54.   public
  55.     { Public declarations }
  56.   end;
  57.  
  58. var
  59.   PlMenu: TPlMenu;
  60.  
  61. implementation
  62.  
  63. {$R *.dfm}
  64.  
  65. uses UnitMain;
  66.  
  67. const
  68.    PreStartDelay = 2000;
  69.  
  70. var
  71.    TimeLeft: Integer;
  72.    State: Byte; //1 for Yes; 2 for No
  73.  
  74. procedure TPlMenu.eNameChange(Sender: TObject);
  75. begin
  76.    if Length(eName.Text) > 0 then
  77.       sbAcceptName.Enabled := True
  78.    else
  79.       sbAcceptName.Enabled := False;
  80. end;
  81.  
  82. procedure TPlMenu.eNameKeyDown(Sender: TObject; var Key: Word;
  83.   Shift: TShiftState);
  84. begin
  85.    if ssShift in Shift then
  86.       Key := 0;
  87. end;
  88.  
  89. procedure TPlMenu.eNameKeyPress(Sender: TObject; var Key: Char);
  90. const
  91.    Latin: set of Char = ['A'..'Z', 'a'..'z', #8];
  92. begin
  93.    if (Key = #13) and sbAcceptName.Enabled then
  94.       sbAcceptNameClick(Sender);
  95.    if not (Key in Latin) then
  96.       Key := #0;
  97. end;
  98.  
  99. procedure TPlMenu.EndTimerTimer(Sender: TObject);
  100. begin
  101.    TimeLeft := TimeLeft - 1000;
  102.    if (TimeLeft = 0) then
  103.       Self.Close;
  104. end;
  105.  
  106. procedure TPlMenu.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  107. begin
  108.    CanClose := False;
  109.    if TimeLeft = 0 then
  110.       CanClose := True;
  111. end;
  112.  
  113. function TPlMenu.IsFileCorrect(FileName: string): Boolean;
  114. const
  115.    Letters: set of Char = ['A'..'Z', 'a'..'z'];
  116. var
  117.    OutputFile: file of TData;
  118.    i: Integer;
  119.    FileData: TData;
  120.    IsCorrect: Boolean;
  121. begin
  122.    IsCorrect := True;
  123.    AssignFile(OutputFile, FileName);
  124.    Reset(OutputFile);
  125.    if EOF(OutputFile) then
  126.    begin
  127.       CloseFile(OutputFile);
  128.       Erase(OutputFile);
  129.       IsCorrect := False;
  130.       ShowMessage(msgFileIsInvalid);
  131.    end
  132.    else
  133.    begin
  134.       Reset(OutputFile);
  135.       Read(OutputFile, FileData);
  136.       CloseFile(OutputFile);
  137.       i := 1;
  138.       while (i <= Length(FileData.Name)) and IsCorrect do
  139.       begin
  140.          if not(FileData.Name[i] in Letters) then
  141.          begin
  142.             IsCorrect := False;
  143.             ShowMessage(msgFileIsInvalid);
  144.             DeleteFile(FileName);
  145.          end;
  146.          Inc(i);
  147.       end;
  148.    end;
  149.    Result := IsCorrect;
  150. end;
  151.  
  152. procedure TPlMenu.FormCreate(Sender: TObject);
  153. const
  154.    FileName = 'Names';
  155. begin
  156.    iBackground.Picture.Bitmap.LoadFromResourceName(HInstance, 'IMAGE6');
  157.    TimeLeft := PreStartDelay;
  158.    if FileExists(FileName) and IsFileCorrect(FileName) then
  159.       sbNo.Enabled := True
  160.    else
  161.       sbNo.Enabled := False;
  162. end;
  163.  
  164. procedure TPlMenu.AddElem(Data: TData; var Prev: TNamesPt);
  165. var
  166.    Curr: TNamesPt;
  167. begin
  168.    New(Curr);
  169.    Curr.Data := Data;
  170.    Prev.Next := Curr;
  171.    Curr.Next := nil;
  172. end;
  173.  
  174. procedure TPlMenu.cbNamesChange(Sender: TObject);
  175. begin
  176.    if Length(cbNames.Text) > 0  then
  177.       sbAcceptName.Enabled := True
  178.    else
  179.       sbAcceptName.Enabled := False;
  180. end;
  181.  
  182. procedure TPlMenu.cbNamesKeyPress(Sender: TObject; var Key: Char);
  183. begin
  184.    if (Key = #13) and sbAcceptName.Enabled then
  185.       sbAcceptNameClick(Sender);
  186. end;
  187.  
  188. procedure TPlMenu.DeleteList(var Head: TNamesPt);
  189. var
  190.    Curr: TNamesPt;
  191. begin
  192.    while (Head <> nil) do
  193.    begin
  194.       Curr := Head.Next;
  195.       Dispose(Head);
  196.       Head := Curr;
  197.    end;
  198. end;
  199.  
  200. function TPlMenu.IsNameFounded(var IsFound: Boolean; Head: TNamesPt;
  201.   var Prev: TNamesPt; Name: TMyString): Boolean;
  202. var
  203.    Curr: TNamesPt;
  204. begin
  205.    Curr := Head;
  206.    Result := True;
  207.    IsFound := False;
  208.    while (Curr <> nil) and not IsFound do
  209.    begin
  210.       if Curr.Data.Name = Name then
  211.       begin
  212.          Result := False;
  213.          IsFound := True;
  214.       end;
  215.       Prev := Curr;
  216.       Curr := Curr.Next;
  217.    end;
  218. end;
  219.  
  220. procedure TPlMenu.WriteList(Head: TNamesPt; FileName: string);
  221. var
  222.    Curr: TNamesPt;
  223.    i: Integer;
  224.    OutputFile: file of TData;
  225. begin
  226.    AssignFile(OutputFile, FileName);
  227.    Reset(OutputFile);
  228.    Curr := Head;
  229.    i := 0;
  230.    while (Curr <> nil) do
  231.    begin
  232.       Seek(OutputFile, i);
  233.       Write(OutputFile, Curr.Data);
  234.       Curr := Curr.Next;
  235.       Inc(i);
  236.    end;
  237.    CloseFile(OutputFile);
  238. end;
  239.  
  240. function TPlMenu.CheckAndSaveName(Name: TMyString): Boolean;
  241. const
  242.    FileName = 'Names';
  243. var
  244.    Head, Curr, Prev: TNamesPt;
  245.    FileData, Data: TData;
  246.    OutputFile: file of TData;
  247.    IsFound: Boolean;
  248.    i: Integer;
  249. begin
  250.    Result := True;
  251.    if FileExists(FileName) then
  252.    begin
  253.       AssignFile(OutputFile, FileName);
  254.       Reset(OutputFile);
  255.       Read(OutputFile, FileData);
  256.       New(Head);
  257.       Head.Data := FileData;
  258.       Head.Next := nil;
  259.       Curr := Head;
  260.       Seek(OutputFile, 1);
  261.       while not EOF(OutputFile) do
  262.       begin
  263.          Read(OutputFile, FileData);
  264.          AddElem(FileData, Curr);
  265.          Curr := Curr.Next;
  266.       end;
  267.       CloseFile(OutputFile);
  268.       Result := IsNameFounded(IsFound, Head, Curr, Name);
  269.       if not IsFound then
  270.       begin
  271.          Data.Name := Name;
  272.          AddElem(Data, Curr);
  273.          WriteList(Head, FileName);
  274.       end;
  275.       DeleteList(Head);
  276.    end
  277.    else
  278.    begin
  279.       Data.Name := Name;
  280.       AssignFile(OutputFile, FileName);
  281.       Rewrite(OutputFile);
  282.       Write(OutputFile, Data);
  283.       CloseFile(OutputFile);
  284.    end;
  285. end;
  286.  
  287. procedure TPlMenu.NameAcception(Name: string);
  288. begin
  289.    if FileAvailable then
  290.       Main.mpSound.Play;
  291.    laYesCase.Visible := False;
  292.    eName.Visible := False;
  293.    cbNames.Visible := False;
  294.    sbAcceptName.Visible := False;
  295.    laQuestion.Visible := False;
  296.    laWelcome.Visible := True;
  297.    laWelcome.Caption := msgWelcomeStart + Name + msgWelcomeEnd;
  298.    Main.laPlayerName.Caption := Name ;
  299.    EndTimer.Enabled := True;
  300. end;
  301.  
  302. procedure TPlMenu.sbAcceptNameClick(Sender: TObject);
  303. var
  304.    IsCorrect: Boolean;
  305. begin
  306.    if State = 1 then
  307.    begin
  308.      IsCorrect := CheckAndSaveName(eName.Text);
  309.      if IsCorrect then
  310.         NameAcception(eName.Text)
  311.      else
  312.      begin
  313.         MessageDlg(msgNameIsTaken, mtWarning, [mbOk], 0);
  314.         eName.Clear;
  315.      end;
  316.    end
  317.    else
  318.    begin
  319.       NameAcception(cbNames.Text);
  320.    end;
  321. end;
  322.  
  323. procedure TPlMenu.InputFromFile(Sender: TObject);
  324. const
  325.    FileName = 'Names';
  326. var
  327.    InputFile: File of TData;
  328.    FileData: TData;
  329. begin
  330.    AssignFile(InputFile, FileName);
  331.    Reset(InputFile);
  332.    while not EOF(InputFile) do
  333.    begin
  334.       Read(InputFile, FileData);
  335.       cbNames.AddItem(FileData.Name, Sender);
  336.    end;
  337.    CloseFile(InputFile);
  338. end;
  339.  
  340. procedure TPlMenu.sbNoClick(Sender: TObject);
  341. begin
  342.    if FileAvailable then
  343.       Main.mpSound.Play;
  344.    State := 2;
  345.    laQuestion.Caption := msgChooseName;
  346.    sbYes.Visible := False;
  347.    sbNo.Visible := False;
  348.    cbNames.Visible := True;
  349.    InputFromFile(Sender);
  350.    sbAcceptName.Visible := True;
  351. end;
  352.  
  353. procedure TPlMenu.sbYesClick(Sender: TObject);
  354. begin
  355.    if FileAvailable then
  356.       Main.mpSound.Play;
  357.    State := 1;
  358.    laQuestion.Visible := False;
  359.    sbYes.Visible := False;
  360.    sbNo.Visible := False;
  361.    sbAcceptName.Visible := True;
  362.    laYesCase.Visible := True;
  363.    eName.Visible := True;
  364.    eName.SetFocus;
  365. end;
  366.  
  367. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement