标签: delphi-2007

在Delphi 2007中设置事件处理程序并获取"参数列表不同"错误

我正在尝试在Delphi 2007中编写一个使用ActiveX库的类.该类将捕获ActiveX库必须公开其自身事件的事件,该事件将一些信息添加到ActiveX库的事件中.

最重要的是,当我将自己的过程分配给我想要使用的ActiveX库的事件时,我收到一个错误:

E2009 Incompatible types: 'Parameter lists differ'
Run Code Online (Sandbox Code Playgroud)

我确定参数列表是相同的(相同数量的参数和相同的类型)所以我在想我会以错误的方式去做.

任何建议或有人可以发布我正在尝试做的一些示例代码?

delphi event-handling delphi-2007

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

如何以简单安全的方式扩展TFieldDef?

我需要有关TFieldDef问题的建议.我需要在名为Description的TFieldDef中添加一个额外的字符串属性.我想在迭代TFieldDefs集合时看到该属性.如何在Delphi 2007中做到这一点?

谢谢你的时间.

delphi collections delphi-2007

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

带有分隔符的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
查看次数

Delphi 2007调试器已经过时了

场景:

  • 德尔福做了非正常的关机.
  • 当我重新启动时,我收到消息"找不到xxxxx.bpl - 你想下次加载吗?" (注意:不是确切的消息语言;但是关闭).它是在几个文件上完成的.
  • 不幸的是我说"不 - 下次启动时不加载",也没有注意到具体的bpl文件名.我记得他们在CodeGear目录中.这对我来说是愚蠢/懒惰的.
  • Delphi加载和编译但没有可用的调试(基本上禁用了Run菜单下的所有选项).
  • 工具 - >选项 - >调试器选项下,没有CodeGear调试器.

所以基本上我完全禁用了调试.有谁知道我怎么能回来?

delphi delphi-2007

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

从Delphi 2007应用程序发送电子邮件

我有一个遗留的delphi 2007应用程序,通过TurboPower Internet Professional 1.15(tpipro)发送电子邮件警报.我最近重新访问了该应用程序,发现由于大多数电子邮件服务器的TLS/SSL要求,电子邮件发送不再有效.现在我的问题是从这里开始.

我有Delphi XE2,但我真的不想花时间更新我的应用程序来处理这个ide.它有许多库依赖项等等.

是否有可以在Delphi 2007上运行的最新第三方电子邮件客户端?或者也许是可以使用的.dll?

delphi email delphi-2007

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

强制要在WriteComponent()中写入Real的默认值

在使用默认内置"组件流系统"的特定方式中,我发现如果属性的值等于默认值,则不会写入属性的值.

我们考虑以下方案:

您使用WriteComponent()ReadComponent()来保存组件的特定状态.我们将此状态称为预设.该组件包含具有setter的各种Real类型属性.

我们知道如果属性等于其默认值,则预设将不包括该值.

所以我们的组件

  1. 我们将属性AFLoat设置为0.0
  2. 我们将预设保存在流中(MyStream.WriteComponent(MyInstance))
  3. 我们将属性AFLoat设置 为0.101
  4. 我们重新加载预设(MyStream.ReadComponent(MyInstance))

最后在重新加载预设后,AFLoat仍然等于0.101,而我们期望它的值为0.0.

错误的起源很明显,属性的默认值永远不会写在组件流中.所以在第2步:该属性没有写入,然后在第4步它不被读取...相当恼人不是它!

有没有办法强制将属性的默认值写入组件流?实际上我对Real-typed属性有一个自制的修复,但我想知道是否有一个众所周知的方法来克服这个问题.

我的自定义修复是在调用ReadComponent ()之前使用TypInfos将Real-typed属性重置为0

Procedure ResetFloatToNull(Const AnObject: TObject; Recursive: Boolean);
Var
  i,j: Integer;
  LList: PPropList;
Begin
  j := GetPropList( AnObject, LList);
  If j > 0 Then For i:= 0 To j-1 Do
    Case LList^[i].PropType^.Kind Of
    // floats with the object scope
    tkFloat: SetFloatProp(AnObject,LList^[i].Name,0);
    // floats with a subobject …
Run Code Online (Sandbox Code Playgroud)

delphi serialization delphi-2007

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

Delphi:尝试访问XMLDocument时的EInvalidPointer

每次我尝试访问文档的根时,以下代码都会抛出"InvalidPointer"异常XMLDocument.DocumentElement;.

    begin
      XMLDocument := TXMLDocument.Create(nil); // nil since we don't need an owner
      AStream := TStream.Create;  // stream for output as string
      XMLDocument.loadFromXML(xml);// load string
      if NOT (XMLDocument.IsEmptyDoc) then
       begin      
        XMLDocument.Active := true; // actually automatically done by 'loadFromXML'

        // get document root
        HeadNode := XMLDocument.DocumentElement;

        // add <id>-element, set ID as text
        idNode := HeadNode.AddChild(XML_ID_PLAIN);
        idNode.Text := id;

        // ...
     end;
    end;
Run Code Online (Sandbox Code Playgroud)

传递给的字符串"xml" loadFromXML(string)是有效的XML,但XMLDocument的属性"XML"和"DOMDocument"始终是nil,即使对象本身和它的"IsEmptyDoc"属性都不是.德尔福版本仍然是2007年.

有谁知道是什么原因引起的?提前致谢.

xml delphi root delphi-2007 txmldocument

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

Delphi 2007,Indy 10 - 在一个方向上传输数据块的最简单的TCP/IP设置是什么

我有一个应用程序("服务器"),它每秒更新一个内存中的数据块 - 大约100k字节.

在同一网络上的其他工作站上运行的"客户端"应用程序有1到4个其他实例,这些实例需要每秒读取相同的100k图像.

到目前为止,这已经通过将图像写入服务器上的文件并让客户端通过网络从该文件读取来实现.多年来一直没有问题,但最近(与转向基于Windows 8的硬件一致),它产生了一个问题,即除了一个节点之外,所有节点都无法访问该文件.退出在此节点上运行的客户端应用程序将释放该文件,然后再次向所有人访问该文件.

我仍然对这个锁定的原因感到困惑,但我想知道它是否可能是这里讨论的机制,文件因网络故障而未关闭.我认为客户端通过TCP/IP请求数据会避免这种情况.

除了客户端无法连接或读取数据之外,不需要进行任何握手 - 服务器只需要处理业务并通过抓取数据并发送数据来响应请求.然而,我对于实现这一目标的最佳架构非常朦胧.TidTCPClient和TidTCPServer会削减吗?我假设客户端会在一个线程中请求数据,但这是否意味着服务器需要连续运行一个线程来响应请求?

delphi network-programming tcp delphi-2007 indy10

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

如何检索XHR响应?

基本上,我使用Chromium来显示一个我无法控制的网站.当用户点击特定按钮时,发送XHR请求; 我希望能够找到答案.所以,假设请求发送A,服务器回复B; 我希望能够阅读B.我怎么能这样做?

delphi delphi-2007 chromium-embedded

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

如何拦截和抑制TFrame的子组件的消息?

我需要截取WM_PASTE一个TEdit放在一个TFrame后代类中的组件消息.

如果不满足条件,我想进行粘贴操作.

有没有办法在帧级别执行此操作?(我的意思是,没有声明一个TEdit人的后代)

delphi paste delphi-2007 windows-messages

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