新学DELPHI,问一个有关于类的问题。(50分)

  • 主题发起人 主题发起人 babyxinxin
  • 开始时间 开始时间
B

babyxinxin

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
clsLoadDLLRes = class(TObject)
private
strDLLName:string;
protected
public
constructor Create;
destructor Destroy;
function GetDLLName:string;
procedure SetDLLName(para_DLLName:string);
published
property DLLName:string read GetDLLName write SetDLLName;
end;

var
Form1: TForm1;
clsLoadDLLResA: clsLoadDLLRes;


implementation
constructor clsLoadDLLRes.Create ;
begin
inherited create;
end;
destructor clsLoadDLLRes.Destroy ;
begin
inherited Destroy;
end;
function clsLoadDLLRes.GetDLLName :string;
begin
GetDLLName:=DLLName;
end;
procedure clsLoadDLLRes.SetDLLName(para_DLLName:string);
begin
DLLName:=para_DLLName;
end;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
clsloaddllresa:=clsloaddllres.Create ;
clsloaddllresa.DLLName :='abc';
clsloaddllresa.Destroy ;
end;
end.

运行时出错:
“Project Project.exe raised exception class EStrackOverflow with message 'Stack overflow'.Process stopped.Use Step or Run to continue.”
停在“ procedure clsLoadDLLRes.SetDLLName(para_DLLName:string);”的Begin处。

请问,这段代码有问题吗?应该如何做才对呢?
 
//
procedure clsLoadDLLRes.SetDLLName(para_DLLName:string);
begin
strDLLName := para_DLLName
//DLLName:=para_DLLName
//
end;
 
constructor clsLoadDLLRes.Create ;
begin
strDLLName:='';//要初试化
inherited create;
end;
function clsLoadDLLRes.GetDLLName :string;
begin
GetDLLName:=strDLLName;//GetDLLName:=DLLName;
end;
procedure clsLoadDLLRes.SetDLLName(para_DLLName:string);
begin
strDLLName := para_DLLName
//DLLName:=para_DLLName
//
end;

 
To:yostgxf
你的基本上是完整正确的了。
不过有一点我觉得奇怪的是,我把你的代码粘到delphi中后,仍然报错我发贴的那种说什么堆栈溢出的错误,后来反复试了十几次才OK,这是怎么回事呢?是我的计算机软件有毛病还是delphi有毛病?这是一种普通现象,还是我遇到的个别现象?
 
不知道是计算机有毛病还是delphi有毛病,我从来就没遇到过。
你最好在下面的函数说明中加 override;
destructor Destroy;override;
 
在释放控件的时候就好是用Free;
请下面的源代码:
destructor TObject.Destroy;
begin
end;

procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;

在用Free的释放的时候会调用Destory方法的。
 
PME模型都没搞清楚! 反复的调用自己当然会堆栈溢出了.
象你这个类, 最好改成下面这样, 简单明了:
type
clsLoadDLLRes = class(TObject)
private
FDLLName:string;
procedure SetDLLName(Value:string);
published
property DLLName:string read FDLLName write SetDLLName;
end;

implementation

procedure clsLoadDLLRes.SetDLLName(Value:string);
begin
FDLLName := Value;
end;
 
后退
顶部