标签: delphi-2010

为什么TGeneric <Base>和TGeneric <Descendant>不兼容?

我已经开始在Delphi 2010中使用泛型,但在编译这段代码时我遇到了问题:

TThreadBase = class( TThread )
...
end;

TThreadBaseList<T: TThreadBase> = class( TObjectList<T> )
...
end;

TDataProviderThread = class( TThreadBase )
...
end;

TDataCore = class( TInterfacedObject, IDataCore )
private
  FProviders: TThreadBaseList<TDataProviderThread>;
...
end;
Run Code Online (Sandbox Code Playgroud)

然后我有一些嵌套的过程:

procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

最后我想在TDataCore类的代码中调用这个嵌套过程:

MakeAllThreadsActive(FProviders);
Run Code Online (Sandbox Code Playgroud)

但编译器不想编译它,它说('<>'括号被'()'替换):

[DCC错误] LSCore.pas(494):E2010不兼容类型:'TThreadBaseList(TThreadBase)'和'TThreadBaseList(TDataProviderThread)'

虽然TDataProviderThread是TThreadBase的后代,但我不明白它.

我不得不通过艰难的类型转换来修复它:

MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));
Run Code Online (Sandbox Code Playgroud)

有人知道为什么编译器会说这个错误吗?

delphi generics delphi-2010

13
推荐指数
2
解决办法
1402
查看次数

用于Delphi的TWAIN扫描组件

我需要将TWAIN扫描添加到Delphi应用程序中,并且无法找到现成的组件来执行此操作.

我下载了TDelphiTwain,但是当在Windows Vista上的D2010中使用时,它似乎无法识别我系统上的任何Twain源.我还尝试了MCM的Twain Toolkit for Delphi的试用版,它具有当前更新的优势(DelphiTwain的最后一次更新是2004),但Twain Toolkit甚至不能在我的系统上编译(我认为一些DCU不在日期).

任何人都可以建议一种简单的方法将TWAIN扫描到我的Delphi应用程序中吗?

更新:使用vcldeveloper对DelphiTwain的更新(见下文)我能够实现这一点.此外,我还发现Envision Image Library支持Twain扫描以及协助处理多页TIFF,并且已经更新以与D2010兼容.

最新的更新 VCLDeveloper的代码,下面,工作正常.但是,我选择了Envision库,它包括轻松创建多页TIFF文件的功能.我在几个小时内完成了Envision扫描,包括多页文件处理.

delphi twain delphi-2010

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

Delphi 2010 RTTI:探索枚举

考虑这样的枚举:

type
  TTypeOfData = (
    [XmlName('ABC')] todABC,
    [XmlName('DEF')] todDEF,  
    [XmlName('GHI')] todGHI
  );
Run Code Online (Sandbox Code Playgroud)

其中XmlName是一个自定义属性,用于为此枚举的成员定义序列化字符串.

如何浏览附加到此枚举的每个成员的属性?

delphi enumeration rtti delphi-2010

13
推荐指数
2
解决办法
3648
查看次数

Delphi WideString和Delphi 2009+

我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:

  1. 德尔福2005年WideString完全相同的同类型作为德尔福2010String

  2. Delphi 2005 WideStringchar和Delphi 2010 Stringchar保证总是 2字节大小.

有了所有的Unicode格式,我不希望被我的字符串中的一个字符突然变为3字节宽或类似的东西.

编辑:发现这个:"我确实说过UnicodeString,而不是WideString.WideString仍然存在,并且没有变化.WideString由Windows内存管理器分配,应该用于与COM对象交互.WideString直接映射到COM中的BSTR类型".http://www.micro-isv.asia/2008/08/get-ready-for-delphi-2009-and-unicode/

现在我更加困惑.那么Delphi 2010 WideString与Delphi 2005不一样WideString?我应该用UnicodeString吗?

编辑2:UnicodeString Delphi 2005中没有类型.FML.

delphi unicode delphi-2010

13
推荐指数
2
解决办法
5113
查看次数

显示"空"TDateTimePicker

如何在Delphi 2010中显示"空"TDateTimePicker(即隐藏日期的显示以使控件显示为空).我知道设置格式以显示时代的技巧,但是在Windows 7上运行Delphi 2010时,控件中会出现字符串"AD".

delphi delphi-2010

13
推荐指数
1
解决办法
1万
查看次数

在同一台机器上有多个Delphi版本

我们想要做的是在同一台机器上安装多个Delphi版本,这些版本是D7,D2010和DXE.

我们以前有D7和D2010,一起工作正常(由于各种版本的特殊条件,不得不复制D7和D2010的组件),但是,我不确定XE,因此问题.

当然我们可以试验,但这意味着浪费了几个小时,所以如果有人已经做了类似的设置或积极拥有,你能分享一下你的经验吗?

编辑1:

D7-D2010安装按时间顺序排列:

  • D7 +更新
  • D2010 +更新

