Delphi:在我的程序中创建登录和注册功能时遇到问题

时间:2014-11-06 20:01:15

标签: delphi

我陷入了编程程序的一部分。我试图登录,自己注册程序,所以如果我做对了,我可以将编码复制并粘贴到我的原始编码中,但我失败了。

我正在使用文本文件来存储所有信息。我希望用户能够使用我存储在文本文件中的密码和用户名登录。要注册用户,请在不同的编辑框中输入他们的姓名,密码,用户名和电子邮件地址,然后单击注册。

我尝试对其进行编码,因此所有信息最终都会以*将其分开并将*之前的信息复制到单独的面板或备忘录中,以便以后在用户想要时使用登录。

我也在这个过程中尝试在整个程序中声明文本文件,但同样也失败了。我真的想继续我的编码,但这实际上阻止了我。

到目前为止,这是我的代码:

var
  myFile : Textfile;
  sLyn,
  sNaam,
  sEmail,
  sPassword,
  sUsername,
  sEditP,
  sEditE,
  sEditU,
  sEditN : string;
  iPos : integer;
begin
  RichEdit1.Lines.Clear;
  RichEdit1.Paragraph.TabCount := 3;
  RichEdit1.Paragraph.Tab[0] := 90;
  RichEdit1.Paragraph.Tab[1] := 180;
  RichEdit1.Paragraph.Tab[2] := 270;

  //1
  Assignfile(myFile,'Data.txt');
  //2
  If FileExists('Data.txt') <> True Then begin
    exit;
  //Stop coding as dit nie bestaan nie
  end;
  //3
  Reset(myFile); ReadLN(myFile,sLyn);
  //Naam en van, Password, Email Adres, Username

  iPos := POS('',sLyn);
  sNaam := COPY(sLyn,1,iPos-1);
  Delete(sLyn,1,iPos+1);
  iPos := POS('',sLyn);
  sPassword := COPY(sLyn,1,iPos-1);
  Delete(sLyn,1,iPos+1);
  iPos := POS('*',sLyn);
  sEmail:= COPY(sLyn,1,iPos-1);
  Delete(sLyn,1,iPos+1);
  sUsername := sLyn; //Toets of die persoon als ingevul het

  If Length(EditCreatePassword.Text) = 8 then begin
    sEditP := EditCreatePassword.Text;
    sEditP := sPassword;
  end
  else begin
    ShowMessage('Please enter a password of 8 characters');
    exit;
  end;

  If Length(EditEmail.Text) > 0 then begin
    sEditE := EditEmail.Text;
    sEmail := sEditE;
  end
  else begin
    ShowMessage('Please enter your email adress');
    exit;
  end;

  If Length(EditName.text) > 0 then begin
    sEditN := EditName.Text;
    sNaam := sEditN;
  end
  else begin
    ShowMessage('Please enter your name and surname');
    exit;
  end;

  If Length(EditUser.Text) <9 then begin
    sEditU := EditUser.Text;
    sUsername := sEditU;
  end
  else begin
    ShowMessage('Please enter a username of 8 characters');
    exit;
  end;

  Richedit1.Lines.Add(sNaam+''+sPassword+''+sEmail+''+sUsername+'');

  //4
  While Not EOF(myFile) Do
  //5
  begin
    ReadLN(myFile,sLyn); //Naam en van, Password, Email Adres, Username
    iPos := POS('*',sLyn);
    sNaam := COPY(sLyn,1,iPos-1);
    Delete(sLyn,1,iPos+1);
    iPos := POS('',sLyn);
    sPassword := COPY(sLyn,1,iPos-1);
    Delete(sLyn,1,iPos+1);
    iPos := POS('',sLyn);
    sEmail:= COPY(sLyn,1,iPos-1);
    Delete(sLyn,1,iPos+1);
    sUsername := sLyn;
    If Length(EditCreatePassword.Text) = 8 then begin
      sEditP := EditCreatePassword.text;
      sPassword := sEditP;
    end
    else begin
      ShowMessage('Please enter a password of 8 characters');
      exit;
    end;

    If Length(EditEmail.Text) > 0 then begin
      sEditE := EditEmail.Text;
      sEmail := sEditE;
    end
    else begin
      ShowMessage('Please enter your email adress');
      exit;
    end;

    If Length(EditName.text) > 0 then begin
      sEditN := EditName.Text;
      sNaam := sEditN;
    end
    else begin
      ShowMessage('Please enter your name and surname');
      exit;
    end;

    If Length(EditUser.Text) < 9 then begin
      sEditU := EditUser.Text;
      sUsername := sEditU;
    end
    else begin
      ShowMessage('Please enter a username of 8 characters');
      exit;
    end;

    Richedit1.Lines.Add(sNaam+''+sPassword+''+sEmail+''+sUsername+'');

  end;
  //6
  Closefile(myFile);

任何有关解决此问题的帮助都将非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定以下内容是否会解决您遇到的确切问题,但即便如此 如果没有,它应该可以帮助您大大简化解码读取行的代码 你的数据文件。简化几乎总是与代码有关。

假设您有一个变量Line,其中包含您刚刚从中读取的行的文本 文件并包含类似

的内容
1a*2bc*3def*ghij

然后,您可以使用TStringList的内置功能将其解析为 提取* s之间的字符串。这是一个独立的例程:

procedure TDefaultForm.TestParse;
var
  Line,
  S1,
  S2,
  S3,
  S4 : String;
  TL : TStringList;
begin
  Line := '1a*2bc*3def*4ghij';

  TL := TStringList.Create;
  try
    TL.Delimiter := '*';
    TL.DelimitedText := Line;
    S1 := TL[0]; // the 0 is because the lines of the stringlist contents are indexed from 0, not 1
    S2 := TL[1];
    S3 := TL[2];
    S4 := TL[3];
  finally
    TL.Free;
  end;
end;

在TL.Free上设置一个断点并使用Ctrl-F7来评估S1等,你会发现它们包含'1a','2bc','3def','4ghij'。

在您的情况下,您将在开始阅读文件之前创建字符串列表 之后,当然是免费的。

上面的代码没有错误检查,因此会因“list index out of bounds”错误而失败 在一条少于3 * s的线上。在实际代码中,至少应该检查一下 您正在使用的索引值(如在TL [Index]中)小于或等于TL.Count - 1.

当然,如果这不符合您坚持的观点,您最好编辑您的q(不添加评论)以准确解释您 卡住了什么上。