我编写了一个Delphi函数,将.dat文件中的数据加载到字符串列表中.然后它解码字符串列表并分配给字符串变量.字符串的内容使用'#'符号作为分隔符.
然后,我如何获取此字符串的内容,然后将其内容分配给局部变量?
// Function loads data from a dat file and assigns to a String List.
function TfrmMain.LoadFromFile;
var
index, Count : integer;
profileFile, DecodedString : string;
begin
// Open a file and assign to a local variable.
OpenDialog1.Execute;
profileFile := OpenDialog1.FileName;
if profileFile = '' then
exit;
profileList := TStringList.Create;
profileList.LoadFromFile(profileFile);
for index := 0 to profileList.Count - 1 do
begin
Line := '';
Line := profileList[Index];
end;
end;
Run Code Online (Sandbox Code Playgroud)
在解码后,var"Line"包含如下所示的内容:
例:
Line '23#80#10#2#1#...255#'.
Run Code Online (Sandbox Code Playgroud)
并非所有分隔符之间的值都是相同的长度,并且每次调用函数LoadFromFile时"Line"的值都会变化(例如,有时一个值可能只有一个数字,接下来的两个或三个等等,所以我不能依赖于复制字符串或数组的函数).
我试图找出循环"Line"内容的方法,将其分配给名为"buffer"的局部变量,然后如果遇到'#'则将缓冲区的值赋给局部变量,将缓冲区重新初始化为''; 然后移动到"Line"中的下一个值,重复下一个参数的过程,每次忽略'#'.
我想我现在已经解决了这个问题太久了,我似乎无法取得任何进展,需要休息一下.如果有人愿意看一看,我欢迎任何关于如何实现这一目标的建议.
非常感谢
KD
我有一个大的xml文件,我希望将每个id,source和target保存在stringlist中,以便在成功导入到stringlists后生成一个查询到mysql.
下面是我的xml片段:
xliff version="1.1">
<file original="Xliff Demo" source-language="EN" target-language="DE" datatype="html">
<header>
<skl>
<external-file uid="017dbcf0-c82c-11e2-ba2b-005056c00008" href="skl\simple.htm.skl"/>
</skl>
</header>
<body>
<trans-unit id="00ffmnpB5wBV5KFqBxuHLi4fwJvvuB">
<source xml:lang="EN">1lnRUfBBeHtbS96uULSht42VNMN7XE4qt9JrOcWhtoTuhnbAQ9</source>
<target xml:lang="DE">zZvOLJfLCy9oP5GQYfEqw5LAeC2ESAxRmVe1JyQdmJ1eG2jz1N</target>
<note/></trans-unit>
<trans-unit id="00kjUwy1rJ54bEGYp7XZvtBiY32pmj">
<source xml:lang="EN">HXOQLUWkfJg206vRw8lyWhCWChOacVxbMukfQ0HUdNHSI18GG4</source>
<target xml:lang="DE">8dsX38mezeZ0w0w37LI66CDRuI8gBD23zT5KR4iqYNv3IGUgH0</target>
<note/></trans-unit>
<trans-unit id="00kk3Af8SFpHyelAaYrgK58b9GbIDj">
<source xml:lang="EN">wQFxZiCiRsSNWs20G4WXAmDBRdRL6fcrrJnCgtbiXGSfHzpYrT</source>
<target xml:lang="DE">oFVTUdPkExOhISYofIImLsnVKd3NSZg32tyeP5iRxRZdmuYQDy</target>
<note/></trans-unit>
<trans-unit id="00Ky2dmDU9wGTWBnJxeL9b9gkts5UQ">
<source xml:lang="EN">nHQcjAW02lWe0SyOhqGtyqUhpwQ8qgWX3rUynMRf4BDHfVdHOC</source>
<target xml:lang="DE">0CURp1dcZydB1V2rEZ1lnOhmYufOYbrLbh84e1ZnALlzZPVq4F</target>
<note/></trans-unit>
<trans-unit id="00pMSFlBfA3bJ8Xy9I78wz6XisPYcV">
<source xml:lang="EN">IuhtaVnZtF67nxKz5dbmuy8BEMTs2X1120FzDtIplKF2Me5AsQ</source>
<target xml:lang="DE">1BGSJQDZBm4UW974pucnX3XHuYOQYpC7nTcIH01rbKlOkVi9bo</target>
<note/></trans-unit>
<trans-unit id="012w2kb2d1Lo6NbJLE0BawThzsSuCJ">
<source xml:lang="EN">0RoniOGZ7V7WTF1YQg59B8jBhRxnLVXscC1LOGPzKPYRs76oIz</source>
<target xml:lang="DE">gyw15fkHTni2aUGWI5qiPHEz8vsJJJsW4OOqKwGYL1qzfUVfLO</target>
<note/></trans-unit>
...
..
..
Run Code Online (Sandbox Code Playgroud)
所以我尝试在单独的字符串列表中保存trans-unit id,source xml:lang"EN",target xml:lang ="DE"的每个条目,但只保存值.
那是我的代码:
{ ----------- Import Procedure ------------ }
procedure TForm2.Button2Click(Sender: TObject);
var
xmlFile, …Run Code Online (Sandbox Code Playgroud) 我有一个系统,它加载一些压缩到“.log”文件中的文本文件,然后使用多个线程将其解析为信息类,每个线程处理不同的文件并将解析的对象添加到列表中。该文件是使用 TStringList 加载的,因为它是我测试过的最快的方法。
文本文件的数量是可变的,但通常我必须在一次入侵中处理 5 到 8 个文件,范围从 50Mb 到 120Mb。
我的问题:用户可以根据需要多次加载 .log 文件,在其中一些进程之后,我在尝试使用 TStringList.LoadFromFile 时收到 EOutOfMemory 异常。当然,任何使用过 StringList 的人首先想到的是在处理大文本文件时不应该使用它,但是这个异常是随机发生的,并且在该过程至少成功完成一次之后(对象在新解析开始之前被销毁,因此除了一些小泄漏之外,内存可以正确检索)
我尝试使用textile 和TStreamReader,但它不如TStringList 快,而且这个过程的持续时间是这个功能最关心的问题。
我正在使用 10.1 Berlin,解析过程是一个简单的迭代,通过不同长度的线列表和基于线信息的对象构造。
本质上,我的问题是,是什么导致了这种情况,我该如何解决。我可以使用其他方式加载文件并读取其内容,但它必须与 TStringList 方法一样快(或更好)。
加载线程执行代码:
TThreadFactory= class(TThread)
protected
// Class that holds the list of Commands already parsed, is owned outside of the thread
_logFile: TLogFile;
_criticalSection: TCriticalSection;
_error: string;
procedure Execute; override;
destructor Destroy; override;
public
constructor Create(AFile: TLogFile; ASection: TCriticalSection); overload;
property Error: string read _error;
end;
implementation
{ TThreadFactory}
constructor TThreadFactory.Create(AFile: TLogFile; …Run Code Online (Sandbox Code Playgroud) 我有这些代码
TSql = class
private
FConnString: TStringList;
public
property ConnString: TStringList read FConnString write FConnString;
constructor Create;
destructor Destroy;
end;
var
Sql: TSql;
...
implementation
{$R *.dfm}
constructor TSql.Create;
begin
//inherited Create;
FConnString:=TStringList.Create;
end;
destructor TSql.Destroy;
begin
FConnString.Free;
//inherited Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Sql.Create;
Sql.ConnString.Add('something');
showmessage(Sql.ConnString.Text);
Sql.Destroy;
end;
Run Code Online (Sandbox Code Playgroud)
在按下按钮后,为什么在创建FConnString时会产生内存泄漏?
.................................. ................ .................. ................................ .. ..................................
我似乎无法理解以下错误.
列表框超出范围(0)TString
我有一个带有列表框的表单或窗口,以下代码应该可以使用它.它假设从ini文件中获取字符串列表并设置为列表框.
IF selectedbox1count <> 0 then
BEGIN
FOR i:=0 to selectedbox1count-1 do
selectedbox.items[i] := AInifile.ReadString('DATAVIEW2', 'SHIFT1CHART'+(i+1), ' ');
END;
Run Code Online (Sandbox Code Playgroud)
但它总是在第一个实例到达该selectedbox.items[i]行时弹出一条错误消息.读取ini文件将返回"NEW CHART 2"字符串.我在这里错过了什么吗?
更新:selectedbox1count保存ini文件中的值...
delphi listbox tstringlist lazarus indexoutofboundsexception
想要将名称值对加载到TStringList中.
有一个包含数据的文本文件:
a=ant
a=animal
b=bob
d=darn
Run Code Online (Sandbox Code Playgroud)
加载它的功能:
LoadData(argPath: string): TStringList;
var
data: TStringList;
begin
data := TStringList.Create(true);
data.Delimiter := '=';
try
data.LoadFromFile(argPath);
except on E : Exception do
begin
Application.MessageBox(PWideChar(E.Message),
'Unable to Load Data', MB_OK or MB_ICONERROR);
Application.Terminate;
end;
end;
Result := data;
end;
Run Code Online (Sandbox Code Playgroud)
结果目前是:
a=ant
a=animal
b=bob
d=darn
Run Code Online (Sandbox Code Playgroud)
希望结果的字符串是:
ant
animal
bob
darn
Run Code Online (Sandbox Code Playgroud)
和结果的TObjects
a
a
b
d
Run Code Online (Sandbox Code Playgroud)
在此之后,我希望能够在TComboBox中显示它.
如何从下面的图像中获取所有用户名值,并将它们转换为TStringList,字符串或TMemo?

我尝试了以下代码,但它没有用.
with q3 do
var txResul:stringlist
begin
Close;
SQL.Clear;
SQL.Add('SELECT*FROM user');
Open;
Next;
end;
txtResult.Add(q1.FieldByName('username').AsString);
Run Code Online (Sandbox Code Playgroud) 所以我有可能包含不同章程的数据列表:
1dAAbt54
agFlE9dA
1295RTdd
Run Code Online (Sandbox Code Playgroud)
第一行数据包含:1d,AA,bt,54.我需要的只是给出给定索引数据的函数.示例:索引6的数据为Fl(行-2,行中的索引为2).每行长度为8,数据长度为2;
我怎样才能在Delphi中实现这样的功能?
结果函数应该是这样的:
procedure (DataList: TStringList; DataIndex: Integer; var LineIndex: Integer; var PosInLine: Integer);
begin
//do the algorithm
end;
Run Code Online (Sandbox Code Playgroud)
对不起,我的英语不好...
delphi ×8
tstringlist ×8
class ×1
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
delphi-xe3 ×1
delphi-xe4 ×1
lazarus ×1
listbox ×1
loops ×1
memory-leaks ×1
mysql ×1
text-files ×1
tmemo ×1
xml ×1