如何使用C#类似Math.Round
与MidpointRounding.AwayFromZero
在Delphi?
相当于什么:
double d = 2.125;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.AwayFromZero));
Run Code Online (Sandbox Code Playgroud)
输出: 2.13
在德尔福?
调用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
?我什么时候应该使用?
我有这条线:
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
规则?
我受到了这个问题的启发:如何制作一个具有全文搜索自动完成支持的组合框?
在回答工作得很好,但我想调整的建议列表高度/ 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) 我试图在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)
消息处理程序什么都不做时.
现在我在表单上删除了一个 …
是否有任何选项/配置NLog
来设置最大日志文件大小(例如5MB)?
我需要的是,当日志文件超过最大大小(我定义)时,它将备份旧文件(带有时间戳作为文件名),并开始写入新文件.
如何才能做到这一点?我更喜欢某种内置配置,但如果没有,可以手动安全地完成,而不会破坏日志文件吗?
在我的线程代码中,我需要等待一个文件被解锁才能进一步处理它.
该文件可能被另一个我无法控制的外部线程锁定.
目前我在我的线程中使用此代码:
...
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 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 FindFirst
(FindFirstFile
API)没有使用faDirectory
并且FindNext
将获得所有文件(它faAnyFile
不管指定使用哪个faDirectory
),而不仅仅是目录.这使得构建树的过程 非常缓慢.
是否有一种快速的方法来获取目录列表(树)而不使用FindFirst
/ FindNext
?
我想为我的整个应用程序使用自定义Hint窗口类.我使用Application.OnShowHint
,分析THintInfo
,并返回我自己TMyHintWindow
的HintInfo.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)