标签: delphi-2007

为什么我要在析构函数中使用Free而不是FreeAndNil?

我已经阅读了针对FreeAndNil的案例,但仍然不明白为什么我不能在类析构函数中使用此方法?谁能解释一下.

更新:我认为Eric Grange的评论对我来说最有用.链接表明,如何处理它并不明显,这主要是品味问题.FreeAndInvalidate方法也很有用.

delphi destructor delphi-2007

11
推荐指数
3
解决办法
7105
查看次数

与Delphi 2007的AsyncCall

我基本上想要的是启动AsyncCall并继续我的代码加载.我有接口部分,消耗大量的时间(600 + ms),我想在独立的线程中加载此代码.

我试图用AsyncCall这样的东西:

procedure Load;
begin
...
end;

initialization
  AsyncCall(@Load, []); // or LocalAsyncCall(@Load)
Run Code Online (Sandbox Code Playgroud)

但是,此Load过程实际上是在主线程中启动,而不是在新创建的线程中启动.如何强制将Load程序加载到除以外的任何线程中MainThread

我可以创建TThreadExecute这个,但我想强制AsyncCallLocalAsyncCall或任何从AsyncCall库中进行工作.

谢谢你的帮助.

delphi multithreading asynchronous delphi-2007

11
推荐指数
2
解决办法
2391
查看次数

如何检测可能正在分析我的软件的调试器或其他工具?

一个非常简单的情况.我正在研究Delphi 2007中的一个应用程序,它经常被编译为'Release',但仍然在调试器下运行.有时它也会在SilkTest下运行,用于回归测试.虽然这很有趣但我想做一些特别的事......

我想检测我的应用程序是否在调试器/回归测试器中运行,如果是这种情况,我希望应用程序知道使用了哪个工具!(因此,当应用程序崩溃时,我可以在其错误报告中报告此信息.)

任何建议,解决方案?

delphi testing debugging delphi-2007

10
推荐指数
1
解决办法
2434
查看次数

如何将表单作为图像复制到剪贴板

我需要将一个表单(Delphi 2007)作为图像复制到剪贴板,以将用户可以看到的内容粘贴到word文档中.剪贴板部分确实不是问题.问题是如何获取表单的位图.

搜索已经出现了多种选择.

所有这些选项似乎都有不同的问题.我发现的大部分信息似乎都已过时.我似乎没有任何好的资源来比较不同的选项和足够的细节供我做出选择.关于选择哪种选择的任何建议.

我已经在我的表格上尝试了这些并且它们似乎都运行正常,我只是想避免出现问题.有关解决方案的建议吗?

更新:GetFormImage有哪些潜在问题?
Andreas问GetFormImage的问题是什么.希望什么都没有,这是我想要得到答案的一部分.让我担心的是,我的许多搜索结果似乎都在暗示使用GetFormImage的创造性替代方案.我希望答案可以清除水域.

我会很高兴得到很多投票的回答说 - GetFormImage曾经有过一些问题,但现在没有理由不使用它.:-)

至于GetFormImage的实际问题.对于某些用户来说,一个问题是只有表单的可见部分才会出现在图像中(即,您无法捕获隐藏或重叠的窗口).这对我来说不是一个问题,因为我的整个表格都是可见的.

1)更大的问题涉及表单控件所需的特定支持.在德尔福4修正和已知问题页面列表中有该条目(注意它被列为"递延到下").我找不到显示已解决的QC条目:

区域:vcl\core vcl类

参考编号:1088(已发布:12/16/98)
状态:延迟到下一个
Rel日期报告:8/6/98严重性:常见类型:基本
功能故障问题:

问题是GetFormImage大多数嵌套窗口控件如组合框等都被绘制为空白.

2)我也在使用DevExpress控件.他们的控件(在2006年底修复)曾一度不支持 GetFormImage正在使用的PaintTo消息.这在我正在使用的DevExpress版本中修复,但它引发了我的其他问题,我使用的其他控件可能无法正常工作的可能性是多少?

3)这是Embarcadero集团最近的一篇(2010年)帖子.用户在使用GetFormImage时遇到问题,他们在屏幕上显示的部分图表没有出现在最终图像中.他们还需要包含表单标题(我没有),他们采用了本文中概述的Canvas.CopyRect方法.

4)这是TExcellentImagePrinter页面的引用.如果需要,我可以毫无问题地购买他们的产品.该组件看起来像它最近在2002年更新(虽然有一个Delphi 2007试用版).我不知道我是否真的需要走这个方向.

