小编Mar*_*ema的帖子

为什么我可以将类型X的var传递给该类型的open数组参数?

使用Delphi XE-2(应用所有更新).

我希望以下代码在DoSomething和DoInteger调用上生成编译错误,但事实并非如此.

program OpenArrayQuestion;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  IComposite = interface(IInterface)
  ['{1AC3CF6A-1316-4838-B67B-9FB075585C1E}']
  end;

  IComposite<T: IComposite> = interface(IComposite)
  ['{7F866990-9973-4F8E-9C1F-EF93EF86E8F2}']
  end;

function DoSomething(const aData: array of IComposite): Boolean;
begin
  Result := True;
end;

function DoInteger(const aData: array of Integer): boolean;
begin
  Result := True;
end;

var
  FData: IComposite;
  FInteger: Integer;
begin
  DoSomething(FData);
  DoInteger(FInteger);
end.
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么我可以将FData/FInteger(只是单个变量)传递给它们各自类型的开放数组参数而不将它放在它之间[]并且没有编译器将它直接反馈给我吗?

我认为它可能与接口数组,甚至涉及的泛型有关,但编译器接受传递给整数的开放数组的整数.

delphi open-array-parameters delphi-xe2

9
推荐指数
1
解决办法
412
查看次数

Delphi中的泛型是否会导致性能瓶颈?

最近我一直在开发一个应用程序,并希望拥有几种类型的集合.我不想为它的类型声明和实现一个新的集合类.因此,我考虑使用泛型,但不确定泛型与普通类型实例相比的性能.性能是我正在关注的主要事情.我的应用程序是时间关键的,甚至减少几百毫秒也是不可取的.

我正在使用Delphi XE3

例如:

ICollectionItem = interface
  function GetID : string;
  property ID : string read GetId;
end;

TGenericCollection<T: ICollectionItem> = class
  function Add(T) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

相比

TSomeClass = class(TInterfacedObject, ICollectionItem)
  function GetId : string;
end;

TSomeClassList = class
  function Add(item : TSomeClass) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

delphi generics delphi-xe3

9
推荐指数
1
解决办法
1256
查看次数

Delphi无法从TEdit获取文本

我在Delphi中编写代码时遇到了问题.即我无法访问Components,即使它们被声明并且我在上面的代码中使用它们(之前在程序中,现在我试图在函数中使用它们 - 也许这就是我不知道的原因,我不擅长德尔福).我做了几个屏幕让它看起来更清晰.看一看.

http://imageshack.us/photo/my-images/90/weirddelphi1.png/

http://imageshack.us/photo/my-images/837/weirddelphi2.png/

http://imageshack.us/photo/my-images/135/weirddelphi3.png/">

正如您在第一个屏幕上看到的那样,我遇到了编译器错误.它表示组件不存在,但在第三个屏幕上,您可以看到该组件存在.在第二个屏幕上我甚至可以使用这个组件(可以成功调用代码完成,但是如果我尝试在secondFunction的范围内调用它,我会得到如下错误:"由于源代码中的错误而无法调用代码完成" - 但是地狱是错误?!).如果我评论这两行(参考Edit7和Edit8),我可以毫无问题地运行程序.我真的无法弄清楚出了什么问题,如果有人能给我一些建议,我将不胜感激.我不想在这里发布整个代码,因为它需要大约300行,但是如果你需要知道别的东西来解决这个问题,那么请问我会告诉你..

我没有足够的声望点来发布超过2个超链接,因此您必须使用最后一个进行"复制和粘贴":D

delphi function

7
推荐指数
1
解决办法
5442
查看次数

为什么我宁愿使用本机dll或com服务器从C#调用Delphi代码?

我们即将编写一个C#Web服务,它将公开本机Delphi GUI应用程序中包含的功能.为什么我会选择将Delphi代码包装在本机dll中,为什么我要将它包装在COM服务器中?换句话说:当选择一个而不是另一个时,我需要考虑哪些因素?我对编码,调试,(自动)测试,部署(客户安装)和性能(开销?)方面的因素感兴趣.

