标签: tstringlist

如何循环分隔字符串并将字符串的内容分配给本地delphi变量?

我编写了一个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

delphi loops tstringlist delphi-xe2

0
推荐指数
1
解决办法
2337
查看次数

使用stringlist复制和复制无法正常工作

我有一个大的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)

xml delphi tstringlist delphi-xe3

0
推荐指数
1
解决办法
441
查看次数

使用 TStringList 的奇怪 EOutOfMemory 异常

我有一个系统,它加载一些压缩到“.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)

delphi tstringlist text-files delphi-10.1-berlin

0
推荐指数
1
解决办法
702
查看次数

Delphi:在类中创建TStringList时内存泄漏

我有这些代码

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时会产生内存泄漏?

.................................. ................ .................. ................................ .. ..................................

delphi memory-leaks class tstringlist

-1
推荐指数
2
解决办法
1452
查看次数

Delphi,Lazarus - Listbox out of bound(0)TString

我似乎无法理解以下错误.

列表框超出范围(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

-1
推荐指数
1
解决办法
880
查看次数

Delphi从文本文件加载名称/值对

想要将名称值对加载到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中显示它.

delphi tstringlist delphi-xe4

-2
推荐指数
1
解决办法
1447
查看次数

如何从字段中获取值并分配给TStringList?

如何从下面的图像中获取所有用户名值,并将它们转换为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)

mysql delphi tstringlist tmemo delphi-xe

-2
推荐指数
1
解决办法
572
查看次数

Delphi - 从给定数据中获取行索引和数据索引

所以我有可能包含不同章程的数据列表:

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 tstringlist delphi-7

-6
推荐指数
1
解决办法
828
查看次数