小编Cha*_*ang的帖子

除了MSXML之外还有更好的IDOMImplementation吗?

Delphi中有3个IDOMImplementation:

  1. MSXML
  2. Xerces XML
  3. ADOM XML v4

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最差:

  1. MSXML - 0.6410秒
  2. Xerces XML - 2.4220秒
  3. ADOM XML v4 - 67.50秒

我也遇到过OmniXML,它声称与MSXML相比具有更好的性能,但我从未成功地将它与XML数据绑定生成的单元一起使用.

有没有其他供应商实现Delphi的IDOMImplementation比MSXML更好的工作?我正在使用Delphi 2010和Windows 7.

xml delphi

5
推荐指数
1
解决办法
1236
查看次数

使用git子模块进行不安的开发生活

我试过git子模块.虽然它可以解决我在项目中共享存储库的问题,但是使用子模块有两个问题困扰我:

  1. 如果子模块内容已提交更改,则子模块文件夹需要提交.
  2. 分支设置不会传播到子模块中.如果分支中的工作跨子模块,我们必须在子模块中手动切换分支.

这两个问题很容易在日常开发工作中引入错误.我发现git奴隶可以解决我的问题.

使用git slave有任何副作用吗?

或者是否有良好的做法可以避免git子模块中的上述问题?

git

5
推荐指数
1
解决办法
537
查看次数

TTaskDialog.Execute总是返回True,甚至点击取消

在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.

delphi

5
推荐指数
1
解决办法
512
查看次数

android_winusb.inf中的SingleAdbInterface,CompositeAdbInterface和SingleBootLoaderInterface是什么

我有一个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,SingleAdbInterfaceCompositeAdbInterface什么?

usb mobile android adt

5
推荐指数
1
解决办法
1726
查看次数

如何使用DataSnap 2010在进程服务器方法中使用

我定义了一个服务器方法:

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访问,而无需更改客户端和服务器代码.

delphi dbexpress datasnap

4
推荐指数
1
解决办法
5370
查看次数

我们可以使用TDSProviderConnection来替换进程内DataSnap应用程序的TLocalConnection吗?

我可以通过进程内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)

delphi datasnap

4
推荐指数
1
解决办法
3029
查看次数

有没有一种简单的方法来克隆字符串数组?

我有一个数组声明为:

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循环克隆数组的快速简便方法?

arrays delphi

4
推荐指数
1
解决办法
337
查看次数

Delphi 中的任何 Asn1 实现

Delphi 中是否有任何不错的 asn1 实现或库?

delphi asn.1

4
推荐指数
1
解决办法
1520
查看次数

如何为Delphi项目组编译所有版本,Delphi项目组在Delphi IDE中几乎没有项目?

我正在使用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在每次构建之前更改活动配置.但是,这会将所有项目标记为已修改.

请分享您对如何编译项目组可用的所有构建的想法.

谢谢.

ide delphi project-management

4
推荐指数
1
解决办法
2529
查看次数

检查字符串是否可以在XE4及更高版本中安全地转换为AnsiString的最简单方法是什么?

在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)

delphi unicode

4
推荐指数
1
解决办法
1538
查看次数

标签 统计

delphi ×8

datasnap ×2

adt ×1

android ×1

arrays ×1

asn.1 ×1

dbexpress ×1

git ×1

ide ×1

mobile ×1

project-management ×1

unicode ×1

usb ×1

xml ×1