c# delphi com dll interop

7
推荐指数
1
解决办法
290
查看次数

仅允许使用信号量的3个应用程序实例

我正在尝试使用信号量实现一个简单的例程,这将允许我只运行3个应用程序实例.我可以使用3个互斥锁,但到目前为止,这不是一个很好的方法

var
  hSem:THandle;
begin
  hSem := CreateSemaphore(nil,3,3,'MySemp3');
  if hSem = 0 then
  begin
    ShowMessage('Application can be run only 3 times at once');
    Halt(1);
  end;
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

delphi semaphore

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

IAuthenticationResponse.GetExtension <ClaimsResponse>()始终返回null

更新 感谢@IvanL的评论,结果发现该问题是Google特有的.我已经尝试过其他提供商,并且一切都按预期工作.谷歌似乎似乎没有发送索赔信息.还没有能够弄清楚为什么或我需要以不同方式让谷歌发送它.

在黑暗中狂野的刺伤说它可能与默认为http://:/的领域有关,因为我看到安德鲁·阿诺特的答案,谷歌根据通过身份验证传递的领域更改了同一帐户的声称标识符请求.

另一个可能很重要的信息:与网络上可以找到的使用dotnetopenauth的许多例子不同,我没有使用"简单"的文本框并自己编写openIdIdentifier,但我使用的是openID选择器,并提供了openIdIdentifier传递给了ValidateAtOpenIdProvider.(根据对ASP.NET MVC 4应用程序文章添加OpenID身份验证.)

问题是:当使用Google作为openId提供者时,为什么IAuthenticationResponse.GetExtension()总是返回null,否则所有关于谷歌的所有相关问题(根据需要请求电子邮件,AXFetchAsSregTransform等)都已得到解决?

原版的

我正在努力让DotNetOpenAuth解析从提供程序返回的响应.遵循向您的ASP.NET MVC 4应用程序添加OpenID身份验证的说明,直至登录应该正常工作,并返回主页的登录结果,并在右上角显示用户名(昵称).(这取决于"用户应该在这一点上看到以下内容:"只是文章的一半).

我使用Visual Studio Web Developer 2010 Express和C#.DotNetOpenAuth版本是4.0.3.12153(根据Windows资源管理器的packages.config,4.0.3.12163).

我的web.config按照激活AXFetchAsSregTransform中的说明进行了修改,这是DotNetOpenId的解决方案- Open Id获取一些数据

不幸的是,它还不足以让它为我工作.

openid-selector工作正常,可以正确选择openid提供程序.身份验证请求创建如下:

    public IAuthenticationRequest ValidateAtOpenIdProvider(string openIdIdentifier)
    {
        IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier));

        var fields = new ClaimsRequest()
        {
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require,
            Nickname = DemandLevel.Require
        };
        openIdRequest.AddExtension(fields);

        return openIdRequest;
    }
Run Code Online (Sandbox Code Playgroud)

