我有一个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?
是的我想在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.
有什么建议吗?
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),会发生错误.
谁来释放这个字符串列表的对象?
我在向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,但我不希望在我的应用程序之外有一个文本文件.
我希望你能帮帮我!!!如果您需要任何进一步的信息,请告诉我.
非常感谢你.我非常感谢你的帮助.
我在一个存储为字符串的对象中有一个名为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 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?
我想按长度降序对短语的字符串列表进行排序,以便:
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]' 的对象。 ”
我需要修复此代码,还是以完全不同的方式对其进行攻击?
在注意到我的一个应用程序的任务管理器中出现奇怪的内存行为后,我开始使用 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) 我想知道如何将TStrings对象的本地对象地址(分配在堆上,IIRC)从调用函数传递到我使用CreateThread(). 该线程具有无限等待,因此该对象应该在调用者级别仍然可用,等待填充信息。
我想保持这个 Win32 相关,而不是使用 VCLTThread类来做这样的事情。
有人有如何执行此操作的示例吗?IsMutliThread已设置为 API 调用True之前CreateThread()。我只想利用将TStrings变量的地址直接传递给工作线程。
我的函数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) tstringlist ×10
delphi ×9
c# ×2
delphi-2007 ×1
delphi-2010 ×1
delphi-xe3 ×1
dll ×1
enums ×1
fastmm ×1
file-io ×1
memory-leaks ×1
sorting ×1
typeinfo ×1
winapi ×1