我已经创建了一个自定义的MSBuild .targets文件,我通过IDE将其包含在Delphi XE项目中,并从项目管理器的上下文菜单中启用它.虽然文件验证,但在重新保存项目文件后它总是被禁用.
这是目标文件的简化版本,名为Custom.targets.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Hello">
<Message Text="Hello from custom target"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
作为一个独立的文件,这按预期工作:输入...
MSBuild Custom.target /t:Hello
Run Code Online (Sandbox Code Playgroud)
...在命令行中给出了预期的消息.
Custom.targets通过IDE 添加到Delphi项目会按预期在项目管理器中显示该文件,该.dproj文件现在包含该行...
<TargetsFile Include="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)
我在IDE的项目管理器中右键单击该文件并进行选择Enable.但是在构建项目时,Build消息窗口显示:
[MSBuild警告] Custom.targets(1):忽略禁用导入:
PathToProjectSource\\Custom.targets
在项目管理器中再次右键单击仍显示该Enable选项而不是预期Disable.
在命令行MSBuild ProjectName.dproj /t:Hello也失败了.
我试过黑客攻击.dproj文件添加行...
<Import Project="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)
打字MSBuild ProjectName.dproj /t:Hello现在有效.但是下次我从IDE保存项目文件时,<Import>语句将被删除.
有人知道出了什么问题吗?
Delphi过去常常包含一个用于Web服务的demos文件夹,但似乎不再包含这个.
我刚刚尝试了Delphi 7演示项目(SOAPDMServerWAD一个几乎没有UI的服务器,并且SOAPDMClient)并且无法让它们运行,即使在Delphi 7中也是如此.
如果有人在Delphi XE或Delphi 2010中做过类似的演示工作,与旧版SOAPDMServerWAD+SoapDMClient演示相同,在Delphi XE中工作,并且至少具有来自Delphi SOAP Server应用程序向导的最小UI,那将是完美的.
更新:该演示一直出现在Delphi 2010上,但使用现已废弃的WAD(web-app-debugger),我试图将它移植到新的Indy runtime/web-app-development-harnessing-code,但我似乎无法让它工作.演示运行,但服务器没有用户界面,并且似乎没有运行任何HTTP服务器(使用常规Web浏览器,通过http://localhost:port/网址测试.顺便说一下,尝试使用Google搜索演示,此网址出现,并且我问不到一个小时前.那可怕,谷歌.
Update2请参阅下面的我自己的答案,工作代码即将推出一个链接.
FmtBcd.pas已经在Delphi XE2中进行了大量修改.在我的一个项目中,我有一个案例对两个Bcd值使用除法运算,但这两个版本产生不同的结果.在最坏的情况下,Delphi XE2可能会抛出一个Bcd overflow error.
示例:在Delphi XE2控制台应用程序中运行以下代码:
var A, B, C, D: TBcd;
begin
A := StrToBcd('1');
B := StrToBcd('3');
BcdDivide(A, B, C);
WriteLn(BcdToStr(C));
try
BcdMultiply(C, C, D);
WriteLn(BcdToStr(D));
except
on E: Exception do
WriteLn(E.Message);
end;
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
以上输出将是:
0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow
Run Code Online (Sandbox Code Playgroud)
该变量C包含一个Bcd值,具有63个小数位的特异性.BcdMultiply对变量执行第二次操作C将导致a Bcd overflow error.
但是,要在Delphi XE中运行相同的代码,会产生以下结果,而不会出现任何异常提示:
0.3333333333
0.11111111108888888889
Run Code Online (Sandbox Code Playgroud)
有人可以建议一个解决这个问题的最佳实践方法吗?
尝试在单个生产者多个消费者方案中使用TThreadedQueue(Generics.Collections).(DELPHI-XE).我们的想法是将对象推入队列,让几个工作线程排空队列.
但它没有按预期工作.当两个或多个工作线程调用PopItem时,将从TThreadedQueue抛出访问冲突.
如果对PopItem的调用是使用临界区序列化的,那么一切都很好.
当然,TThreadedQueue应该能够处理多个消费者,所以我错过了什么或者这是TThreadedQueue中的一个纯粹的错误?
这是一个产生错误的简单示例.
program TestThreadedQueue;
{$APPTYPE CONSOLE}
uses
// FastMM4 in '..\..\..\FastMM4\FastMM4.pas',
Windows,
Messages,
Classes,
SysUtils,
SyncObjs,
Generics.Collections;
type TThreadTaskMsg =
class(TObject)
private
threadID : integer;
threadMsg : string;
public
Constructor Create( ID : integer; const msg : string);
end;
type TThreadReader =
class(TThread)
private
fPopQueue : TThreadedQueue<TObject>;
fSync : TCriticalSection;
fMsg : TThreadTaskMsg;
fException : Exception;
procedure DoSync;
procedure DoHandleException;
public
Constructor Create( popQueue : TThreadedQueue<TObject>;
sync : TCriticalSection);
procedure Execute; override;
end;
Constructor TThreadReader.Create( popQueue : …Run Code Online (Sandbox Code Playgroud) 新的TFileOpenDialog和旧的TOpenDialog有什么区别?
在我的计算机(Win 7/DXE)中,当我运行代码时,对话框看起来一样.
我们公司有一个已经开发了十多年的软件,因此有一些真正过时的东西.它仍然非常实用,但是我看到了Delphi XE的新功能,它让我想切换.问题是源代码本身超过300mb的.pas文件(总共1gb与组件等).
我们正在使用自定义组件,旧的jvcl和最新的devexpress.
如果我决定从Delphi 7迁移到Delphi XE,我有多难以期待事情发生?
谢谢.
在阅读了文章"Simmering Unicode,让DPL沸腾"和"Simmering Unicode,让DPL沸腾(第2部分)"的"Oracle Delphi"(Allen Bauer)之后,Oracle就是我理解的全部:)
文章提到了Delphi Parallel Library(DPL),锁定免费数据结构,互斥锁和条件变量(这篇维基百科文章转发到' Monitor(同步) ',然后介绍了用于线程同步的新TMonitor记录类型并描述了它的一些方法.
是否有介绍文章,其中的示例显示了何时以及如何使用此Delphi记录类型?网上有一些文档.
TCriticalSection和TMonitor之间的主要区别是什么?
我能做些什么与Pulse和PulseAll方法呢?
它是否具有例如C#或Java语言的对应物?
RTL或VCL中是否有使用此类型的代码(因此它可以作为示例)?
更新:文章为什么在Delphi 2009中TObject的大小翻了一番?解释说现在可以使用TMonitor记录锁定Delphi中的每个对象,每个实例需要额外四个字节.
看起来TMonitor的实现类似于Java语言中的Intrinsic Locks:
每个对象都有一个与之关联的内在锁.按照惯例,需要对对象字段进行独占和一致访问的线程必须在访问对象之前获取对象的内部锁,然后在完成它们时释放内部锁.
等待,Delphi中的Pulse和PulseAll似乎是Java编程语言中wait(),notify()和notifyAll()的对应物.如果我错了,请纠正我:)
更新2:生产者/消费者应用程序的示例代码,使用TMonitor.Wait和TMonitor.PulseAll基于Java(tm)教程中有关保护方法的文章(欢迎评论):
这种应用程序在两个线程之间共享数据:生成器,创建数据,以及使用它的消费者.两个线程使用共享对象进行通信.协调是必不可少的:消费者线程不得在生产者线程交付之前尝试检索数据,并且如果消费者未检索旧数据,则生产者线程不得尝试传递新数据.
在此示例中,数据是一系列文本消息,通过Drop类型的对象共享:
program TMonitorTest;
// based on example code at http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
Drop = …Run Code Online (Sandbox Code Playgroud) 我不时会在Delphi中丢失断点功能.
我认为这是一个Delphi 2009问题,但现在我在Delphi XE中也有它.
在Delphi 2009中,通过删除.dproj文件,我使断点再次起作用.
在Delphi XE中,我无法显示破坏点.我有更新1应用了所有修补程序.
有没有人有办法解决吗?
Delphi 2010引入了可以添加到类型声明和方法的自定义属性.哪个语言元素可以使用自定义属性?
到目前为止我找到的例子包括类声明,字段和方法.(而AFAIK泛型类不支持自定义属性).
本文中显示了一些示例.看起来变量(任何类声明的外部)也可以具有属性.
根据这篇文章,可以使用属性
是否有其他语言元素可以放置属性?
更新:本文指出自定义属性可以放在属性之前:http://francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html
它包含以下代码示例:
type
TConfig = class(TComponent)
public
[PersistAs('Config', 'Version', '1.0')]
Version : String;
[PersistAs('Config', 'Description', 'No description')]
Description : String;
FTest : Integer;
// No attribute => not persistent
Count : Integer;
[PersistAs('Config', 'Test', '0')]
property Test : Integer read FTest write FTest;
end;
Run Code Online (Sandbox Code Playgroud)
我想还有一种方法可以读取方法参数的属性,比如
procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);
Run Code Online (Sandbox Code Playgroud) 首先,我要说我在Windows Vista和Windows 7中憎恶这个功能.其次,我想这样做. 这是一个问题,询问如何在WPF中执行我想要的操作.
我想做同样的事情,但在Delphi中,使用VCL库存组件,TMainMenu或Action Manager菜单,或一些可用的第三方组件,甚至Toolbar2000或其他一些库.
Windows Vista/Windows 7资源管理器主菜单的功能:
(*Windows资源管理器热键示例:Microsoft Windows资源管理器中的Ctrl + A即使菜单不可见也会选择所有菜单,Alt + T =调出工具弹出菜单,即使隐藏整个菜单也是如此).

更新:可以在此处下载使用已接受答案的演示.(HiddenMenu.zip)
delphi ×10
delphi-xe ×10
delphi-xe2 ×4
delphi-2010 ×3
annotations ×1
breakpoints ×1
delphi-2009 ×1
delphi-7 ×1
ide ×1
menu ×1
msbuild ×1
queue ×1
soap ×1
tmonitor ×1
web-services ×1
windows-7 ×1