您可以尝试使用GetFormImage或Form.Print.尝试在表单上放下ComboBox,然后调用GetFormImage或Form.Print.如果你打印出来,你会看到ComboBox中的文字吗?没有?别人也没有!这只是打印VCL表单时遇到的问题的一个小例子.

您也可以尝试使用Borland的TI-3155"打印表格的更好方法".当我在Borland工作时,我写了TI作为一个停止间隙测量.虽然它会打印组合框文本,但它会在许多打印机上失败,如果用户调整了表单大小,则无法打印整个表单,并且无法打印隐藏在视图中或部分位于屏幕外的表单.代码基本上生成了一个截图,为了可靠地打印图像,您可能需要查看我们的TExcellentImagePrinter产品!为什么?简而言之,它可能需要几千行低级图形代码才能获得在Windows下打印好的位图.

delphi delphi-2007

10
推荐指数
1
解决办法
9222
查看次数

从SOAP请求中删除命名空间

我已导入WSDL并使用它来发送SOAP请求.它看起来像这样:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Body>
        <Calculate xmlns="urn:xx.WSDL.xxxxxWebService">
            <ContractdocumentIn>
                <AL>
                ...More XML...
Run Code Online (Sandbox Code Playgroud)

问题是xmlns="urn:xx.WSDL.xxxxxWebService"Calculate元素中的部分.Web服务无法接受此操作.Web服务不喜欢这样的命名空间...
使用SoapUI我发现这个请求工作正常:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:col="http://example.com.service.xxx/">
    <SOAP-ENV:Body>
        <col:Calculate>
            <ContractdocumentIn>
                <AL>
                    ...More XML...
Run Code Online (Sandbox Code Playgroud)

那么,如何将请求从第一个版本更改为第二个版本?(不使用肮脏的技巧!)
(如果这会导致正确的请求格式,重新导入不是问题.)




再次:不允许任何肮脏的技巧,比如黑客攻击请求流来修改它!


虽然我还没有完全测试过,但似乎C#/ VS2010和Delphi 2010也无法使用我想要调用的Web服务.一个似乎是用Java编写的Web服务.SoapUI恰好用Java编写,因此我们有一个Java客户端与Java服务通信,这似乎工作得很好.但任何其他客户?
无论如何,还有时间添加两个标签:"Java",因为它是一个Java服务,而"vs2010"因为.NET也不喜欢这个服务.
我正准备在.NET中编写一个包含此服务的包装器,希望这样可行......但事实并非如此.所以这是一个非常严重的缺陷,可能是Java漏洞......

java delphi soap delphi-2007 visual-studio-2010

10
推荐指数
2
解决办法
8312
查看次数

NOT版本化.dproj的优点

我在一篇关于Version Insight(http://www.delphifeeds.com/go/s/77066)的博客中读到了(其中包括)JCL没有版本控制下的.dproj文件,我想知道它的优点是什么那会是.

特别是因为我和我的同事开发人员经常通过使用我们自己喜欢的调试设置检查项目文件而互相"错误"(他喜欢优化,我希望它关闭).而且由于Delphi 2007的常规问题,dproj文件被各种错误的依赖项搞砸了.版本控制无论如何都不能帮助这些东西吗?

我们目前正在使用Starteam作为我们的VCS.

delphi version-control starteam delphi-2007

10
推荐指数
2
解决办法
1514
查看次数

在Delphi中使用旧样式`object`而不是`class`是否有好处?

在Delphi中,理智的人使用a class来定义对象.
在我们使用的Turbo Pascal for Windows中object,今天您仍然可以使用它object来创建对象.

不同之处在于object堆栈上的class生命和堆上的生命.
当然,这object是折旧的.

Putting all that aside:

通过使用object而不是上课来提高速度是否有益处?

我知道object在Delphi 2009 中已经破解了,但是我有一个特殊的用例1)速度很重要我试图找到是否使用object会使我的东西更快而不会让它变得越来越多
这个代码库是在Delphi 7中,但是我可能把它移植到Delphi 2007,尚未决定.


1)康威的生命游戏

长期评论
感谢所有人指出我正确的方向.

让我解释一下.我正在尝试更快地实现hashlife,另请参阅此处此处的简单源代码

目前的记录保持者很高兴,但是他使用Bill Gospher原始的lisp代码的直接翻译(这是一种很好的算法,但根本没有在微观层面进行优化).Hashlife使您能够在O(log(n))时间内计算生成.

