标签: tstringlist

tStringList将C#传递给Delphi DLL

我有一个Delphi DLL,其函数定义为:

function SubmitJobStringList(joblist:tStringList; var jobno:Integer):Integer;

我是用C#来称呼的.如何将第一个参数声明为C#中不存在tStringList.我目前的声明如下:

[DllImport("opt7bja.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int SubmitJobStringList(string[] tStringList, ref int jobno);
Run Code Online (Sandbox Code Playgroud)

但是当我调用它时,我得到了内存访问冲突异常.

任何人都知道如何从C#正确传递给tStringList?

c# delphi dll tstringlist

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

想要将文件读取到TStringList

是的我想在TStringList中读取一个简单的日志文件,使用LoadFromFile可以轻松完成.但问题是该文件可能已被其他程序同时打开,因此可能会出现异常.我试过用:

FileMode := fmShareCompat;
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.

我也试过用:

fFilePath := fPathList[PathIndex] + '\' + FileData.Name;
AssignFile(vFile, fFilePath);
Reset(vFile, 1);  // Recordsize = 1

SetLength(vFileString, FileData.Size);
BlockRead(vFile, vFileString, FileData.Size);   
vCurrentFile.Text := vFileString;
Run Code Online (Sandbox Code Playgroud)

它引发了一个带有消息I/O错误998的EInOutError.

有什么建议吗?

delphi file-io tstringlist

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

Free TStringList对象出错

procedure FreeListObjects( l : TStrings);
var i : integer;
BEGIN
   FOR i :=  0 TO l.Count -1 DO BEGIN
       l.Objects[i].Free;
       l.Objects[i] := NIL;
   END;
end;



PROCEDURE StringListAdd;
VAR i : INTEGER; Code : LONGWORD;
BEGIN
   l := Classes.TstringLIST.CREATE;
   FOR i := 0 TO 4 DO BEGIN
       Code := i  ;
       l.AddObject('', TObject(code));
   END;
   Code := LONGWORD(l.Objects[2]);
   FreeListObjects(l);
   l.Free;
END;
Run Code Online (Sandbox Code Playgroud)

当我l.OwnsObjects := TRUE 使用时FreeListObjects(l),会发生错误.

谁来释放这个字符串列表的对象?

delphi tstringlist

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

向TStringList添加大量字符串时出现问题

我在向TStringList添加字符串时遇到问题.我搜索过其他帖子但找不到答案.

我要做的是将大量字符串添加到TStringList(超过14000),但在此过程中我获得了EAccessViolation.这是我正在使用的代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
    List := TStringList.Create;
    List.Duplicates := dupAccept;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
    List.Clear;
    List.Add('125-AMPLE');
    List.Add('TCUMSON');
    List.Add('ATLV 4300');
    List.Add('150T-15');
    List.Add('TDL-08ZE');
    List.Add('RT20L');
    List.Add('SIN LINEA');
    List.Add('TIARA');
    List.Add('FL200ZK1');
    List.Add('FL250ZK1');
    List.Add('SIN LINEA');
    List.Add('CENTAURO-70 S.P.');
    List.Add('CORSADO');

{ This list continues to about 14000 strings...}

    List.Add('VOSJOD 2');
    List.Add('Z 125');
    List.Add('ZUMY');
    List.Add('NEW AGE 125');
    List.Add('SIN LINEA');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    FreeAndNil(List);
end;
Run Code Online (Sandbox Code Playgroud)

¿这段代码出了什么问题?该列表包含重复的字符串,因此我将Duplicates属性设置为dupAccept.我能够使用加载列表LoadFromFile,但我不希望在我的应用程序之外有一个文本文件.

我希望你能帮帮我!!!如果您需要任何进一步的信息,请告诉我.

非常感谢你.我非常感谢你的帮助.

delphi tstringlist

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

带有分隔符的Stringlist作为字符串?

我在一个存储为字符串的对象中有一个名为HistoryText的属性.我想显示网格中的所有行.我应该能够删除和编辑网格中的行.格式为:

16.5.2003-$-12:09-$-anna-$-Organization created
2.6.2005-$-13:03-$-jimmy-$-Organization edited
19.12.2005-$-13:33-$-madeleine-$-Organization edited
Run Code Online (Sandbox Code Playgroud)

因此每行有4个字段,日期,时间,用户和消息,分隔符字符串为' - $ - '.由于分隔符是字符串而不是char,因此无法将其分配给stringlists定界符属性.

我有一个例程将字符串提取到Stringlist:

procedure ParseDelimited(const aStringList: TStringList; const aOrgList, aDelimiter: string);
var
   vDelimiterPos : integer;
   vPartialStr : string;
   vRemaingTxt : string;
   vDelimiterLength : integer;
begin
   vDelimiterLength := Length(aDelimiter);

   if (AnsiRightStr(aOrgList, Length(aDelimiter)) = aDelimiter) then
     vRemaingTxt := aOrgList
   else
     vRemaingTxt := aOrgList + aDelimiter;

   aStringList.BeginUpdate;
   aStringList.Clear;
   try
     while Length(vRemaingTxt) > 0 do
     begin
       vDelimiterPos := Pos(aDelimiter, vRemaingTxt);
       vPartialStr := Copy(vRemaingTxt,0,vDelimiterPos-1);
       aStringList.Add(vPartialStr);
       vRemaingTxt := Copy(vRemaingTxt,vDelimiterPos+vDelimiterLength,MaxInt);
     end;
   finally
     aStringList.EndUpdate;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常.我的问题是将StringList中的更改同步回原始的String属性?这个分隔符有很多历史数据,所以我认为将它改为TChar是一个现实的选择.

更新: …

delphi tstringlist delphi-2007

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

如何防止 TStrings.SaveToStream 写入 BOM?

我正在使用 Delphi XE3。

在我的代码中,我需要创建一个文件流,然后将一些我自己的数据,以及几个TStringList的内容写入其中。该文件采用 UTF-16LE 格式。

因此,我的代码:

FileStream := TFileStream.Create('D:\MyFile.dat', fmCreate or fmOpenWrite or fmShareExclusive);

try
  // Write some data to FileStream

  // Write contents of StringList1 into FileStream
  StringList1.SaveToStream(FileStream, TEncoding.Unicode);

  // Write some more data to FileStream

  // Write contents of StringList2 into FileSteram
  StringList2.SaveToStream(FileStream, TEncoding.Unicode);
finally
  FileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

执行完代码,发现一个问题,每次调用StringList1.SaveToStream(FileStream, TEncoding.Unicode); 它将写入 BOM (0xFFFE),然后是字符串列表中的实际字符串。

因此,我得到一个这样的 Unicode 文件:

0xFFFE(第一个是我自己写的)

(一些数据)

0xFFFE(StringList1 内容)

(一些数据)

0xFFFE(StringList2 内容)

但这不是我所期望的,因为文件开头应该只有一个 0xFFFE。因此,我只是想知道如何在写入实际字符串列表之前防止 StringList1.SaveToStream 写入 0xFFFE BOM?

delphi tstringlist delphi-xe3

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

如何按长度降序对字符串列表的内容进行排序?

我想按长度降序对短语的字符串列表进行排序,以便:

Rory Gallagher
Rod D'Ath
Gerry McAvoy
Lou Martin
Run Code Online (Sandbox Code Playgroud)

最终会是:

Rory Gallagher
Gerry McAvoy
Lou Martin
Rod D'Ath
Run Code Online (Sandbox Code Playgroud)

我想先试试这个:

List<string> slPhrasesFoundInBothDocs;
. . . // populate slPhrasesFoundInBothDocs
slPhrasesFoundInBothDocs = slPhrasesFoundInBothDocs.OrderByDescending(x => x.Length);
Run Code Online (Sandbox Code Playgroud)

...但最后一行无法编译,intellisense 建议我将其更改为:

slPhrasesFoundInBothDocs = (List<string>)slPhrasesFoundInBothDocs.OrderByDescending(x => x.Length);
Run Code Online (Sandbox Code Playgroud)

...我做到了。它可以编译,但会引发运行时异常,即“无法转换类型为 'System.Linq.OrderedEnumerable 2[System.String,System.Int32]' to type 'System.Collections.Generic.List1[System.String]' 的对象。

我需要修复此代码,还是以完全不同的方式对其进行攻击?

c# sorting tstringlist

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

FastMM4 报告中释放的 TStringList 被视为内存泄漏的原因

在注意到我的一个应用程序的任务管理器中出现奇怪的内存行为后,我开始使用 FastMM4 调查内存泄漏。刚打开三张表格就发现了1000多个。我希望能够在一个地方找到原因

在一种情况下,即使总是在finally块中释放TStringList(总是到达),FastMM4也会报告内存泄漏:

function GetMatchingResourceFileName(MatchingString:string) : string;
var
  ResourcesList: TStringList;
  I : Integer;
begin
  Result := '';
  try
    ResourcesList := TStringList.Create;
    // get resource files list
    ResourcesList := GetResourceList;
    //search for matching file name
    for I := 0 to ResourcesList.Count-1 do
    begin
      if Pos(MatchingString,ResourcesList.Strings[I]) > 0 then
      begin
        Result := ResourcesList.Strings[I];
        break;
      end;
    end;
  finally
    ResourcesList.Free;
    ResourcesList:= nil;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

FastMM4 堆栈报告告诉我泄漏是从

ResourcesList := TStringList.Create;
Run Code Online (Sandbox Code Playgroud)

即使我 100% 确定已ResourcesList.Free;执行,我也会看到内存泄漏。

在这里您可以看到断点被命中: 断点被击中

当我关闭应用程序时,我看到了报告:

---------------------------
myProject.exe: Memory Leak Detected
---------------------------
This …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks tstringlist fastmm delphi-2010

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

在 Delphi 中将 TStrings 对象传递给辅助线程

我想知道如何将TStrings对象的本地对象地址(分配在堆上,IIRC)从调用函数传递到我使用CreateThread(). 该线程具有无限等待,因此该对象应该在调用者级别仍然可用,等待填充信息。

我想保持这个 Win32 相关,而不是使用 VCLTThread类来做这样的事情。

有人有如何执行此操作的示例吗?IsMutliThread已设置为 API 调用True之前CreateThread()。我只想利用将TStrings变量的地址直接传递给工作线程。

delphi winapi multithreading tstringlist

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

以 TStringList 形式返回所有枚举项

我的函数EnumToStringList()本身可以编译,但我无法使用应用程序中的任何枚举类型调用它:

[dcc64 错误] Unit_test.pas(119): E2029 '(' 预期但 ')' 找到

我的方法有什么问题吗?

function EnumToStringList(const TypeInfo: pTypeInfo): TStringlist;
var  i : Integer;
begin
  Result := TStringList.Create;
  for i := GetTypeData(TypeInfo)^.MinValue to GetTypeData(TypeInfo)^.MaxValue do
    begin
      result.add (GetEnumName(TypeInfo, i));
    end;
end;
        
function EnumToString(const TypeInfo: pTypeInfo; Ix: Integer): string;
begin
  result := GetEnumName(TypeInfo, Ix);
end;
    
type
  TProjectTypes = (low,hot,skip,pause,others);

// test code:
MyProjectStrings := EnumToStringList (TProjectTypes);
Run Code Online (Sandbox Code Playgroud)

delphi enums tstringlist typeinfo

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