小编Mat*_*ood的帖子

Delphi .dpr和.dproj - 不匹配的后果

在Delphi项目.dpr和.dproj文件中的"使用"列表中存在不匹配的含义是什么(如果它很重要,则为XE)?

从第一眼看来,.dproj似乎更新以匹配.dpr,但总是这样吗?

我们遇到此问题的原因是我们需要在检出版本控制之后将参数应用于项目,此参数因开发人员而异,因此始终在版本控制中给出冲突.我们决定使用模板文件对此问题进行排序,并从中生成.dproj文件.我们现在有一个潜在的问题,即开发人员在从项目中添加/删除.pas文件时忘记修改模板.正如我所说,它似乎有效,但有没有人知道我们可能遇到的任何危险?

或者,有没有人对解决方案有更好的想法?DProjMaker似乎很有趣 - 有人用它吗?http://delphi-divining.blogspot.co.uk/2012/10/dprojmaker-tool-to-create-delphi.html

第二个选项 - 我们可以从模板中删除所有.pas链接并依赖Delphi在需要时重新生成它们吗?我认为这只会影响MSBuild?(有人可以确认)

响应注释的附加信息: 参数是一个包含数据库连接信息的编码字符串(可能还有其他一些东西,我看起来不太深).

在正常(用户)操作中,我们有一个登录程序,用户可以选择要连接的数据库,并启动将此信息作为参数传递的其他应用程序.作为开发人员,我们需要直接启动程序,因此我们为我们连接的数据库生成相关代码,并将其设置为要在Delphi中传递给应用程序的参数.

delphi delphi-xe

6
推荐指数
1
解决办法
1092
查看次数

使用Jenkins的多个Delphi版本:库路径

我们正在考虑将我们的构建机器从FinalBuilder迁移到Jenkins,以适应我们扩展公司的其余部分.

我注意到的一个问题是,虽然Finalbuilder能够从构建机器上当前的Delphi安装中提取当前库路径,但Jenkins依赖于.dproj文件中包含的信息.

由于已知的.dproj文件中的路径问题非常特定于用户机器,我们目前不会将它们提交到我们的存储库,依赖于Delphi根据需要重新创建它们.当构建机器首先依赖于完整的MSBUILD脚本时,这显然不会很好.

我们使用了相当多的第三方组件(仅DevExpress套件就有100多个单元),因此在.dpr中包含和维护所有.pas文件的完整路径并不是一个真正的选择.

有没有人有一个久经考验的解决方案呢?

