我通过在运行时将所有字符串放在TStringList中来实现应用程序中的语言转换:
procedure PopulateStringList;
begin
EnglishStringList.Append('CAN_T_FIND_FILE=It is not possible to find the file');
EnglishStringList.Append('DUMMY=Just a dummy record');
// total of 2000 record appended in the same way
EnglishStringList.Sorted := True; // Updated comment: this is USELESS!
end;
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方式获得翻译:
function GetTranslation(ResStr:String):String;
var
iIndex : Integer;
begin
iIndex := -1;
iIndex := EnglishStringList.IndexOfName(ResStr);
if iIndex >= 0 then
Result := EnglishStringList.ValueFromIndex[iIndex] else
Result := ResStr + ' (Translation N/A)';
end;
Run Code Online (Sandbox Code Playgroud)
无论如何使用这种方法找到一条记录需要大约30微秒,是否有更好的方法来实现相同的结果?
更新:为了将来的参考,我在这里写了建议使用TDictionary的新实现(适用于Delphi 2009及更新版本):
procedure PopulateStringList;
begin
EnglishDictionary := TDictionary<String, String>.Create;
EnglishDictionary.Add('CAN_T_FIND_FILE','It is …Run Code Online (Sandbox Code Playgroud) 在Delphi 6中,如果您尝试将对象插入到已排序的TStringList(Sorted = true),则会抛出异常,警告您在排序列表上不允许使用InsertObject().如果调用InsertObject()必然意味着破坏列表的Sorted顺序,我可以理解这一点.但鉴于TStringList.Find()方法:
function TStringList.Find(const S: string; var Index: Integer): Boolean;
Run Code Online (Sandbox Code Playgroud)
返回一个索引,告诉你如果给定字符串添加到列表中的插入索引应该是什么,使用该索引调用InsertObject()应该在操作后保持排序列表仍然按排序顺序.我已经检查了TStringList的Delphi源代码,它似乎证实了我的断言.
现在我只是为TStringList创建一个新的子类,它覆盖了InsertObject(),并且如果在排序列表中调用了InsertObject(),则不会抛出异常,但我想确保没有一些隐藏的危险我我只是没有看到.
- roschler
我有一个列表框或列表视图与项目.我有一个字符串列表与列表框/列表视图相同的项目(字符串).我想从字符串列表中删除列表框/列表视图中的所有选定项目.
怎么做?
for i:=0 to ListBox.Count-1 do
if ListBox.Selected[i] then
StringList1.Delete(i); // I cannot know exactly an index, other strings move up
Run Code Online (Sandbox Code Playgroud) 第一个程序:
procedure TestOne(List : TStringList);
var
TempList : TStringList;
begin
TempList := TStringList.Create;
TempList.Add('Test');
List := TempList;
TempList.Free;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
aList : TStringList;
begin
aList := TStringList.Create;
TestOne(aList);
Memo1.Lines := aList;
end;
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,备忘录不显示任何内容,并且断点显示该过程不执行此行:
List := TempList;
Run Code Online (Sandbox Code Playgroud)

我修改了程序:
procedure TestTwo(List : TStringList);
var
TempList : TStringList;
begin
TempList := TStringList.Create;
TempList.Add('Test');
List.Text := TempList.Text;
//or
List.Assign(TempList);
//List := TempList;
TempList.Free;
end;
Run Code Online (Sandbox Code Playgroud)
这次它有效.
那么为什么它不能使用List := TempList;?
我如何能够非常快速地将数百万条记录从tadotable加载到stringlist中?
procedure TForm1.SlowLoadingIntoStringList(StringList: TStringList);
begin
StringList.Clear;
with SourceTable do
begin
Open;
DisableControls;
try
while not EOF do
begin
StringList.Add(FieldByName('OriginalData').AsString);
Next;
end;
finally
EnableControls;
Close;
end;
end;
Run Code Online (Sandbox Code Playgroud) 这是我的分隔文本:$ HEHDT,10.17,T*28 $ HEHDT,10.18,T*2A等......
逗号是我的句子分隔符.但是,我也希望使用星号作为我的分隔符.
我想要实现的输出是:
$ HEHDT 10.17 T 28 $ HEHDT 10.18 T 2A
如何在delphi中指定多个句子分隔符?这是我到目前为止的代码.
var
MyStringList: TStringList;
i: Integer;
begin
MyStringList:= TStringList.Create;
MyStringList.Delimiter := ','
MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10;
for i= 0 to MyStringList.Count-1 do
ShowMessage(MyStringList[i]);
MyStringList.Free;
end;
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,它只将逗号作为分隔符.如何包括2个分隔符,包括逗号和星号?
提前谢谢了!=)
我有一个需要在TStringList中进行大量文本操作的应用程序.基本上我需要用分隔符分割文本; 例如,如果我有一个带有1000个字符的单行,并且此分隔符在此行中出现3次,那么我需要将其拆分为3行.分隔符可以包含多个char,例如,它可以是"[test]"之类的标记.
我用两种不同的方法编写了两个函数来完成这个任务,但是大量的文本都很慢(通常超过2个字节).
我怎样才能更快地实现这一目标?
这两个函数都接收2个参数:'lines'是原始的tstringlist,'q'是分隔符.
function splitlines(lines : tstringlist; q: string) : integer;
var
s, aux, ant : string;
i,j : integer;
flag : boolean;
m2 : tstringlist;
begin
try
m2 := tstringlist.create;
m2.BeginUpdate;
result := 0;
for i := 0 to lines.count-1 do
begin
s := lines[i];
for j := 1 to length(s) do
begin
flag := lowercase(copy(s,j,length(q))) = lowercase(q);
if flag then
begin
inc(result);
m2.add(aux);
aux := s[j];
end
else
aux := aux + s[j];
end;
m2.add(aux);
aux …Run Code Online (Sandbox Code Playgroud) 我正在重构Inno Setup项目,对我来说不太清楚的是使用TArrayOfString,String和TStringList数组.这三种类型有什么不同?据我所知,它的使用似乎没有区别.所有三个存储字符串,我可以使用数组\列表获取存储的字符串,如下所示:arrayName[i].
当使用其中一个时,是一个更快还是被认为是错误的编码?我希望有人可以在这件事上给我带来清晰的认识.
当我将对象从TStringList类文件内容保存到文件时,该文件默认使用UTF-8保存,但UTF-8保存为BOM.
我的代码是:
myFile := TStringList.Create;
try
myFile.Text := myData;
myFile.saveToFile('myfile.dat', TEncoding.UTF8)
finally
FreeAndNil(myFile);
end;
Run Code Online (Sandbox Code Playgroud)
在示例中,文件"myfile.dat"显示为"UTF-8 BOM"编码.
如何在没有BOM的情况下保存文件?
我正在使用 Embarcadero 的 Rad Studio Delphi (10.2.3),并且在读取非常大的文本文件(700 万行以上,每行都不同,行长度可以是 1 到 ~200 个字符等)时遇到内存问题。我对 Delphi 编程相当陌生,所以在发帖之前我已经搜索过 SO 和 Google 寻求帮助。
我最初实现了一个 TStringList 并使用 LoadFromFile 方法读取文件,但是当处理的文本文件变得足够大时,这会失败。然后,我实现了一个 TStreamReader 并使用 ReadLn 使用此处找到的基本代码填充 TStringList:
TStringList.LoadFromFile - 大文本文件的异常
代码示例:
//MyStringList.LoadFromFile(filename);
Reader := TStreamReader.Create(filename, true);
try
MyStringList.BeginUpdate;
try
MyStringList.Clear;
while not Reader.EndOfStream do
MyStringList.Add(Reader.ReadLine);
finally
MyStringList.EndUpdate;
end;
finally
Reader.Free;
end;
Run Code Online (Sandbox Code Playgroud)
在我需要处理的文件变得巨大(约 700 万行以上)之前,这种方法一直很有效。看起来 TStringList 变得太大以至于内存不足。我说“出现”是因为我实际上无权访问正在运行的文件,并且所有错误信息都是由我的客户通过电子邮件提供的,这使得这个问题变得更加困难,因为我无法简单地在 IDE 中调试它。
该代码是32位编译的,我无法使用64位编译器。我也不能包括数据库系统之类的。不幸的是,我有一些严格的限制。我需要加载每一行以查找模式并将这些行与其他行进行比较以查找“模式中的模式”。我很抱歉在这里说得很含糊。
底线是——有没有一种方法可以在不使用 TStringList 的情况下访问文本文件中的每一行,或者也许有更好的方法来处理 TStringList 内存?
也许有一种方法可以将 StreamReader 中的特定行块加载到 TStringList 中(例如,读取前 100,000 行并处理,接下来的 100,000 行等),而不是一次加载所有内容?我想我可以写一些东西来处理可能的“块间”模式。
预先感谢您的任何和所有帮助和建议!
***** 编辑更新 *****
好的,这是我需要实现的基本解决方案:
var …Run Code Online (Sandbox Code Playgroud) tstringlist ×10
delphi ×9
delimiter ×1
delphi-2007 ×1
exception ×1
inno-setup ×1
readline ×1
sorted ×1
sortedlist ×1
split ×1
string ×1
tadotable ×1
text ×1
utf-8 ×1