我正在尝试使用RTTI向控件添加事件处理程序,该控件可能已经设置了事件处理程序.代码看起来像这样:
var
prop: TRttiProperty;
val: TValue;
begin
prop := FContext.GetType(MyControl.ClassInfo).GetProperty('OnChange');
val := prop.GetValue(MyControl);
FOldOnChange := val.AsType<TNotifyEvent>;
prop.SetValue(MyControl, TValue.From<TNotifyEvent>(self.MyOnChange));
end;
Run Code Online (Sandbox Code Playgroud)
我想要这个,所以我可以在MyOnChange中做到这一点:
begin
if assigned(FOldOnChange) then
FOldOnChange(Sender);
//additional code here
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译器似乎不喜欢这条线FOldOnChange := val.AsType<TNotifyEvent>;.它说
E2010不兼容的类型:'过程,无类型指针或无类型参数'和'TNotifyEvent'
任何人都知道为什么会这样或如何解决它?看起来对我来说......
在我对这个问题的回答中,提问者需要快速获取网络驱动器上文件夹的目录列表,我建议使用DOS"dir"命令.不幸的是,它是一个命令,而不是一个程序,所以你不能用CreateProcess执行它,所以我不得不把它放在一个批处理文件中.我真的不喜欢那个解决方案.这对我来说感觉像是一个黑客.有没有人知道从Delphi而不是从外部批处理文件运行dir的方法?
TThread.NameThreadForDebugging非常适合告诉线程,但并非所有线程都是TThread后代.我有一些是由外部库创建的,甚至没有用Delphi编写.如果我能找到一种获取线程句柄的方法,有没有办法命名它们?
我刚收到运行我在Windows XP下编写的应用程序的人的错误报告.他说它不会启动.
应用程序无法正确初始化(0xc0150002).单击"确定"以终止该应用程序.
它在我的最后工作正常(在Windows 7下),我在程序中没有任何Win7或Vista特定的东西,所以它也适用于XP.我该如何跟踪并调试它?
我正在构建一个自定义控件,我需要它才能在调整大小时做出响应.我需要旧尺寸和新尺寸才能进行一些计算.
不幸的是,SetWidth和SetHeight方法对TControl是私有的,没有受到保护,因此我无法覆盖它们.有没有其他方法可以知道我的控件将要调整大小,并且旧尺寸和新尺寸都可用?
我想创建一个包含整数列表作为其序列化属性之一的组件.我知道我不能将TList<integer>a 声明为已发布的属性,因为它不会从TPersistent下降.我已经读过如果你重写DefineProperties你可以定义"假的"发布属性,但是我不太确定它是如何工作的,特别是在创建一个列表而不是单个值的假属性时.
有人能指出我正确的方向吗?
我正在做一些代码生成工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示:
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,但我不确定它是什么.有人知道吗?
delphi ×10
delphi-2010 ×1
escaping ×1
generics ×1
inheritance ×1
list ×1
properties ×1
remobjects ×1
rtti ×1
service ×1
shell ×1
tstringlist ×1
winapi ×1
windows ×1
xml ×1