Delphi中有3个IDOMImplementation:
MSXML是默认的IDOMImplementation.
我的测试是计算加载10MB xml文件所需的时间.我使用从XSD生成的Delphi单元,使用XML数据绑定来加载xml文件.这个单位有3个共同的功能:
function Getmenubar(Doc: IXMLDocument): IXMLMenubarType;
function Loadmenubar(const FileName: WideString): IXMLMenubarType;
function Newmenubar: IXMLMenubarType;
Run Code Online (Sandbox Code Playgroud)
我从网上了解到一些评论说MSXML的开销很高,如果与其他XML解析器相比它不会执行.但是,我的研究表明,MSXML是最好的.Xerces XML 2nd和ADOM XML v4最差:
我也遇到过OmniXML,它声称与MSXML相比具有更好的性能,但我从未成功地将它与XML数据绑定生成的单元一起使用.
有没有其他供应商实现Delphi的IDOMImplementation比MSXML更好的工作?我正在使用Delphi 2010和Windows 7.
我试过git子模块.虽然它可以解决我在项目中共享存储库的问题,但是使用子模块有两个问题困扰我:
这两个问题很容易在日常开发工作中引入错误.我发现git奴隶可以解决我的问题.
使用git slave有任何副作用吗?
或者是否有良好的做法可以避免git子模块中的上述问题?
在Delphi XE2/XE3中执行以下代码
with TTaskDialog.Create(Self) do begin
try
if Execute then
ShowMessage('Success')
else
ShowMessage('Failed');
finally
Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
无论您点击什么按钮关闭对话框,显示的消息始终是Success.
写德尔福文档TTaskDialog.Execute作为
使用"执行"显示"任务"对话框.执行打开任务选择对话框,当用户选择任务并单击打开时返回true.如果用户单击"取消",则"执行"返回false.
我有一个Android设备,我想用它进行开发(USB调试).显然,Android Composite ADB InterfaceADT的USB驱动程序不支持.
然后我尝试从设备管理器中找到它的硬件ID:
USB\VID_0BB4&PID_0C03&REV_0255&MI_01
USB\VID_0BB4&PID_0C03&MI_01
Run Code Online (Sandbox Code Playgroud)
并尝试添加条目android_winusb.inf.inf文件有这样的东西:
;Google Nexus (generic)
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4EE0
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE1
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE2
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE2&MI_01
Run Code Online (Sandbox Code Playgroud)
如何将USB ID定义到.inf文件中?是什么SingleBootLoaderInterface,SingleAdbInterface和CompositeAdbInterface什么?
我定义了一个服务器方法:
TServerMethod = class(TPersistent)
public
function EchoString(Value: string): string;
end;
Run Code Online (Sandbox Code Playgroud)
方法EchoString返回一个等效的Value字符串.
然后我使用TDSTCPServerTransport与TDSServer和TDSServerClass包装服务器方法.
在客户端,我创建一个DataSnap TSQLConnection并生成一个TServerMethodProxy客户端类:
function TServerMethodClient.EchoString(Value: string): string;
begin
if FEchoStringCommand = nil then
begin
FEchoStringCommand := FDBXConnection.CreateCommand;
FEchoStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FEchoStringCommand.Text := 'TServerMethod.EchoString';
FEchoStringCommand.Prepare;
end;
FEchoStringCommand.Parameters[0].Value.SetWideString(Value);
FEchoStringCommand.ExecuteUpdate;
Result := FEchoStringCommand.Parameters[1].Value.GetWideString;
end;
Run Code Online (Sandbox Code Playgroud)
我能够在客户端应用程序中通过TCP连接使用EchoString方法:
var o: TServerMethodClient;
begin
o := TSeverMethodClient.Create(SQLConnection1.DBXConnection);
try
ShowMessage(o.EchoString('Hello'));
finally
o.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
上述场景使用TCP/IP作为通信协议.
但是,我希望将我的ServerMethod与我的客户端一起部署为"In Process"模型.如何在不更改客户端和服务器方法代码的情况下实现这一目标?
我应该将哪个参数传递给TServerMethodClient.Create构造函数以建立进程内连接?
o := TSeverMethodClient.Create(SQLConnection1.DBXConnection);
Run Code Online (Sandbox Code Playgroud)
在旧的DataSnap日,我们可以使用TLocalConnection享受In Process访问,而无需更改客户端和服务器代码.
我可以通过进程内DataSnap应用程序访问服务器方法.点击此处了解详情.
但是,进程内数据绑定应用程序还有另一个方面.它是IAppServer或TDataSetProvider.
在Delphi 2009之前,我使用TConnectionBroker和TLocalConnection进行进程内数据访问.新的Delphi 2009/2010 DataSnap允许我们将TDSProviderConnection用作RemoteServer.但是,我只能使它适用于TCP/HTTP连接.我不能将TDSProviderConnection用于进程内datasnap应用程序.它会提示"无效指针操作".
这是我的代码的样子:
var o: TDataModule1;
Q: TSQLConnection;
c: TEmployeeServerClient;
begin
o := TDataModule1.Create(Self);
Q := TSQLConnection.Create(Self);
try
Q.DriverName := 'DSServer1';
Q.LoginPrompt := False;
Q.Open;
DSProviderConnection1.SQLConnection := Q;
DSProviderConnection1.ServerClassName := 'TEmployeeServer';
DSProviderConnection1.Connected := True;
ClientDataSet1.ProviderName := 'DataSetProvider1';
ClientDataSet1.Open;
finally
o.Free;
Q.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
TEmployeeServer是一个TDSServerModule类后代,由连接在一起的TDataSetProvider,TSQLDataSet和TSQLConnection组成.
在跟踪源代码之后,我发现TSQLDataSet确实打开并遍历数据集.问题的原因应该与以下两种使用TDBXNoOpRow的方法有关
function TDSVoidConnectionHandler.CreateDbxRow: TDBXStreamerRow;
begin
Result := TDBXNoOpRow.Create(DBXContext);
end;
function TDSServerCommand.CreateParameterRow: TDBXRow;
begin
Result := TDBXNoOpRow.Create(FDbxContext);
end;
Run Code Online (Sandbox Code Playgroud)
TDBXNoOpRow实例将被消耗
procedure TDBXStreamValue.SetRowValue;
begin
if FExtendedType then
begin
if FStreamStreamReader <> nil then …Run Code Online (Sandbox Code Playgroud) 我有一个数组声明为:
const A: array[0..3] of ShortString = (
'Customer',
'Supplier',
'Stock',
'GL'
);
var B: array of ShortString;
Run Code Online (Sandbox Code Playgroud)
我想将字符串数组A克隆到另一个数组B.使用移动或复制功能不起作用.有没有使用for循环克隆数组的快速简便方法?
我正在使用Delphi XE.自Delphi 2007以来,它支持Project Group(.groupproj),我们可以在其中添加项目.
我们可以在"构建配置"中为项目定义各种构建配置,例如:Debug和Release build.
从Delphi 2010开始,运行时变量$(Config)可用于设置输出目录,如:.\ $(Config)
在此示例中,$(Config)分别转换为Debug版本的"Debug"和Release版本的"Release".
在构建配置中激活Debug构建时,输出文件将存储在相对于当前目录的".\ Debug"文件夹中.
这是一个很好的功能,因此我们可能有输出文件存储在各种文件夹中,用于在Project的Build Configuration中定义的构建.
此外,使用"构建配置"的上下文菜单(通过鼠标右键单击弹出菜单)中的"构建"菜单项,对下面的所有构建执行编译.
不幸的是,我的项目组中有200多个项目.每个项目都定义了Debug和Release构建.我没有找到任何方法来触发一次为200个项目构建Debug和Release构建的操作.
到目前为止我所知道的唯一解决方案是使用View | Configuration Manager在每次构建之前更改活动配置.但是,这会将所有项目标记为已修改.
请分享您对如何编译项目组可用的所有构建的想法.
谢谢.
在Delphi XE4及更高版本中,我们可以编写如下内容:
function TestAnsiCompatible(const aStr: string): Boolean;
begin
end;
Run Code Online (Sandbox Code Playgroud)
string在Delphi XE4中声明为UnicodeString.它可能包含一个unicode字符串.
如果我们做一些类型转换:
function TestAnsiCompatible(const aStr: string): Boolean;
var a: AnsiString;
begin
a := aStr;
Result := a = aStr;
end;
Run Code Online (Sandbox Code Playgroud)
一些编译器警告应该提示:
[dcc32 Warning]: W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[dcc32 Warning]: W1057 Implicit string cast from 'AnsiString' to 'string'
Run Code Online (Sandbox Code Playgroud)
是否有一个简单而简洁的方法来测试是否aStr与AnsiString完全兼容?或者我们将按字符检查字符:
function TestAnsiCompatible(const aStr: string): Boolean;
var C: Char;
begin
Result := True;
for C in aStr do begin
if …Run Code Online (Sandbox Code Playgroud)