小编zig*_*zig的帖子

在Delphi中,Math.Round()与MidpointRounding.AwayFromZero等效吗?

如何使用C#类似Math.RoundMidpointRounding.AwayFromZero在Delphi?

相当于什么:

double d = 2.125;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.AwayFromZero));
Run Code Online (Sandbox Code Playgroud)

输出: 2.13

在德尔福?

c# delphi delphi-7

13
推荐指数
2
解决办法
871
查看次数

消息处理程序中的DefaultHandler(Message)和"inherited"有什么区别?

调用DefaultHandler(Message)inherited消息处理程序之间究竟有什么区别.例如:

TScrollBox = class(TScrollingWinControl)
private
  ...
  procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
  ...
end;

procedure TScrollBox.WMNCHitTest(var Message: TMessage);
begin
  DefaultHandler(Message);
end;
Run Code Online (Sandbox Code Playgroud)

为什么不打电话inherited?我什么时候应该使用?

delphi

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

WideChar集合:集合最多可包含256个元素

我有这条线:

const
  MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')];
Run Code Online (Sandbox Code Playgroud)

以上不编译,错误:

[错误]集最多可包含256个元素

但这行确实编译好了:

var WS: WideString;
if WS[1] in [WideChar('A')..WideChar('Z')] then...
Run Code Online (Sandbox Code Playgroud)

这也编译好了:

const
  MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];
  ...
  if WS[1] in MY_SET then...
Run Code Online (Sandbox Code Playgroud)

这是为什么?

编辑:我的问题是为什么 if WS[1] in [WideChar('A')..WideChar('Z')]编译?为什么MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];编译?他们是不是也需要申请set规则?

delphi delphi-7

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

TComboBox - 如何在下拉列表中调整下拉列表高度?

我受到了这个问题的启发:如何制作一个具有全文搜索自动完成支持的组合框

回答工作得很好,但我想调整的建议列表高度/ DropDownCount当用户键入文本,而列表已经掉了下来.

这是一个经过微小修改的MCVE - 当用户开始输入时,下拉列表将下拉,我还修复了当列表下拉时未设置为箭头的鼠标光标效果:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils, ExtCtrls;

type
  TComboBox = class(StdCtrls.TComboBox)
  private
    FStoredItems: TStringList;
    FOldCursor: TCursor; // NEW !!!
    procedure FilterItems;
    procedure StoredItemsChange(Sender: TObject);
    procedure SetStoredItems(const Value: TStringList);
    procedure CNCommand(var AMessage: TWMCommand); message CN_COMMAND; 
    procedure AdjustDropDownHeight; // NEW !!!
  protected
    // NEW !!!
    procedure KeyPress(var Key: Char); override;
    procedure DropDown; override;
    procedure CloseUp; override;
  public
    constructor Create(AOwner: TComponent); …
Run Code Online (Sandbox Code Playgroud)

delphi combobox delphi-7

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

TEdit和WM_PAINT消息处理程序的奇怪行为

我试图在TEdit没有焦点的控件上实现我自己的绘图(TEdit当编辑器没有完全显示其文本时显示省略号).所以我用这段代码加注了ed:

type
  TEdit = class(StdCtrls.TEdit)
  private
    FEllipsis: Boolean;
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

constructor TEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEllipsis := False;
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TEdit.Destroy;
begin
  FCanvas.Free;
  inherited;
end;

procedure TEdit.WMPaint(var Message: TWMPaint);
begin
  if FEllipsis and (not Focused) then
  begin
    // Message.Result := 0;
    // TODO...
  end
  else
    inherited;
end;
Run Code Online (Sandbox Code Playgroud)

请注意,当FEllipsis and (not Focused)消息处理程序什么都不做时.

现在我在表单上删除了一个 …

delphi vcl editcontrol

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

如何设置NLog最大文件大小?

是否有任何选项/配置NLog来设置最大日志文件大小(例如5MB)?

我需要的是,当日志文件超过最大大小(我定义)时,它将备份旧文件(带有时间戳作为文件名),并开始写入新文件.

如何才能做到这一点?我更喜欢某种内置配置,但如果没有,可以手动安全地完成,而不会破坏日志文件吗?

c# logging nlog

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

如何有效地等待文件解锁?

在我的线程代码中,我需要等待一个文件被解锁才能进一步处理它.

该文件可能被另一个我无法控制的外部线程锁定.

目前我在我的线程中使用此代码:

...
while IsFileInUse(FileName) and not Terminated do
begin
  Sleep(100);
end;
// process the file
Run Code Online (Sandbox Code Playgroud)

IsFileInUse 码:

function IsFileInUse(const FileName: string): Boolean;
var
  Handle: HFILE;
begin
  Handle := CreateFile(PChar(FileName),
    GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := (Handle = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(Handle);
end;
Run Code Online (Sandbox Code Playgroud)

是否有更好,更有效的方法来避免Sleep

delphi winapi

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

Delphi"default"关键字,旧版Delphi版本中包含Record类型

我在Delphi Detours库中有这个代码,我正在尝试移植:

type
  TInstruction = record
    Archi: Byte; { CPUX32 or CPUX64 ! }
    AddrMode: Byte; { Address Mode }
    Addr: PByte;
    VirtualAddr: PByte;
    NextInst: PByte; { Pointer to the Next Instruction }
    OpCode: Byte; { OpCode Value }
    OpType: Byte;
    OpKind: Byte;
    OpTable: Byte; { tbOneByte,tbTwoByte,... }
    OperandFlags: Byte;
    Prefixes: Word; { Sets of Prf_xxx }
    ...
  end;

var
  Inst: TInstruction;
begin
  ...
  Inst := default (TInstruction); // <-
  Inst.Archi := CPUX;
  Pvt := PPointer(AIntf)^; // vTable !
  PCode …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7 delphi-5

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

获取目录列表的最快方法是什么

我需要递归的建立一个树形结构只是目录,对于一个给定根/父路径.像"浏览文件夹"对话框.

Delphi FindFirst(FindFirstFileAPI)没有使用faDirectory并且FindNext将获得所有文件(它faAnyFile不管指定使用哪个faDirectory),而不仅仅是目录.这使得构建树的过程 非常缓慢.

是否有一种快速的方法来获取目录列表(树)而不使用FindFirst/ FindNext

delphi winapi

7
推荐指数
2
解决办法
1360
查看次数

TVirtualStringTree - 如何为VT列使用我自己的提示窗口类?

我想为我的整个应用程序使用自定义Hint窗口类.我使用Application.OnShowHint,分析THintInfo,并返回我自己TMyHintWindowHintInfo.HintWindowClass.这适用于所有控件,但我只有TVirtualStringTree Columns提示有一个奇怪的问题.

VT使用它自己的提示窗口和自己的结构HintInfo.HintData.我研究代码,并知道它使用了VTHintData.到现在为止还挺好.问题是,当我返回自己的提示窗口类(派生自THintWindow)时,它仅显示提示窗口一瞬间消失!

为树节点返回的提示没有问题.他们使用相同的方法/结构(VTHintData).

这是一个非常简单的MCVE:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, StdCtrls;

type
  TForm1 = class(TForm)
    VirtualStringTree1: TVirtualStringTree;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);    
  private
  public
    procedure ApplicationShowHint(var HintStr: string; var CanShow: Boolean;
      var HintInfo: THintInfo);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TMyHintWindow = class(THintWindow)
  public
    { nothing special here for now } …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview tvirtualstringtree

7
推荐指数
0
解决办法
414
查看次数