我对选项的看法是:

  • 为每个构建设置%PATH% - 为相关版本添加当前的Delphi库(这将运行到%PATH%长度限制吗?)
  • 使用命令行参数将正确的库路径传递给MSBUILD(这可能吗?)
  • 用编译器指令在源文件中以某种方式包含搜索路径(这可能吗?)
  • 使用预编译步骤创建新的.dproj文件(类似于http://delphi-divining.blogspot.co.uk/2012/10/dprojmaker-tool-to-create-delphi.html但它需要是命令行)

编辑:第五个想法:

  • 我们可以为每个项目使用dproj.local文件,存储在单独的存储库中(或在单独的路径中)并复制到构建机器预构建中吗?这将允许构建机器路径安全地存储远离凌乱的提交.

delphi msbuild jenkins

6
推荐指数
2
解决办法
514
查看次数

Delphi应用程序主窗体在模态关闭后移动到其他窗口后面

我开始遇到问题,我的主要表单在关闭模式表单后面的其他应用程序窗口后消失了,我希望有人会遇到(并解决!)此问题之前或者有关于在哪里找到断点来调试问题的建议.

我的问题最初始于经典的"害羞对话"问题,主要形式下出现的模态对话间歇性地发生.为了试图解决这个我改变了我的所有模式表单popupmodepmAuto,也加入 Application.ModalPopupMode := pmAuto;Application.MainFormOnTaskBar := true;我的应用程序DPR.

现在我在关闭模态弹出窗口时让主窗体消失在其他窗口后面.我怀疑这种行为主要是因为当一个模态窗体打开第二个窗口时(我遇到a MessageDlg和a 都有问题Form.create(Application); Form.show;),虽然show/free代码没有明显的问题(ShowModal表单创建所有者= nil ,无主模式=应用程序).在这两种情况下,表单在关闭第一个原始模态窗体时都会消失,但是在不触发新窗体/对话框的情况下操作模式窗体似乎按预期工作.

在主窗体的后台还有其他恶意事件,它们使用刷新计时器来激活后台线程,但通常在查看它不起作用的时间内没有触发.除此之外,我们通过第三方DLL解雇对远程服务器的调用(该应用程序实际上是客户端GUI).

令人讨厌的是,我无法获得一个模拟行为的迷你程序,并且在IDE中运行会使行为变得困难,因为IDE本身包含许多混淆Z顺序的窗口.

编辑 - 在下面写下我的答案之后,看来我正在发送一个停用事件发送到应用程序(我可以通过Application.OnDeactivate捕获它) - 它似乎类似于WPF应用程序丢失完全专注于窗口关闭 Delphi没有激活c#解决方案所具有的方法,但我会玩一些Windows消息来查看我是否到达任何地方

delphi delphi-xe2

6
推荐指数
1
解决办法
2404
查看次数

没有泛型的接口继承

我正在尝试实现一个接口,将数据集中的记录转换为Delphi的pre-generics版本中的Delphi记录.我现在不喜欢这个界面,因为它总是需要调用支持,如果可能的话我想避免使用它,并且想知道是否有更好的方法可以让我失去它.

到目前为止,我已经定义了导航界面和数据检索界面:

IBaseRecordCollection = interface
  procedure First;
  procedure Next;
  function BOF: boolean;
  ... // other dataset nav stuff
end;

IRecARecordCollection = interface
  function GetRec: TRecA;
end;

IRecBRecordCollection = interface
  function GetRec: TRecB;
end;
Run Code Online (Sandbox Code Playgroud)

基本上我有一个具体的基类,它包含一个私有数据集,IBaseRecordCollection并为每个RecordCollection接口实现具体类,该接口派生自一个实现IBaseRecordCollection(由implements属性处理)的抽象类,并执行记录检索例程:

TAbstractTypedRecordCollection = class(TInterfacedObject, IBaseRecordCollection)
private
  FCollection: IBaseRecordCollection;
protected
  property Collection: IBaseRecordCollection read FCollection implements IBaseRecordCollection;
public
  constructor Create(aRecordCollection: IBaseRecordCollection);
end;

TRec1RecordCollection = class(TAbstractTypedRecordCollection, IRecARecordCollection);
public
  function GetRec: TRecA;
end;
Run Code Online (Sandbox Code Playgroud)

现在,为了使用这个,我不得不让一个生成器返回一个IRecARecordCollection然后乱七八糟的东西Supports,我并不热衷于它,因为它总会以这种方式使用.

procedure GetMyRecASet;
var
  lRecARecordCollection: IRecARecordCollection; …
Run Code Online (Sandbox Code Playgroud)

delphi inheritance interface delphi-2006

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

跨DLL边界共享ADO连接

我们希望在DLL边界上共享一个ADOConnection(目前是Delphi到Delphi,尽管在不久的将来也可能是C#到Delphi)。

由于我们希望将来能够灵活地从c#调用DLL,因此我们希望能够使用_Connection作为参数来定义DLL调用。就像是:

procedure DoStuff (ADOConnection: _Connection)
var
  InnerConnection: TADOConnection;
begin
  InnerConnection := TADOConnection.create(nil);
  try
    InnerConnection.ConnectionObject := ADOConnection;
    DoMoreStuff(InnerConnection);
  finally
    InnerConnection.free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,TADOConnection析构函数代码关闭了传递给它的连接,这是不希望的副作用。新增中

InnerConnection.ConnectionObject := nil
Run Code Online (Sandbox Code Playgroud)

在免费之前,它什么也没做,因为它被

if Assigned(Value) = nil
Run Code Online (Sandbox Code Playgroud)

在TADOConnection.SetConnectionObject中,这导致调用不执行任何操作。

有没有更好的方法来实现这一目标?传递连接字符串是一种替代方法,但是这意味着我们将不得不处理用户名/密码问题以及跨边界的加密。传递TADOConnection是另一个选项,但是它阻止了从其他语言进行的调用。

编辑:为清楚起见,使用.Open例程设置了原始TADOConnection对象的用户名/密码,因此这些详细信息不在连接字符串中(实际上,通常存储了错误的用户名,因为它是用于'测试连接”(在MS UDL编辑器中)

delphi ado delphi-xe

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

参数化类型的方法在制作通用接口工厂时不得使用本地符号错误

我正在尝试编写一个基本的工厂方法来返回一个通用的接口类.

interface
type
  IGenInterface<T> = interface
    function TestGet:T;
  end;

  TBuilder<T> = class
    class function Build: IGenInterface<T>;
  end;

  TBuilder = class
    class function Build<T>: IGenInterface<T>;
  end;
implementation
type
  TInterfaceImpl<T> = class(TInterfacedObject, IGenInterface<T>)
    function TestGet:T;
  end;

{ TBuilder }

class function TBuilder.Build<T>: IGenInterface<T>;
begin
  result := TInterfaceImpl<T>.create;
end;

{ TInterfaceImpl<T> }

function TInterfaceImpl<T>.TestGet: T;
begin

end;
Run Code Online (Sandbox Code Playgroud)

它看起来很简单,我确信我之前已经编写过相似的代码,但是一旦我尝试编译,我就会得到E2506:接口部分声明的参数化类型的方法不能使用本地符号'.TInterfaceImpl` 1'.TBuilder的味道都不起作用,都失败了同样的错误.

现在,我不知道在哪里.,并1从都来了.在我的"真实"代码中,.它不存在,但是`1是.

我已经看过引用这个错误的另外两个SO问题了,但是我没有使用任何常量或分配变量(函数返回除外),也没有任何类变量.

有没有人有办法做到这一点,而无需将大量代码移动到我的界面?

delphi generics interface delphi-xe2

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