小编Eri*_*c G的帖子

使用带有泛型的枚举

我正在尝试创建一个泛型类,我可以使用一组枚举来启动内部的值.例如:

constructor TManager<TEnum>.Create;
var
  enum: TEnum;
  enumObj: TMyObject;
begin
  fMyObjectList:=  TObjectDictionary<TEnum,TMyObject>.Create([doOwnsValues],10);
  for enum:= Low(TEnum) to High(TEnum) do
  begin
    enumObj:= TMyObject.Create();
    fMyObjectList.Add(enum, enumObj);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

此外,以后的方法将通过枚举值获取对象,例如:

function TManager<TEnum>.Fetch(enum: TEnum): TMyObject;
begin
  fMyObjectList.TryGetValue(enum, Result);
end;
Run Code Online (Sandbox Code Playgroud)

但是,作为通用参数传递,delphi不知道TEnum将是一个枚举.我能以某种方式强制执行吗?

delphi generics enums

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

引用的可打印电子邮件显示某些电子邮件客户端中的等号

我正在生成电子邮件.它们在gmail和Outlook 2010中对我来说很好.但是,我的客户端看到=符号会被引用的可打印格式添加到行尾.它还会占用下一行的字符,但随后显示等号.

例:

line that en=
ds like this
Run Code Online (Sandbox Code Playgroud)

显示出来

line that en=s like this
Run Code Online (Sandbox Code Playgroud)

(注意:我的电子邮件中的EOL字符只是LF.没有CR.)

我正在确认我的客户端使用的Outlook版本,但我认为它是2007年.来自她的电子邮件标题似乎来自Exchange 6.5.

我的电子邮件是使用HtmlMimeMail5库在php中创建的.它们是多部分电子邮件,适用的部分发送时间:

Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Run Code Online (Sandbox Code Playgroud)

看来我可以确保我的电子邮件中没有任何内容达到76个字符的换行符,但这似乎是解决问题的错误方法.EOL角色应该不同吗?(在来自客户端的电子邮件中,EOL角色只是一个LF)其他任何想法?

email

3
推荐指数
1
解决办法
3371
查看次数

在Delphi中获取Advantage Database查询的进度

我已经搜索和搜索,但无法找到如何在Delphi中获取查询的进度.我已经找到了Advantage .NET数据提供程序的一些信息,但可以使用Delphi的一些帮助.

delphi advantage-database-server delphi-xe

3
推荐指数
1
解决办法
780
查看次数

使用多个catch块捕获重新引发的异常?

我正在捕获异常,对于该类中的特定异常类和错误代码,我会进行一些自定义处理.对于所有其他异常,我想使用通用错误处理程序.像这样:

on E:EADSDatabaseError  do
  begin
    case E.ACEErrorCode of
      5132: 
        begin
        //Custom handling
        end;    
      else
        begin
          raise;
        end;
    end;
  end;
on E:Exception do
  begin
    //usual handling
  end;
Run Code Online (Sandbox Code Playgroud)

对于原始错误中的大多数代码,我想通过一般错误处理程序.但是,重新加载它似乎不允许触发更一般的异常类处理程序.(我不确定我会期待它.我以前从未做过这种事.)

有两个人是我最好的选择try/excepts吗?

delphi delphi-2010

3
推荐指数
1
解决办法
966
查看次数

如何防止Advantage Database连接超时?

我有一个与优势数据库一起使用的Windows服务,偶尔会进行一些http调用.在极少数情况下,这些电话可能会很长.调整我的数据库连接超时.我没有使用数据模块或任何东西.只需手动创建连接.

我的主要问题是,如果我暂时没有使用它,通常会阻止连接超时?TAdsComponents是否会以某种方式发送在后台调用的保持活动消息?这是依赖于vcl所以我在服务中没有这个吗?不知何故,我觉得创建一个线程来进行我的http调用,并且在主线程中检查它每隔几秒钟完成一次会阻止连接死亡.这是真的吗?

delphi advantage-database-server

3
推荐指数
1
解决办法
853
查看次数

检查Advantage Database连接的运行状况

我保留了一个Advantage TAdsConnection对象池并按要求将它们移出.偶尔我得到一个导致6610错误,我假设因为它处于空闲状态并且连接被重置.我可以运行任何旧查询并捕获6610,但这是一个漫长的等待特定错误.

在我将优惠连接传回原状之前,是否有一种检查优势连接健康状况的好方法?

delphi advantage-database-server

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

为什么AsyncCall在主线程中运行?

我有一个运行长操作的模型对象.我正在尝试在线程中运行其中一些操作以保持接口响应,一次下载2件事等,但我想尽可能地从接口代码中隐藏这些细节.我正在尝试使用AsyncCall库,但有问题.

type EUpdaterAction = (auFoundCurrentVersion, auFoundUpdateVersion);

type
  TUpdater = class
  public
    procedure loadCurrentVersion();
    procedure notify(action: EUpdaterAction);
  end;

procedure TUpdater.loadCurrentVersion();
begin
  TAsyncCalls.Invoke(procedure 
  begin 
    Assert(Windows.GetCurrentThreadId() <> System.MainThreadID);
    //Really long code
    TAsyncCalls.VCLSync(procedure begin notify(auFoundCurrentVersion); end);
  end);
end;
Run Code Online (Sandbox Code Playgroud)

断言失败了.我是否需要做一些事情才能让它在一个单独的线程中运行,或者显示的第一个示例是否实际上并未在线程中运行?

delphi asynchronous delphi-2010

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

KeyDown KeyPress难题 - 如何在Ctrl +空格中取消空格

如果我理解正确,KeyDown事件不能阻止字符键(空格)传递给控件.

但KeyPress事件并没有告诉我Ctrl是否已关闭.

但是如果Ctrl关闭,我只需要取消空格.

如果ctrl也关闭,如何阻止编辑控件接收空格键?

目的:我有一个文本框,我正在从中提出搜索建议.我想使用快捷键ctrl + space弹出建议.但在这种情况下,我不想在编辑文本中添加空格.

delphi delphi-xe4

0
推荐指数
1
解决办法
1052
查看次数