delphi delphi-7 delphi-2010 delphi-xe

13
推荐指数
3
解决办法
5844
查看次数

Delphi预构建事件未执行BEFORE编译

我正忙着自动化我们的构建以包含svn修订版号.我们正在使用Delphi 2010.我添加了一个预构建事件,调用批处理文件,该文件将svn修订号(从.svn目录中的条目文件中读取)和指定的版本号注入到编译的aVersionInfo.rc中.我的项目.预构建事件如下所示:

call SetVersionInfo.bat 6 5 4
Run Code Online (Sandbox Code Playgroud)

...和批处理文件(希望有人发现这个有用)...

@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion

SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)

ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev%   >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1   >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32   >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP   >> aVersionInfo.rc
ECHO. BEGIN   >> aVersionInfo.rc
ECHO.   BLOCK "StringFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     BLOCK "080904b0"   >> aVersionInfo.rc
ECHO.     BEGIN   >> aVersionInfo.rc …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 pre-build-event

12
推荐指数
1
解决办法
4631
查看次数

什么是TExternalThread?终止基于线程的计时器时"无法终止外部创建的线程"

这种情况发生在关闭我的应用程序的一半时间,在该应用程序中,我在设计时将TLMDHiTimer放置在我的表单上,Enabled设置为true.在我的OnFormClose事件中,我调用MyLMDHiTimer.Enabled:= false.当这个被调用时,我有时(大约一半的时间)得到这个例外.

我调试并进入调用,发现它是LMDTimer.pas中的第246行,它给出了这个错误.

FThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

我使用的是最新版本的LMDTools.我在周末之前完成了LMD工具的重新安装,并且已经将组件移除并重新添加到表单中.

根据我的发现,这与TExternalThread有关,但Embarcadero没有关于它的文档,我没有在LMDTools源代码中找到任何引用它的文档.

使用完全更新的RAD Studio 2010,Delphi 2010.

让我感到不安的是,没有任何文件.谷歌实际上谈到了一个结果,其中有人说错误是由于试图终止TExternalThread造成的.但是看看这个LMDHiTimer的源代码,不是一次它的目的是做任何事情,而是创建一个常规的TThread.我可以找到一个google结果,Thread:无法终止外部创建的线程?在Embarcadero上提到使用GetCurrentThread()和GetCurrentThreadId()来获取挂钩到现有线程所需的数据,但TLMDHiTimer没有这样做.它只是创建自己的TThread后代,它有自己的Create()构造函数(当然是重写,并且在构造函数的开头继承了调用)

那么......这个TExternalThread到底是什么?还有其他人遇到过这种例外吗?也许找出了解决方案或解决方法?我已经向LMDTools自己的支持提出了几乎完全相同的问题,但在多个地方提问并不会有什么问题.

提前感谢您的任何帮助.

delphi multithreading external delphi-2010

12
推荐指数
2
解决办法
6566
查看次数

Delphi 2010 - 属性向导或类似的东西,以避免手动编码getter/setter

是否有内置或外部工具(向导)可以轻松添加具有getter/setter的类成员(已发布字段)?

添加每个字段需要我编写很多代码.我们假设我需要添加Foo: Bar;属性.

我需要写

FFoo: TBar;
procedure SetFoo(const AValue: TBar);
function GetFoo: TBar;

...

property Foo: TBar read GetFoo write SetFoo
Run Code Online (Sandbox Code Playgroud)

任何使它快速简便的工具?

delphi code-generation delphi-2010

12
推荐指数
3
解决办法
693
查看次数

Delphi XE2 RTTI坏了吗?

我最近从D2010迁移到了DXE2,并在XE2和XE3(在我的朋友XE3中测试)中发现了与类内TBytes字段的RTTI生成相关的showstopper bug(或功能?).

我发现从不生成类中TBytes变量的RTTI信息.

以下代码在D2010中运行良好,但在XE2/XE3中显示消息"Error"

有没有人有任何线索?这将彻底打破我们所有的软件数据序列化实现

要测试代码,请将Rtti单位添加到使用声明中

type

  TMyClass = class
  public
    Field1: Integer;
    Field2: TBytes;
  end;


procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  Data: TMyClass;
  Rtti: TRttiContext;
  RttiClassType: TRttiInstanceType;
begin

  Data := TMyClass.Create;
  try

    // Get the context
    Rtti := TRttiContext.Create;
    try

      // Get the type for the class
      RttiClassType := TRttiInstanceType(Rtti.GetType(Data.ClassInfo));

      // Check the fields
      for i := 0 to High(RttiClassType.GetFields) do
      begin

        // Check the field type
        if not Assigned(RttiClassType.GetFields[i].FieldType) then
          ShowMessage('Error');

      end;

    finally
      Rtti.Free;
    end;

  finally
    Data.Free;
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 delphi-xe2 delphi-xe3

12
推荐指数
2
解决办法
1270
查看次数