我陷入了编程程序的一部分。我试图登录,自己注册程序,所以如果我做对了,我可以将编码复制并粘贴到我的原始编码中,但我失败了。
我正在使用文本文件来存储所有信息。我希望用户能够使用我存储在文本文件中的密码和用户名登录。要注册用户,请在不同的编辑框中输入他们的姓名,密码,用户名和电子邮件地址,然后单击注册。
我尝试对其进行编码,因此所有信息最终都会以*
将其分开并将*
之前的信息复制到单独的面板或备忘录中,以便以后在用户想要时使用登录。
我也在这个过程中尝试在整个程序中声明文本文件,但同样也失败了。我真的想继续我的编码,但这实际上阻止了我。
到目前为止,这是我的代码:
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);
任何有关解决此问题的帮助都将非常感激。谢谢。
答案 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(不添加评论)以准确解释您 卡住了什么上。