是Delphi的BUG还是书上写错了?(30分)

  • 主题发起人 风中的狼
  • 开始时间

风中的狼

Unregistered / Unconfirmed
GUEST, unregistred user!
看不少参考书上都说过程和函数需要在private和public中预先定义,然后才能引用!
可我在实际使用中不用定义却可以正常使用,而定义后却报错!
请问这是为什么?
此外,在某个Unit中使用的过程和函数,不能被别的unit引用,有什么方法可以解决?
(以上现象在本人机器和朋友公司的机器上都是如此,我使用的是Delphi中文版(梁明专用版本),
我朋友公司使用的是正版Delphi)
 
第一个问题不知所云.
第二个问题可以先uses 该单元,如果该函数不是私有的,你就可以用.
 
如果不写 private 或者 public, 确省就是 proctected.
private 只能在同一 unit 内被调用.
proctected 可在不同 unit 之间被调用, 但是仅限于被子类调用.
public 可在不同 unit 之间, 不同类之间调用.

在某个Unit中使用的过程和函数,不能被别的unit引用,
则不要在 interface 节中作说明. 直接在 implememntation 中定义.
 
to:yysun,吴剑明
谢谢你们给我的回答!
只不过我现在的问题是在private 或者 public中根本无法定义!
简单例程如下:
unit unit1;
interface
//Public procedure ShowMS;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TForm1 = class(TForm);
procedure Button1Click(Sender: TObject);
private
// procedure ShowMS;
{ Private declarations }
public
// procedure ShowMS;
{ Public declarations }
end;

var
Form1:TForm1;
implementation
{$R *.DFM}
procedure ShowMS;
begin
ShowMessage('程序运行中');
end;

procedure Button1Click(Sender: TObject);
begin
ShowMS;
end;

end.

这个简单的例程编译可以通过,但是请注意,这是在把private 或 public中关于过程
ShowMS的定义取消以后才成功运行!
如果在private 或 public中加入对过程ShowMS的定义,那么在程序编译时会报错,出错
信息为:“不可使用的外部说明ShowMS”(Delphi 5.0汉化版),同样,在InterFace中
定义也是如此,只不过出错更明显:让你死机没商量。
如果我对过程ShowMS的定义有问题,麻烦你们二位告诉我正确的定义方法,好吗?

 
在 private 或 public中定义的 ShowMS 需要这样的实现:
procedure TForm1.ShowMS;
begin
ShowMessage('程序运行中');
end;
您漏掉了 TForm1.
再教您一招: 在 private 或 public 中定义好 procedure/function 后按 Shift+Ctrl+C.
 
请注意:
procedure ShowMS;
改为 procedure TForm1.ShowMS;
procedure Button1Click(Sender: TObject);
改为 procedure TForm1.Button1Click(Sender: TObject);
由你原码知:这两个是类TForm1的成员。
不加类名,编译器会认为这是个普通过程。
而你的类声明了成员却没有实现,当然出错。
 
看了这个问题其实并不想说什么
不过又忍不住要说一句:
你认真学了Delphi没有!
不是刻意想责怪你,只是我希望作为一个或是想作一个合格的程序员,
不管是Delphi也好VBVC也好,
还是认真一点的好。
其实很多问题的自己就可以解决,关键是自己有没有尽力认真去做。
解决这个问题的最好办法就是,
先好好地看看书
恕我多嘴了;)
 
刚刚试过了,加入了TForm1,结果是一样!
:(
不过,谢谢yysun和张一健给我的答复!
 
to;carryon
谢谢您对我的指教!
只不过我想不明白的是上面的例程在Delphi 4中却是一切正常(即在private 或 public
中不加TForm1.直接定义),在Delphi 5中却不行!
所以我才有这个问题!
让您见笑了!
 
TForm1. 怎么加到 private 或 public 中去了呢?
另外您的程序中没有 Button1: TButton;
看来只能这样了:
1.您先把程序删到这样:
type
TForm1 = class(TForm)
private
public
end;

2.然后放上一个 Button. 双击那个 Button.
3.最后复制/粘帖下面的程序吧.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure ShowMS;
public
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ShowMS;
begin
ShowMessage('程序运行中');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMS;
end;

end.

 
好了,我以调试通过!没有问题!
unit unit1;
interface
//Public procedure ShowMS;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TForm1 = class(TForm) //;<-----你这儿多了个“;”笔误?
procedure Button1Click(Sender: TObject);
private
// procedure ShowMS;
//定不定义随意,定义为成员,不定义为普通过程。
{ Private declarations } //如果这儿定义,下面代码实现要加 TForm1。
public
// procedure ShowMS;
{ Public declarations }
end;

var
Form1:TForm1;
implementation
{$R *.DFM}
procedure ShowMS;
//见上面说明
begin
ShowMessage('程序运行中');
end;

procedure TForm1.Button1Click(Sender: TObject);
//加 TForm1.
begin
ShowMS;
end;

end.
 
顶部