标签: delphi-2006

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
查看次数

如何在Delphi 2006项目的所有文件中进行全局搜索和替换

救命 !!!

我花了大约10分钟寻找一种方法来搜索和替换Delphi 2006项目中的所有文件.

请问你能告诉我怎么做

delphi delphi-2006

8
推荐指数
2
解决办法
4578
查看次数

缓存计算值的方法

在我们正在开发的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区分大小写 - "覆盖方法应该与祖先的情况相匹配"

今天我遇到了一个'奇怪'的暗示:

覆盖方法xxxx应该匹配祖先yyyy的情况.

解决方案是在祖先中完全声明方法名称....我相信这是自Delphi.Net编译器以来在编译器中休息的东西......

完全按照祖先的方式声明方法使编译器"无声".在Delphi 2006及其他版本中还有其他"区分大小写"的提示/警告?

delphi compiler-construction delphi-2006

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

从Delphi中的TList开始删除大块项目的有效方法是什么?

从TList删除(0)是昂贵的,因为所有后续项目都需要向下移动.如果我需要从更大的列表的开头删除大量项目,那么最快的方法是什么?

delphi delphi-2006 tlist

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

Delphi - 在运行时创建的TXMLDocument生成AV,表单上的组件正在工作

我正在运行时创建一个TXMLDocument实例,以加载和解析XML文件.您可以查看以下代码:

    unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type
  Txml = class(TForm)
//    XMLDocument1: TXMLDocument;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  xml: Txml;

implementation

{$R *.dfm}

procedure Txml.FormCreate(Sender: TObject);
var    i,j:integer;
       aNode:IXMLNode;
       ws:String;
       XMLDocument1:TXMLDocument;
begin
 Memo1.Lines.Clear;
 XMLDocument1 := TXMLDocument.Create(nil);
 try
  XMLDocument1.LoadFromFile('C:\a.xml');
  XMLDocument1.Active := true;
  aNode := XMLDocument1.ChildNodes.First;
  while aNode<>nil do
  begin
   for i := 0 to aNode.ChildNodes.Count-1 do …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2006 txmldocument

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

使用Win32 API绘制文本时如何覆盖ClearType设置?

我写了一个小应用程序,它在内存中的图像上绘制文本并将它们写入文件.基本的Delphi代码看起来类似于:

var
   Canvas : tCanvas;
   Text : WideString;
   TextRect : tRect;
begin
   Canvas := Bitmap.Canvas;
   Canvas.Brush.Color := clBlack;
   Canvas.Pen.Color := clBlack;
   Canvas.Font.Name := 'Courier New';
   Canvas.Font.Size := 11;
   Canvas.Font.Color := clWhite;

   TextRect := ...;  // calculate text position
   DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), TextRect, DT_NOCLIP or DT_NOPREFIX or DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,绘制的文本因运行应用程序的计算机的ClearType设置而异.我希望在我的应用程序中有一个一致的输出,无论本地ClearType设置如何(输出都不会直接显示到屏幕上).是否有一些Win32 API选项来覆盖本地ClearType设置?

windows delphi winapi delphi-2006

8
推荐指数
2
解决办法
1265
查看次数

Delphi 2010密码学库

你能推荐一个与Delphi 2006,Delphi 2009和Delphi 2010一起使用的开源Delphi加密库

算法需要:DES,MD5,SHA-1

delphi cryptography delphi-2009 delphi-2006 delphi-2010

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

How to convert between TVarRec and Variant?

Is there a standard way to convert between TVarRec and Variant values?

I want to parse an 'array of const' and use the values to populate parameters in a TMSQuery. To do this I'm using a list of column names (generated from TMSQuery.KeyFields), and matching the values in the array with the column names in KeyFields (by position), then using the column name to set the corresponding parameter using ParamByName.

The code below is what I've come up with, but …

delphi delphi-2006

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

Delphi - 当处于插入/编辑状态时,TDataSet确定它是否被修改

当数据集已处于插入状态时,如何确定数据感知组件字段是否已被修改?我想知道一个字段是否真的被"修改"了.(我不在乎用户是否在某个字段中输入了某些东西,然后擦除所有内容,这意味着发生了修改).

DataSet.Modified,DataSet.UpdateStatusChangeCount都没有解决我的问题.

LE:让我更深入地解释一下.所以,初始数据集看起来像

-------------------------------------
|PK  | Field1| Field2| Field3|Field4|
-------------------------------------
| 1  |  a    | b     | c     | d    |  
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

插入后

-------------------------------------
|PK  | Field1| Field2| Field3|Field4|
-------------------------------------
| 2  |       |       |       |      |  
-------------------------------------
| 1  |  a    | b     | c     | d    |  
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

当数据集真正被修改时

-------------------------------------
|PK  | Field1| Field2| Field3|Field4|
-------------------------------------
| 2  | avalue|       |       |      |  
-------------------------------------
| 1  |  a    | b     | c     | …
Run Code Online (Sandbox Code Playgroud)

delphi dataset delphi-2006

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