小编Tih*_*uan的帖子

Delphi中重复的setter逻辑

对于类的每个setter,我必须实现一些事件逻辑(OnChanging,OnChanged):

procedure TBlock.SetWeightIn(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightIn;
  DoOnChanging(OldValue, Value);
  FWeightIn := Value;
  DoOnChanged(OldValue, Value);
end;

procedure TBlock.SetWeightOut(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightOut;
  DoOnChanging(OldValue, Value);
  FWeightOut := Value;
  DoOnChanged(OldValue, Value);
end;
Run Code Online (Sandbox Code Playgroud)

你能否建议一种方法来实现这一点,而不必为每个setter重复所有这些行?

delphi pascal delphi-2006

9
推荐指数
2
解决办法
363
查看次数

如何使用Indy 10和OpenSSL通过HTTPS下载文件?

我有以下任务:使用HTTPS和身份验证下载文件.Indy似乎要走了,但由于某种原因它到目前为止还不起作用.我有以下内容:

  • 我用来下载的TIdHTTP组件
  • 用于创建URL的TIdURI组件
  • 应该提供安全连接的TIdSSLIOHandlerSocketOpenSSL组件.所需的DLL位于二进制文件夹中.

该站点还需要身份验证,我在URL中包含用户/传递,如下例所示.简而言之,这是代码:

URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;

HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IOHandler.SSLOptions.Method := sslvSSLv3;
  HTTP.IOHandler := IOHandler;
end;

HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以非常快速地获得"读取超时"EIdReadTimeout异常.在浏览器中测试URL可以正常工作.关于什么缺失或我做错了什么的任何想法?

delphi openssl indy delphi-2006

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

缓存计算值的方法

在我们正在开发的Delphi应用程序中,我们有一个相关对象的大结构.这些对象的某些属性具有在运行时计算的值,我正在寻找一种方法来缓存更密集计算的结果.我使用的方法是在第一次计算私有成员时保存值.这是一个简短的例子:

unit Unit1;

interface

type
  TMyObject = class
  private
    FObject1, FObject2: TMyOtherObject;
    FMyCalculatedValue: Integer;
      function GetMyCalculatedValue: Integer;
  public
    property MyCalculatedValue: Integer read GetMyCalculatedValue;
  end;

implementation

  function TMyObject.GetMyCalculatedValue: Integer;
  begin
    if FMyCalculatedValue = 0 then
    begin
      FMyCalculatedValue :=
        FObject1.OtherCalculatedValue + // This is also calculated
        FObject2.OtherValue;
    end;

    Result := FMyCalculatedValue;
  end;

end.
Run Code Online (Sandbox Code Playgroud)

用于计算的对象更改并且应重置和重新计算缓存的值并不罕见.到目前为止,我们通过使用观察者模式解决了这个问题:对象实现OnChange事件,以便其他人可以订阅,在更改和重置缓存值时得到通知.这种方法有效,但有一些缺点:

  • 管理订阅需要大量内存.
  • 当缓存值取决于大量对象(例如列表)时,它不能很好地扩展.
  • 依赖性不是非常具体(即使缓存值仅依赖于一个属性,当其他属性发生更改时,它也将被重置).
  • 管理订阅会影响整体性能并且难以维护(对象被删除,移动,......).
  • 目前尚不清楚如何根据其他计算值处理计算.

最后一个问题:你能否提出其他方法来实现缓存的计算值?

delphi oop caching delphi-2006

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

Delphi中的Web应用程序

我正在评估使用Delphi(ISAPI/CGI/...)编写Web应用程序的可能性.我仍然看不到使用Delphi而不是"经典"Web开发框架的充分理由.

如果您有这方面的经验,请分享您的意见.你会推荐Delphi而不是PHP/Rails/ASP/......吗?你知道用Delphi编写的任何Web应用程序吗?(不是网络服务)

delphi cgi isapi

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

如何在不引用每一行的情况下分配多行字符串值?

有没有办法在Delphi中分配多行字符串值而不必引用每一行?

编辑(具体问题):我有一些SQL查询,我想在Delphi外面测试.复制查询时,每次添加和替换引号都会产生一些开销.

delphi pascal

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

如何使用DDL更改Access中列的"必需"属性?

在访问表中,我有一个"Required"属性设置为"True"的列.我需要一个查询,将其更改为"False".我尝试了以下但没有成功:

ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30) NULL;
Run Code Online (Sandbox Code Playgroud)

sql ms-access

3
推荐指数
2
解决办法
3362
查看次数

Indy FTP TransferType

我正在使用IdFTP(Indy 10)组件从远程位置下载一些文件(zip和txt).在获取每个文件之前,我将TransferType设置为二进制.

IdFTP.TransferType := ftBinary;
IdFTP.Get(ASource, ADest, AOverwrite);
Run Code Online (Sandbox Code Playgroud)

我希望可以使用二进制模式下载文本和二进制文件.但是,正确下载zip文件时,看起来文本文件内容会混乱.如果我将TransferType设置为ASCII文本文件,它将按预期工作.如何检测为给定文件设置的TransferType?有共同点或自动设置吗?

delphi ftp indy

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

Delphi 2006重构键盘映射

如何更改Delphi 2006中的默认重构键盘映射?

delphi delphi-2006

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

标签 统计

delphi ×7

delphi-2006 ×4

indy ×2

pascal ×2

caching ×1

cgi ×1

ftp ×1

isapi ×1

ms-access ×1

oop ×1

openssl ×1

sql ×1