基础问题(20分)

  • 主题发起人 主题发起人 xuefeiyang
  • 开始时间 开始时间
X

xuefeiyang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想写一个函数调用,但是不知道应该在那里声明,他老是说我未定义
请问应该在下面那个地方声明呢
最好给个简单例子
unit dy;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, StdCtrls, Grids, DBGrids, ComCtrls, Qrctrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}
 
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
//这里
private
{ Private declarations }
//这里
public
{ Public declarations }
//或这里
end;

如果你要调用其他form中的函数
别忘了在前面加上 fromname.
而且该函数不能定义在private里
 
如果是类的函数调用,要在procedure Button1Click(Sender: TObject);
下面声明,
如果是一般函数调用,再var下面声明
 
谁能说明一下在打????的四个地方定义有什么不同?
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
//这里????
private
{ Private declarations }
//这里????
public
{ Public declarations }
//或这里???
end;
var
Form1: TForm1;
//或这里???
 
这个你可以看看讲类的书,都有解释的
 
private私有成员 保护级别最高
public公有成员 保护级别其次
Publish发布成员 (公共车,控件发布的属性、函数、方法,你可以在对象浏览器见到,
如果是private或者public就看不到)
type 类成员声明 (封装的类, 可以继承)

var
Form1: TForm1;
//或这里???
这个是另一种函数的直接声明, 它属于form1, 调用时需要form1.函数

还有一种写法, 不写声明, 直接调用:

implementation

uses Unit2;

{$R *.DFM}
//函数直接写在这里 不需要声明


如:
function 函数名(参数1:类型,参数2:类型,…………):返回值;
begin
{你想干什么就干什么}
end;

以下是调用:
form1.Create()
begin
//调用它
end;

form1.button.click()
begin
//调用它
end;
调用时直接写函数名, 不用form来form去的。 它是属于应用程序(Application)级的,而
不是form级的。 因此,注意:如果你要在函数中引用form中的控件的属性或其他,
就必须:form1.控件名.属性
 
我这样写了一段直接调用,调试能通过,但是返回结果没有加一,原来是0返回还是0,为啥?
implementation

uses Unit2;

{$R *.DFM}

function cl(x:integer):integer;
begin
x:=x+1;
cl:=x;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
x:integer;
begin
x:=strtoint(form1.Edit1.text);
cl(x);
showmessage(inttostr(x));
end;
 
function cl(x:integer):integer;
begin
x:=x+1;
cl:=x;////应该是result:=x;
end;
 
TO 图兰多
问题依旧
 
这句错了,看来你对函数的参数类型和变量类型以及他们的作用域还不太清楚,应该是这样
function cl(x:integer):integer;
begin
x:=x+1;
cl:=x;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
x:integer;
begin
x:=strtoint(form1.Edit1.text);
showmessage(cl(x));
end;
 
图兰多的这一段说得不错:
function cl(x:integer):integer;
begin
x:=x+1;
cl:=x;////应该是result:=x;
end;
没有result也就没有返回值。这和TC中的retrun()语句是一样的。但是两者还是有区别。

naughtboy说的不错, 调用的时候如果你不想把调用和输出语句放在一起, 那么还得
定义一个临时变量, 存放返回结果, 因为函数调用的返回值是即时的, 调用一过,
返回值就没有了。好好研究一下函数的作用域吧。
直接调用输出:
showmessage(cl(x));
间接调用输出:
var
temp : integer;
begin
temp:=cl(x);
showmessage(temp);
end;
注意: 为了节省篇幅, 我把类型转换忽略掉了, 自己注意一下。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
541
import
I
后退
顶部