标签: delphi-5

在Delphi 5中,Free可以提出例外吗?

在Delphi 5中,我目前编写的代码调用块中的Free多个变量finally,例如

...
finally
    a.Free;
    b.Free;
    c.Free;
end;
Run Code Online (Sandbox Code Playgroud)

这段代码假设Free永远不会引发,因为,例如,如果a.Free提出,内存bc将被泄露.这个假设是否合理?

delphi exception-handling delphi-5

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

Delphi:如何使用$ OVERFLOWCHECKS OFF来禁用溢出检查?

我有一些导致下溢的代码:

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, …

delphi integer-overflow delphi-5

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

德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?

今天最近在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个构造函数:

  • 杯子:整数
  • 杯子:整数; 茶壶:串
  • [茶壶:String ='']

问题:为什么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)

delphi constructor delphi-5 constructor-chaining

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

了解构造函数可见性

这是两个简单的类,最初都没有关键字(虚拟,重载,覆盖,重新引入):

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个案例没有:

1.祖先构造函数由后代隐藏:

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

这是有道理的,祖先构造函数是隐藏的,因为我已经声明了一个新的构造函数.

2.祖先虚拟构造函数由后代隐藏:

TComputer = class(TObject)
   constructor Create(Teapot: Integer); virtual;

TCellPhone = class(TComputer)
   constructor …
Run Code Online (Sandbox Code Playgroud)

delphi constructor delphi-5 constructor-chaining

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

如何在Delphi中模拟TFrame上的OnDestroy事件?

我怎样才能在Delphi中模拟一个OnDestroy事件TFrame


我简单地添加了一个constructordestructor我的框架,认为这是做什么的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 destructor delphi-5 tframe

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

如果需要,Delphi是否只能使用.dll?

我已将这两种方法添加到我的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 dll delphi-5

6
推荐指数
2
解决办法
3158
查看次数

在delphi中使用DCC32.exe构建

您好我正在使用以下命令构建我的delphi项目:

Command: dcc32.exe project.dpr d:\exe_folder
Run Code Online (Sandbox Code Playgroud)

上面的命令工作正常,我可以在输出文件夹中调用exe.但是当我通过IDE构建相同的项目时,然后在每次构建时,内部版本号会增加,因为我已经选中了"Auto Increament Build Number"选项.但是,通过命令行执行此操作时,内部版本号不会增加.任何通过命令行修改构建信息/版本信息的选项??

谢谢..

delphi delphi-5

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

TF5Panel在D5中都很相似

我正在寻找可TFlowPanel与D5一起使用的(或类似的)实现.
基本上我需要在(使用垂直滚动条)TFlowPanel内部工作TScrollBox,因此控件将根据宽度进行换行TScrollBox.

图像基本上显示了我需要的东西:

在此输入图像描述

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

在此输入图像描述

使用垂直滚动条:

在此输入图像描述

delphi delphi-5

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

为什么类的实例(TInterfacedObject,IDropTarget)不能自动释放?

我正在实现我的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)

delphi delphi-5 tinterfacedobject

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

Val过程是否使用DecimalSeparator?

StrToFloat使用DecimalSeparator格式设置.

似乎Val只接受包含.小数分隔符的字符串.

_ValExt(Val调用)中的ASM代码看起来它不使用DecimalSeparator.

我可以安全地依赖Val接受带有.小数分隔符的实数字符串的事实(?)吗?

delphi delphi-5

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