这一切都有效.我可以登录并授权该页面接收我的信息,然后调用以下内容GetUser:

    public OpenIdUser GetUser()
    {
        OpenIdUser user = null;
        IAuthenticationResponse …
Run Code Online (Sandbox Code Playgroud)

c# dotnetopenauth asp.net-mvc-4

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

断言在库初始化期间没有被阻塞除掉

更新

进一步调查表明,由于一些不正确的配置文件,断言没有使用Delphi主机触发.一旦解决了这个问题,Delphi主机就像C#主机一样死机.

请注意,所有这些都与XE2 64位版本相关联.我们已经注意到断言杀死了Delphi 64位调试器,而他们没有使用32位平台.

替换AssertErrorProc和只是做一些日志记录可以解决这种情况,对于Delphi调试器来说都是我们的C#和Delphi主机.

两个主机都可以在断言位置抛出异常.唯一的例外由抓住除了到位块.

使用Delphi XE3无法重现这个问题(感谢@David帮助解决这个问题),因此目前的状态是这与Delphi XE2中的(错误)异常/断言处理有关,特别是在64位平台上.


我有一个Delphi DLL,它可以从一个自托管的C#web服务中调用.出于调试目的,也可以从Delphi可执行文件中调用此DLL.

DLL可以并且已经成功地从Delphi和C#主机中使用.

今天我遇到了在初始化DLL时执行的代码中触发断言的情况,并发现在Delphi进程托管时成功阻止断言离开DLL,但是没有被捕获并导致主机死掉是一个C#进程.

Delphi DLL

Delphi DLL有自己的DllProc过程,可以从dpr手动调用,因为Delphi RTL"劫持"入口点以允许单元初始化.有关详细信息,请参见http://docwiki.embarcadero.com/VCL/XE/en/System.DLLProc.

Delphi DLL dpr代码:

begin
  DllProc := MyDllMain;
  MyDllMain(DLL_PROCESS_ATTACH);
end.
Run Code Online (Sandbox Code Playgroud)

自定义dll主程序只是确保在首次加载DLL时初始化某些结构,并在最后一个"加载器"离开时完成.

procedure MyDllMain(Reason: Integer);
begin
  // ...
  //  DLL_PROCESS_ATTACH:
      begin
        if _RefCount < 1 then
          InitializeDLL;

        Inc(_RefCount);
      end;
  // ...
end;
Run Code Online (Sandbox Code Playgroud)

InitializeDLL过程受try except块保护,专门用于防止异常转义DLL.

procedure InitializeDLL;
begin
  try
    // Some code triggering an Assert(False, 'Whatever');
  except
    on E: Exception do
      TLogger.LogException('InitializeDLL');
    // Don't raise through. Exceptions should …
Run Code Online (Sandbox Code Playgroud)

.net c# delphi pinvoke delphi-xe2

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

在不同的服务器上将ASP.NET Web API应用程序部署到IIS 7

我几乎花了好几个小时试图将Web API应用程序部署到IIS.我无法相信在任何我能找到的地方都没有在线的有用教程.这是我的情况.

  • 我有一个非常基本的Web API应用程序.它使用的是.NET Framework 4.0.它没有做任何事我只想在这一点上看到主页.

  • 我在本地计算机上的Visual Studio 2012中开发它.我可以点击我的本地主机并查看主页,甚至通过Fiddler发布一些数据效果很好.

  • 我使用Build-> Publish将解决方案发布到我的本地文件系统.

  • 然后我将该目录中的所有内容复制并粘贴到我的Web服务器(实际上使用存储库但为了简单起见)

  • 我在IIS中创建了一个全新的应用程序池..NET 4.0集成.

  • 我将包含我发布的代码的文件夹放在我的主网站目录中.文件夹名称是WebAPI.

  • 我在IIS中创建了一个新网站,附加到我创建的新应用程序池中.

  • 我启动网站,在localhost上浏览它,一切都很完美.

  • 我尝试从外部网站"website.com/WebAPI/api"获取一个

    403.14 - 禁止Web服务器配置为不列出此目录的内容.

我确定我做错了什么,我从来没有在另一台服务器上向IIS部署MVC应用程序.我也可以通过IIS在本地计算机上部署它.我错过了什么?谢谢!

编辑:是的,我的服务器有其他运行良好的.NET 4.0应用程序.

deployment iis asp.net-mvc iis-7 asp.net-web-api

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

如何使用运行时包构建"需要导入的数据引用"

为了帮助我们模块化单片应用程序,我们正在设置用于调试版本的包,同时仍然编译为发布版本的单个exe.

我们的一个包(EAUtils)包含一个正在生产的单元[DCC Error] E2201 Need imported data reference ($G) to access 'SMsgDlgWarning' from unit 'SystemUtils'.

在构建EAUtils包本身时会发生这种情况.我还没有构建依赖于EAUtils的包.EAUtils仅依赖于rtl/vcl包和我为Jedi WinApi单元创建的包.

这是行的结果:

// This is a TaskDialog override, with the same args as the old MessageDlg.
function TaskDialog(const aContent: string; const Icon: HICON = 0; 
  const Buttons: TTaskDialogCommonButtonFlags = TDCBF_OK_BUTTON): Integer;
const
  Captions: array[TMsgDlgType] of Pointer = (@SMsgDlgWarning, @SMsgDlgError, @SMsgDlgInformation, @SMsgDlgConfirm, nil);
var
  aMsgDlgType: TMsgDlgType;
  aTitle: string;
begin
  aMsgDlgType := TaskDialogIconToMsgDlgType(Icon);
  if aMsgDlgType <> mtCustom then
    aTitle := LoadResString(Captions[aMsgDlgType])
  else
    aTitle := …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2 runtime-packages resourcestring

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

当我给它一个负数时,为什么带'%u'的格式打印错误值?

为什么会Format('%u', [-100])导致'4294967196'?我在D7和XE2中对此进行了测试.

关于该功能的文档Format说:

%u无符号十进制.与%d类似,但不输出任何符号.

所以我希望得到一个结果'100'.

这是一个错误吗?

delphi string-formatting

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

在类构造函数中完成类注册时未调用的类构造函数

我正在编写一个基于TDictionary的控制系统的简单依赖注入/反转,它包含抽象类引用及其各自的实现者类.

我的目标是:

  • 避免按类型直接实例化(显然).
  • 在dpr中包含一个类的单元应该足以让它注册并可通过di/ioc系统进行选择和实例化.
  • 仅在实现部分中声明具体的实现类.
  • 使用类构造函数而不是初始化部分.

顺便说一句,我知道使用类构造函数来利用智能链接并希望包含一个足以使类可用的单元相互击败.我也想使用类构造函数而不是初始化部分.我想将所有类初始化/注册代码放在一起,而不必在类构造函数和初始化部分之间进行拆分.

问题

我希望将类注册到工厂中的类构造函数中.不幸的是,编译器并不认为通过在自己的类构造函数中使用其类型来"触及"类.

当我将注册函数放在初始化部分时,编译器确实认为该类被触摸并调用类构造函数.但这违背了我在类构造函数中保留所有类初始化代码的操作的目标.

两个问题

  • 编译器是否应该考虑在自己的类构造函数中使用类"触及类",还是期望编译器做太多?
  • 在没有使用初始化部分的情况下,有没有人对如何实现我的目标有任何聪明的想法?

应用程序中使用的抽象类:

TSite = class abstract (TObject)
  function GetURL: string; virtual; abstract;
  property URL: string read GetURL;
end;

TSites = class (TList<TSite>);

TThisApplication = class abstract (TObject)
  function Sites: TSites; virtual; abstract;
end;
Run Code Online (Sandbox Code Playgroud)

TThisApplication的具体实现类(在实现部分中声明!)

  TThisApplicationConcrete = class(TThisApplication)
  class constructor ClassCreate;
  strict private
    FSites: TSites;
    function Sites: TSites; override;
  end;

class constructor TThisApplicationConcrete.ClassCreate;
begin
  RegisterImplementorClass(TThisApplication, TThisApplicationConcrete);
end;

function TThisApplicationConcrete.Sites: TSites;
var
  SiteList: TSites;
begin
  if not …
Run Code Online (Sandbox Code Playgroud)

delphi class-constructors

4
推荐指数
2
解决办法
1203
查看次数

CodeIgniter不喜欢视图中的方法吗?

我正在玩CodeIgniter; 希望将一些旧的,丑陋的PHP转换为更易于维护的框架.但是,我遇到了一个相当令人沮丧的障碍 - 我似乎无法在我的观点中定义方法.任何时候我尝试我得到一个完全空白的页面,当我查看调试日志时,处理似乎在视图加载后停止.我可以在视图中定义方法吗?如果没有,为什么,你会建议什么变通方法?

注意:该方法与格式化输出字符串有关.

php codeigniter

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