在Delphi 5中,我目前编写的代码调用块中的Free多个变量finally,例如
...
finally
a.Free;
b.Free;
c.Free;
end;
Run Code Online (Sandbox Code Playgroud)
这段代码假设Free永远不会引发,因为,例如,如果a.Free提出,内存b和c将被泄露.这个假设是否合理?
我有一些导致下溢的代码:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := (t2 - t1);
Run Code Online (Sandbox Code Playgroud)
减法本身确实会产生溢出(下溢),但我不希望Delphi抛出EIntOverflow异常.所以我尝试通过禁用溢出检查来禁用溢出检查代码的生成:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
{$OVERFLOWCHECKS OFF}
delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
Run Code Online (Sandbox Code Playgroud)
然而即使有了OVERFLOWCHECKS OFF选项,它仍然会引发异常.生成的代码仍然包含检查:
替代文字http://i43.tinypic.com/intmrl.jpg
提醒文档$Q:
溢出检查
类型切换
语法 {$ Q +}或{$ Q-}
{$ OVERFLOWCHECKS ON}或{$ OVERFLOWCHECKS OFF}
默认 {$ Q-}
{$ OVERFLOWCHECKS OFF}
范围本地备注
$ Q指令控制溢出检查代码的生成.在{$ Q +}状态下,检查某些整数算术运算(+, - ,*,Abs,Sqr,Succ,Pred, …
今天最近在Stackoverflow上我了解到:
我一直试图弄清楚这一切,所以这是另一个非常具体的问题,支持我处理构造函数的主要问题.
更新:替换了整个问题:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
Run Code Online (Sandbox Code Playgroud)
构建TCellPhone时,可以使用3个构造函数:
问题:为什么constructor(Teapot: string='')不被隐藏?
现在我添加了第三个后代:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: …Run Code Online (Sandbox Code Playgroud) 这是两个简单的类,最初都没有关键字(虚拟,重载,覆盖,重新引入):
TComputer = class(TObject)
public
constructor Create(Teapot: Integer);
end;
TCellPhone = class(TComputer)
public
constructor Create(Teapot: Integer; Handle: string);
end;
Run Code Online (Sandbox Code Playgroud)
我会将这些以上的定义表示为略短的:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Run Code Online (Sandbox Code Playgroud)
构造时TCellPhone只有一个构造函数(int,string) - 因为祖先构造函数已被隐藏.我将指出可见的构造函数TCellPhone:
现在对于这个问题,前3个案例是有意义的,第4个案例没有:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Run Code Online (Sandbox Code Playgroud)
Teapot: Integer; Handle: string这是有道理的,祖先构造函数是隐藏的,因为我已经声明了一个新的构造函数.
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor …Run Code Online (Sandbox Code Playgroud) 我怎样才能在Delphi中模拟一个OnDestroy事件TFrame?
我简单地添加了一个constructor和destructor我的框架,认为这是做什么的TForm:
TframeEditCustomer = class(TFrame)
...
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
end;
constructor TframeEditCustomer.Create(AOwner: TComponent)
begin
inherited Create(AOwner);
//allocate stuff
end;
destructor TframeEditCustomer.Destroy;
begin
//cleanup stuff
inherited Destroy;
end;
Run Code Online (Sandbox Code Playgroud)
这个问题是,当我的析构函数运行时,框架上的控件已经被破坏并且不再有效.
原因在于包含表单的析构函数,它用于触发OnDestroy事件:
destructor TCustomForm.Destroy;
begin
...
if OldCreateOrder then DoDestroy; //-->fires Form's OnDestroy event; while controls are still valid
...
if HandleAllocated then DestroyWindowHandle; //-->destroys all controls on the form, and child frames
...
inherited …Run Code Online (Sandbox Code Playgroud) 我已将这两种方法添加到我的Delphi 5应用程序的第一个单元中.
function Inp(PortAddress: Integer): Integer; stdcall; external 'inpout32.dll' name 'Inp32';
procedure Output(PortAddress, Value: Integer); stdcall; external 'inpout32.dll' name 'Out32';
Run Code Online (Sandbox Code Playgroud)
但是,除非他们明确需要,否则我不想使用该软件发布inpout32库.目前程序在执行时说"未找到",除非它们存在于根或System32中.
用户只有在设置了特定选项时才会调用这些方法,但在使用inpout库之前,不会从.ini文件中收集这些方法.
有没有办法只在某些组件需要时才使用这个库,而不是按照我的方式声明它?
您好我正在使用以下命令构建我的delphi项目:
Command: dcc32.exe project.dpr d:\exe_folder
Run Code Online (Sandbox Code Playgroud)
上面的命令工作正常,我可以在输出文件夹中调用exe.但是当我通过IDE构建相同的项目时,然后在每次构建时,内部版本号会增加,因为我已经选中了"Auto Increament Build Number"选项.但是,通过命令行执行此操作时,内部版本号不会增加.任何通过命令行修改构建信息/版本信息的选项??
谢谢..
我正在寻找可TFlowPanel与D5一起使用的(或类似的)实现.
基本上我需要在(使用垂直滚动条)TFlowPanel内部工作TScrollBox,因此控件将根据宽度进行换行TScrollBox.
图像基本上显示了我需要的东西:

调整大小后,控件会自动重新定位:

使用垂直滚动条:

我正在实现我的IDropTarget基础:如何在不处理Windows消息的情况下允许表单接受文件丢弃?
David 的实施工作正常.但是IDropTarget(TInterfacedObject)对象不会自动释放,即使设置为'nil'也不会.
部分代码是:
{ TDropTarget }
constructor TDropTarget.Create(AHandle: HWND; const ADragDrop: IDragDrop);
begin
inherited Create;
FHandle := AHandle;
FDragDrop := ADragDrop;
OleCheck(RegisterDragDrop(FHandle, Self));
//_Release;
end;
destructor TDropTarget.Destroy;
begin
MessageBox(0, 'TDropTarget.Destroy', '', MB_TASKMODAL);
RevokeDragDrop(FHandle);
inherited;
end;
...
procedure TForm1.FormShow(Sender: TObject);
begin
Assert(Panel1.HandleAllocated);
FDropTarget := TDropTarget.Create(Panel1.Handle, nil) as IDropTarget;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FDropTarget := nil; // This should free FDropTarget
end;
var
NeedOleUninitialize: Boolean = False;
initialization
NeedOleUninitialize := Succeeded(OleInitialize(nil)); …Run Code Online (Sandbox Code Playgroud) StrToFloat使用DecimalSeparator格式设置.
似乎Val只接受包含.小数分隔符的字符串.
从_ValExt(Val调用)中的ASM代码看起来它不使用DecimalSeparator.
我可以安全地依赖Val接受带有.小数分隔符的实数字符串的事实(?)吗?