我已经开始在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)
有人知道为什么编译器会说这个错误吗?
我需要将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扫描,包括多页文件处理.
考虑这样的枚举:
type
TTypeOfData = (
[XmlName('ABC')] todABC,
[XmlName('DEF')] todDEF,
[XmlName('GHI')] todGHI
);
Run Code Online (Sandbox Code Playgroud)
其中XmlName是一个自定义属性,用于为此枚举的成员定义序列化字符串.
如何浏览附加到此枚举的每个成员的属性?
我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:
德尔福2005年WideString是完全相同的同类型作为德尔福2010String
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 2010中显示"空"TDateTimePicker(即隐藏日期的显示以使控件显示为空).我知道设置格式以显示时代的技巧,但是在Windows 7上运行Delphi 2010时,控件中会出现字符串"AD".
我们想要做的是在同一台机器上安装多个Delphi版本,这些版本是D7,D2010和DXE.
我们以前有D7和D2010,一起工作正常(由于各种版本的特殊条件,不得不复制D7和D2010的组件),但是,我不确定XE,因此问题.
当然我们可以试验,但这意味着浪费了几个小时,所以如果有人已经做了类似的设置或积极拥有,你能分享一下你的经验吗?
编辑1:
D7-D2010安装按时间顺序排列:
我正忙着自动化我们的构建以包含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) 这种情况发生在关闭我的应用程序的一半时间,在该应用程序中,我在设计时将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自己的支持提出了几乎完全相同的问题,但在多个地方提问并不会有什么问题.
提前感谢您的任何帮助.
是否有内置或外部工具(向导)可以轻松添加具有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)
任何使它快速简便的工具?
我最近从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 ×10
delphi-2010 ×10
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
delphi-xe3 ×1
enumeration ×1
external ×1
generics ×1
rtti ×1
twain ×1
unicode ×1