使用普通字符串似乎更实用。在评论中,您担心会丢失一些功能,并说:“检测 [enter] 时我正在换行”。sLineBreak
通过为行尾 (EOL) 标记附加一个常量,您可以轻松地使用普通字符串支持这一点。在 Windows 上,这等于#13#10
(回车和换行)。您唯一需要注意的是,当您使用退格键删除 EOL 时,您需要删除正确数量的字符:Windows 为 2,Linux/MAC 为 1。Length(sLineBreak)
会告诉你有多少。
您可能要考虑的另一个选项是TStringBuilder
类。它旨在建立零碎的字符串,因此可以满足您的目的。
最后,如果你真的想使用TStringList
,你可以单独操作字符串(即不使用Text
属性):
FInputData: TStrings;
FInputData := TStringList.Create;
FInputData.Add(''); { Important to always have at least 1 string }
{ When adding a character "Ch" }
FInputData[FInputData.Count-1] := FInputData[FInputData.Count-1] + Ch;
{ When detecting the Enter Key }
FInputData.Add('');
{ When detecting Backspace }
S := FInputData[FInputData.Count-1];
if (S <> '') then
begin
{ Delete last character on current line }
Delete(S, Length(S), 1);
FInputData[FInputData.Count-1] := S;
end
else if (S = '') and (FInputData.Count > 1) then
begin
{ Go back to previous line if current is empty, but don't delete if
there's nothing left. (Remember: always have at least 1 string) }
FInputData.Delete(FInputData.Count-1);
end;
{ To write the current data }
Writeln(FInputData.Text);