我是着这样写的: case x of 1: Prc := @tenfu1; 2: Prc := @tenfu2; end; 为什么程序会出错呀?是:Variable reqired Prc是过程变量,tenfu1和tenfu2是过程名!为什么会出错呀?
参照这个吧,很好的 type pRecord1=^record1; record1=record x,y:integer; end; pRecord2=^record2; record2=record s:string; end;procedure prc1(p:pRecord1); Begin p.x:=518; end; procedure prc2(p:pRecord2); Begin p.s:='xiaoxiao_8'; End;procedure main; var prc:procedure (p:pointer); p:pointer; d1:record1; d2:record2; Begin case x of 1: begin d1.y:=0; p:=@d1; prc:=@prc1; end; 2: begin d2.s:='I am ...'; p:=@d2; prc:=@prc2; end; ... end;repeat prc(p); until end;
可我用了 icecsdn(问到懂为止!~) 的方法! 可还是会出同样的错! 以下是我的程序: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type pRecord1=^record1; record1=record x,y:integer; end; pRecord2=^record2; record2=record s:string; end; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure prc1(p:pRecord1); procedure prc2(p:pRecord2); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1;implementation{$R *.dfm} procedure TForm1.prc1(p:pRecord1); Begin p.x:=518; end; procedure TForm1.prc2(p:pRecord2); Begin p.s:='xiaoxiao_8'; End;procedure TForm1.Button1Click(Sender: TObject); var prc:procedure (p:pointer); p:pointer; d1:record1; d2:record2; x:integer; Begin x:=strtoint(edit1.text); case x of 1: begin d1.y:=0; p:=@d1; prc:=@prc1; end; 2: begin d2.s:='I am ...'; p:=@d2; prc:=@prc2; end; end;repeat prc(p); until end; end. 这是为什么?是哪里漏写了定义吗?
type pRecord1=^record1; record1=record x,y:integer; end; pRecord2=^record2; record2=record s:string; end; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm} procedure prc1(p:pRecord1); Begin p.x:=518; end; procedure prc2(p:pRecord2); Begin p.s:='xiaoxiao_8'; End;procedure TForm1.Button1Click(Sender: TObject); var prc:procedure (p:pointer); p:pointer; d1:record1; d2:record2; x:integer; Beginx:=strtoint(edit1.text); case x of 1: begin d1.y:=0; p:=@d1; prc:=@prc1; end; 2: begin d2.s:='I am ...'; p:=@d2; prc:=@prc2; end; end;repeat prc(p); until x=1 end;end. 你在44!
procedure TReportForm.DayAVG(var Min, Max: TDate; var LabelText: string); var Year, Month, Day : Word; begin DecodeDate(Min, Year, Month, Day); Max := Min; LabelText := Format('%d年%2d月%2d日', [Year, Month,Day]); end; ....... repeat if RadioButton5.Checked then DayAVG(MinDate,MaxDate,LabelText) ....... MinDate := MaxDate + 1; until (MinDate >ReportCondForm.EndDate.Date); 就象上面一样,我定义的变量MinDate在repeat和until之间要进行操作(MinDate := MaxDate + 1),而它的值是从DayAVG过程有改变,然后传递过来的,如果用你所说的记录那我的MinDate怎么能象原来一样把值从DayAVG里操作完传回来?
指针操作本来就是会把值传回的。其实你可以这样嘛!效率更高。 procedure TReportForm.main; var Min, Max: TDate; var LabelText: string; procedure DayAVG; var Year, Month, Day : Word; begin DecodeDate(Min, Year, Month, Day); Max := Min; LabelText := Format('%d年%2d月%2d日', [Year, Month,Day]); end; ....... Begin repeat if RadioButton5.Checked then DayAVG; ....... MinDate := MaxDate + 1; until (MinDate >ReportCondForm.EndDate.Date); end;end;
var Min, Max: TDate; var LabelText: string 这内个变量的生存期是整个TReportForm.main; 你在 TReportForm.main;中定义的过程都可以用的。 编译的时候还可少好几个push
case x of
1: Prc := @tenfu1;
2: Prc := @tenfu2;
end;
为什么程序会出错呀?是:Variable reqired
Prc是过程变量,tenfu1和tenfu2是过程名!为什么会出错呀?
type
pRecord1=^record1;
record1=record
x,y:integer;
end; pRecord2=^record2;
record2=record
s:string;
end;procedure prc1(p:pRecord1);
Begin
p.x:=518;
end;
procedure prc2(p:pRecord2);
Begin
p.s:='xiaoxiao_8';
End;procedure main;
var prc:procedure (p:pointer);
p:pointer;
d1:record1;
d2:record2;
Begin
case x of
1: begin
d1.y:=0;
p:=@d1;
prc:=@prc1;
end;
2: begin
d2.s:='I am ...';
p:=@d2;
prc:=@prc2;
end;
...
end;repeat
prc(p);
until
end;
可还是会出同样的错!
以下是我的程序:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
pRecord1=^record1;
record1=record
x,y:integer;
end; pRecord2=^record2;
record2=record
s:string;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure prc1(p:pRecord1);
procedure prc2(p:pRecord2);
procedure Button1Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.prc1(p:pRecord1);
Begin
p.x:=518;
end;
procedure TForm1.prc2(p:pRecord2);
Begin
p.s:='xiaoxiao_8';
End;procedure TForm1.Button1Click(Sender: TObject);
var prc:procedure (p:pointer);
p:pointer;
d1:record1;
d2:record2;
x:integer;
Begin
x:=strtoint(edit1.text);
case x of
1: begin
d1.y:=0;
p:=@d1;
prc:=@prc1;
end;
2: begin
d2.s:='I am ...';
p:=@d2;
prc:=@prc2;
end;
end;repeat
prc(p);
until
end;
end.
这是为什么?是哪里漏写了定义吗?
pRecord1=^record1;
record1=record
x,y:integer;
end; pRecord2=^record2;
record2=record
s:string;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit; procedure Button1Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure prc1(p:pRecord1);
Begin
p.x:=518;
end;
procedure prc2(p:pRecord2);
Begin
p.s:='xiaoxiao_8';
End;procedure TForm1.Button1Click(Sender: TObject);
var prc:procedure (p:pointer);
p:pointer;
d1:record1;
d2:record2;
x:integer;
Beginx:=strtoint(edit1.text);
case x of
1: begin
d1.y:=0;
p:=@d1;
prc:=@prc1;
end;
2: begin
d2.s:='I am ...';
p:=@d2;
prc:=@prc2;
end;
end;repeat
prc(p);
until x=1
end;end.
你在44!
可程序错误在 prc:=@prc1;这一行,老说Variable reqired!(意思好像是没有必需的变量)
这是为什么呀?
在进程中对参数的操作将返回到调用程序的。补充一点:
var类型的参数在编译时传递的就是地址(与指针差不多);
如果参数的个数相同,你不用改太多。原来的程序都不用改。
你可以对参数+1不妨贴一下你的 过程定义。
var Year, Month, Day : Word;
begin
DecodeDate(Min, Year, Month, Day);
Max := Min;
LabelText := Format('%d年%2d月%2d日', [Year, Month,Day]);
end;
....... repeat
if RadioButton5.Checked then
DayAVG(MinDate,MaxDate,LabelText)
.......
MinDate := MaxDate + 1;
until (MinDate >ReportCondForm.EndDate.Date);
就象上面一样,我定义的变量MinDate在repeat和until之间要进行操作(MinDate := MaxDate + 1),而它的值是从DayAVG过程有改变,然后传递过来的,如果用你所说的记录那我的MinDate怎么能象原来一样把值从DayAVG里操作完传回来?
procedure TReportForm.main;
var Min, Max: TDate; var LabelText: string;
procedure DayAVG;
var Year, Month, Day : Word;
begin
DecodeDate(Min, Year, Month, Day);
Max := Min;
LabelText := Format('%d年%2d月%2d日', [Year, Month,Day]);
end;
.......
Begin repeat
if RadioButton5.Checked then
DayAVG;
.......
MinDate := MaxDate + 1;
until (MinDate >ReportCondForm.EndDate.Date);
end;end;
你在 TReportForm.main;中定义的过程都可以用的。
编译的时候还可少好几个push