小编Mas*_*ler的帖子

如何正确使用TValue.AsType <TNotifyEvent>?

我正在尝试使用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'

任何人都知道为什么会这样或如何解决它?看起来对我来说......

delphi rtti delphi-2010

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

有没有办法直接运行"dir"?

我对这个问题的回答中,提问者需要快速获取网络驱动器上文件夹的目录列表,我建议使用DOS"dir"命令.不幸的是,它是一个命令,而不是一个程序,所以你不能用CreateProcess执行它,所以我不得不把它放在一个批处理文件中.我真的不喜欢那个解决方案.这对我来说感觉像是一个黑客.有没有人知道从Delphi而不是从外部批处理文件运行dir的方法?

delphi shell

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

有没有办法命名外部线程?

TThread.NameThreadForDebugging非常适合告诉线程,但并非所有线程都是TThread后代.我有一些是由外部库创建的,甚至没有用Delphi编写.如果我能找到一种获取线程句柄的方法,有没有办法命名它们?

delphi multithreading

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

"应用程序未能正确初始化"是什么意思?

我刚收到运行我在Windows XP下编写的应用程序的人的错误报告.他说它不会启动.

应用程序无法正确初始化(0xc0150002).单击"确定"以终止该应用程序.

它在我的最后工作正常(在Windows 7下),我在程序中没有任何Win7或Vista特定的东西,所以它也适用于XP.我该如何跟踪并调试它?

delphi initialization

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

如何知道我的控件何时改变大小?

我正在构建一个自定义控件,我需要它才能在调整大小时做出响应.我需要旧尺寸和新尺寸才能进行一些计算.

不幸的是,SetWidth和SetHeight方法对TControl是私有的,没有受到保护,因此我无法覆盖它们.有没有其他方法可以知道我的控件将要调整大小,并且旧尺寸和新尺寸都可用?

delphi custom-controls

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

如何发布整数列表?

我想创建一个包含整数列表作为其序列化属性之一的组件.我知道我不能将TList<integer>a 声明为已发布的属性,因为它不会从TPersistent下降.我已经读过如果你重写DefineProperties你可以定义"假的"发布属性,但是我不太确定它是如何工作的,特别是在创建一个列表而不是单个值的假属性时.

有人能指出我正确的方向吗?

delphi properties list

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

有什么方法可以让 TStringList.CommaText 不使用引号转义逗号?

我正在做一些代码生成工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示:

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 所有双引号为空字符串这样简单的事情,因为函数参数很可能是一个带有双引号的字符串。有没有办法让它不转义包含逗号的行?

delphi code-generation escaping tstringlist

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

检查对象是否继承自泛型类

我有一个通用的列表类:

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?

delphi generics inheritance

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

这些名为"#text"的XML节点发生了什么?

我有一些简单的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 …

xml delphi remobjects

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

除非收到消息,否则有办法入睡吗?

我正在使用一个主循环看起来像这样的服务:

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,但我不确定它是什么.有人知道吗?

windows delphi service winapi

3
推荐指数
2
解决办法
1024
查看次数