在Delphi中使用类的问题请教高手

bigban 2001-06-29 05:35:19
请看以下程序,我在Unit2单元中建立了一个类TParams,在Unit1单元中建立了一个类TMyParams,它是从TParams继承而来的。在程序运行时出错:TMyParams不能使用TParams中的私有变量。但把两个类写在一个单元中TMyParams能使用TParams中的私有变量。我想在一般的设计中总会把父类写在一个单独的单元中的,如何解决这个问题?
另:即使把两个类写在一个单元中,程序运行进没问题,但当程序结束时(点击关闭按钮)程序却报错,这是为何,如何避免?

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyParams = Class(TParams)
private
FDpt:string;
public
function getdpt():string;
procedure setdpt(dpt:string);
end;
var
Form1: TForm1;
myParams1:TMyparams;
implementation

{$R *.DFM}

procedure TMyParams.setdpt(dpt:string);
begin
fdpt:=dpt;
end;

function TMyParams.getdpt ():string;
begin
result :=fdpt;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
myParams1.setstyle(3);
showmessage(inttostr(myParams1.readstyle));
myParams1.setdpt('aaa');
showmessage(myparams1.getdpt);
end;

end.



unit Unit2;

interface
type
TParams = Class
private
FStyle:integer;

public
function readstyle():integer;
procedure setstyle(style:integer);
end;
var
Params:TParams;
implementation
function TParams.readstyle():integer;
begin
result:=FStyle;
end;
procedure TParams.setstyle(style:integer);
begin
FStyle:=style;
end;

end.
...全文
85 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
guig 2001-06-30
  • 打赏
  • 举报
回复
>>var
>> Form1: TForm1;
>> myParams1:TMyparams;
Form1一般情况下会在工程文件(后缀为dpr)中被实例化,
这样有些人会误解为将变量定义放在此处就会被自动创建,
不知你是不是这样认为的。
!!!myParams1没有被实例化。在执行Button1Click内的代码时肯定会出错。

BTW:以后提问中涉及到有出错提示的,能不能将出错的提示也写出来,
这样对确定问题的原因会有些帮助。
sleeepboy 2001-06-29
  • 打赏
  • 举报
回复
你的myparams1没有create
C_Sharp 2001-06-29
  • 打赏
  • 举报
回复
什么错呢?
石榴刺猬 2001-06-29
  • 打赏
  • 举报
回复
你那个问题不是程序的问题,可能是你哪里用到的内存没有释放,或者访问了已经释放的内存吧。
具体看看错误内容吧
bigban 2001-06-29
  • 打赏
  • 举报
回复
不能读私有变量的问题已解决。但当程序结束时(点击关闭按钮)程序却报错,这是为何,如何避免?

C_Sharp 2001-06-29
  • 打赏
  • 举报
回复
可以的
unit Unit1;

interface

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

type
TTest = class(TForm2)
procedure ShowTest;
end;

TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


{$R *.dfm}

{ TTest }

procedure TTest.ShowTest;
begin
ShowMessage(FTest);
end;

end.


unit Unit2;

interface

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

type
TForm2 = class(TForm)
private
{ Private declarations }
protected
FTest: string;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

end.

bigban 2001-06-29
  • 打赏
  • 举报
回复
我也看到过有资料上这样说,但我把Private改为Protected后为什么还不行?出的是同样的错误。哪位能给我举个例子?
largewang 2001-06-29
  • 打赏
  • 举报
回复
基本知识:不在同一单元中就不能访问父类的私有变量(对象),
解决方法就是不让它在私有部分申明.
InsideDelphi 2001-06-29
  • 打赏
  • 举报
回复
把Private改为Protected,你的目的就达到了

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