它通过使用空格/时间权衡来实现.由于这个原因,hashlife需要大量内存,千兆字节并非闻所未闻.作为回报,您可以在o(1)时间内使用第2代^ 127(170141183460469231731687303715880000000)计算第2代128(340282366920938463463374607431770000000).

因为hashlife需要为更大模式中出现的所有子模式计算哈希值,所以对象的分配需要很快.

这是我已经解决的解决方案:

分配优化
我分配一大块物理内存(用户可设置)让我们说512MB.在这个blob中我分配了我称之为奶酪堆栈的东西.这是我推送和弹出的普通堆栈,但是pop也可以来自堆栈的中间.如果发生这种情况,我会在free列表上标记它(这是一个正常的堆栈).当free我按下时,如果没有任何空闲,我先检查列表,我正常推动.我将使用记录,因为它看起来像具有最少开销的解决方案.

由于hashlife的工作方式,很少发生popping和很多pushes.我为不同大小的结构保留单独的堆栈,确保在4/8/16字节边界上保持内存访问对齐.

其他优化

  • 递归删除
  • 缓存优化
  • 用于 inline
  • 预先计算哈希(类似于彩虹表)
  • 检测病理病例和使用后退算法
  • 使用GPU

delphi class object delphi-7 delphi-2007

10
推荐指数
3
解决办法
2985
查看次数

如何在delphi XE中读取文件内容到字符串

我正在将我的应用程序从delphi 2007迁移到delphi xe,但是我遇到了一个读取文件(ascii)并将内容存储在字符串中的过程的问题

这是在delphi 2007中正常运行的代码

function LoadFileToStr(const FileName: TFileName): String;
var
  FileStream : TFileStream;
begin
  FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
     if FileStream.Size>0 then
     begin
      SetLength(Result, FileStream.Size);
      FileStream.Read(Pointer(Result)^, FileStream.Size);
     end;
    finally
     FileStream.Free;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

但是当在delphi XE中执行此代码时,结果只是'????????'这样的符号,我知道哪个delphi xe是unicode所以我改变了这些行

      SetLength(Result, FileStream.Size);
      FileStream.Read(Pointer(Result)^, FileStream.Size);
Run Code Online (Sandbox Code Playgroud)

      SetLength(Result, FileStream.Size*2);
      FileStream.Read(Pointer(Result)^, FileStream.Size);
Run Code Online (Sandbox Code Playgroud)

将文件的内容存储在unicode字符串中但结果是相同的.

how i can fix this procedure to read the content of this file?

delphi delphi-2007 delphi-xe

10
推荐指数
4
解决办法
4万
查看次数

如何使用像Internet Explorer一样的ctrl + mousewheel进行TWebBrowser缩放?

根据

http://www.rendelmann.info/blog/CommentView,guid,356fbe68-3ed6-4781-90a4-57070a0141da.aspxhttp://msdn.microsoft.com/en-us/library/aa770056(v=vs. 85)的.aspx

获得托管web浏览器缩放使用控制键和鼠标滚轮应该只需要调用IWebBrowser2.ExecWB(OLECMDID_OPTICAL_ZOOM, ...)具有pvaIn的价值100,
但调用它后,按ctrl +鼠标滚轮仍然不缩放内容

代码我正在使用Delphi 2007:

const
  OLECMDID_OPTICAL_ZOOM = 63;
var
  pvaIn, pvaOut: OleVariant;
begin
  pvaIn := 100;
  pvaOut := NULL;
  WebBrowser1.ControlInterface.ExecWB(OLECMDID_OPTICAL_ZOOM,
    OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut);
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007 iwebbrowser2 twebbrowser

10
推荐指数
2
解决办法
5340
查看次数

Delphi - 当单元名称与属性名称相同时,如何解决冲突?

下面的简单示例是我试图解决冲突的问题的缩写,其中我有一个与VCL成员同名的枚举类型成员.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
    TSomeType = (
      alNone,
      alSome,
      alMany) ;

procedure TForm1.FormCreate(Sender: TObject);
begin
Self.Align := alNone ;                    // 1.  type mismatch
Self.Align := Controls.alNone ;           // 2.  "Controls" is also a property of TForm
end ;

end.
Run Code Online (Sandbox Code Playgroud)
  • 第一个赋值失败,因为编译器认为alNone是我声明的那个而不是在其中TAlign定义的成员Controls.pas …

delphi scope delphi-2007

10
推荐指数
2
解决办法
555
查看次数