我正在做一些代码生成工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示:
result := Func1(x, y, Func2(a, b, c));
Run Code Online (Sandbox Code Playgroud)
TStringList.CommaText 对于生成参数列表非常有用,但是当我遍历树以构建外部函数调用时,我最终得到的结果如下:
result := Func1(x, y, "Func2(a, b, c)");
Run Code Online (Sandbox Code Playgroud)
它引用了第三个参数,因为它包含逗号,并且产生了无效代码。但是我不能做一些像 StringReplace 所有双引号为空字符串这样简单的事情,因为函数参数很可能是一个带有双引号的字符串。有没有办法让它不转义包含逗号的行?
我有一个通用的列表类:
TMyObjectlist<T: TMyObject> = class(TObjectList<T>);
Run Code Online (Sandbox Code Playgroud)
和派生列表类:
TMyDerivedObjectList = class(TMyObjectList<TMyDerivedObject>);
Run Code Online (Sandbox Code Playgroud)
我想检查TMyDerivedObjectList的实例MyList是否继承自TMyObjectList,但是:
MyList.InheritsFrom(TMyObjectlist<TMyObject>)
Run Code Online (Sandbox Code Playgroud)
返回False.
事实证明,MyList.Classparent属于类型TMyObjectList<TMyDerivedObject>.
在这种情况下,有谁知道如何检查InheritsFrom?
我有一些简单的XML处理代码,它应该根据属性值定位传入节点的子节点:
function GetNodeByAttributeValue(
const AParentNode: IXMLNode;
const AttributeName: string; AttributeValue: Variant): IXMLNode;
var
i: integer;
value: Variant;
begin
result := nil;
if (not Assigned(AParentNode)) or (AttributeName = '') then
exit;
for i := 0 to AParentNode.ChildrenCount-1 do
begin
result := AParentNode.Children[i];
value := result.GetAttributeValue(AttributeName, UnAssigned);
if not VarIsEmpty(value) then
exit;
end;
result := nil;
end;
Run Code Online (Sandbox Code Playgroud)
很简单,对吧?但是当我尝试运行它时,在某些情况下它会因访问冲突而崩溃.这是发生了什么:
IXMP*实现由RemObjects SDK库提供. result.GetAttributeValue电话uROMSXMLImpl.TROMSXMLNode.GetAttributeValue,电话TROMSXMLNode.GetAttributeByName,说
node := fNode.attributes.getNamedItem(anAttributeName);
Run Code Online (Sandbox Code Playgroud)
这会崩溃因为fNode.attributes返回nil.据我了解,这不应该发生.
奇怪的是,回到原始函数中的for循环,AParentNode.ChildrenCount返回3.但原始XML文档中的节点只有一个子节点.它符合我正在寻找的标准.
<ParentNode>
<namespace:ChildNode name="right-name">
Run Code Online (Sandbox Code Playgroud)
但AParentNode.ChildrenCount …
我正在使用一个主循环看起来像这样的服务:
while (fServer.ServerState = ssStarted) and (Self.Terminated = false) do
begin
Self.ServiceThread.ProcessRequests(false);
ProcessFiles;
Sleep(3000);
end;
Run Code Online (Sandbox Code Playgroud)
ProcessRequests很像Application.ProcessMessages.我无法传递true给它,因为如果我这样做,它会阻塞,直到从Windows收到消息,并且ProcessFiles将无法运行,并且它必须不断运行.Sleep可以降低CPU使用率.
这工作正常,直到我尝试从Windows的服务管理列表关闭服务.当我点击Stop时,它会发送一条消息并希望几乎立即得到响应,如果它在Sleep命令的中间,Windows会给我一个错误,表明该服务没有响应Stop命令.
所以我需要说的是"睡觉3000或直到你收到消息,以先到者为准".我确定有一个API,但我不确定它是什么.有人知道吗?
当我在内存流或文件流中使用大文件时,我看到一个"内存不足"的错误如何解决这个问题?
例:
procedure button1.cl?ck(click);
var
mem:TMemoryStream;
str:string;
begin
mem:=Tmemorystream.create;
mem.loadfromfile('test.txt');----------> there test.txt size 1 gb..
compressstream(mem);
end;
Run Code Online (Sandbox Code Playgroud) 我有一些正在尝试优化的 OpenGL 绘图代码。目前,它正在测试所有绘图对象的客户端可见性,然后再决定是否将渲染数据发送到 OpenGL。(这比听起来容易。它正在绘制 2D 场景,因此剪切很简单:只需根据视口矩形的当前坐标进行测试。)
我突然想到,通过将整个场景传递给 OpenGL 并让 GPU 负责裁剪,可以大大简化整个模型。但有时总数可能非常非常复杂,总共涉及多达 100,000 个精灵,其中大多数永远不会渲染,因为它们不在摄像机之外,而且我不希望最终以简单的名义杀死帧速率。
我使用的是 OpenGL 2.0,并且有一个非常简单的顶点着色器和一个更复杂的片段着色器。是否有任何保证表明,如果顶点着色器运行并确定多边形所有顶点完全离开相机的坐标,则将在顶点着色器和片段着色器之间的某个位置应用裁剪测试,并阻止片段着色器运行对于那个多边形?如果是这样,这是自动的还是我需要做一些事情才能启用它?我在网上查找了这方面的信息,但没有找到任何结论性的信息......
我正在开发一个基于Indy的HTTP服务器构建的Web服务器,我发现如果我在浏览器中点击一个请求,然后在第一个请求完成之前再点击另一个请求,则会导致各种问题.但我无法找到任何方法来确定我是否在取消请求.每个请求都在其自己的线程内发生,因此将线程设置为Terminated将是一种很好的检查方式,但这似乎并没有发生.
有什么方法我可以让Indy通知我,它当前正在处理的请求已经被发送它的浏览器取消了,现在它正在尝试加载不同的东西吗?
如果要在FireMonkey的网格的同一列中使用不同的单元格控件,可以执行哪些操作.单元格控件似乎属于列,但有些情况(如属性编辑器),其中某些行需要复选框,而其他行需要组合框或编辑控件.
提前致谢.
我正在寻找一种方法,给定一个有向图,找到从给定起点无法到达的所有节点.我有一个想法,基于与Dijkstra算法类似的概念,就像这样(伪代码),但是有更好的方法吗?
function DisconnectedNodes(Graph, Start)
var Unknown = new list
var Open = new list
var Closed = new list
for each Node in Graph
Unknown.add(Node)
Open.StealFrom(Unknown, Start)
while Open.Count > 0
var Current = Open[0]
for each Node in Current.Destinations
if Node in Unknown
Open.StealFrom(Unknown, Node)
Closed.StealFrom(Open, Current)
return Unknown
Run Code Online (Sandbox Code Playgroud) 我使用的是 Lazarus 1.0.8(最新版本),并且已经安装了 Indy 10。我还有一个带有 PHP 脚本的网站,该脚本在服务器上保存一个文本文件(称为“stats.txt”)。我想使用我的程序上传另一个文本文件,其中包含统计文本+我在备忘录中写入的新文本。我不想让你为我编写代码,只是你能给我一个关于我该怎么做的建议吗?
我想我可以下载备忘录中“stats.txt”的内容,然后再次上传,但添加新文本。有没有更好的办法?
delphi ×8
indy ×2
algorithm ×1
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
escaping ×1
firemonkey ×1
freepascal ×1
generics ×1
graph ×1
grid ×1
http ×1
inheritance ×1
opengl ×1
optimization ×1
remobjects ×1
service ×1
tstringlist ×1
winapi ×1
windows ×1
xml ×1