http://expert.csdn.net/Expert/topic/2256/2256157.xml?temp=.9217646

解决方案 »

  1.   

    我是着这样写的:
    case x of
        1: Prc := @tenfu1;
        2: Prc := @tenfu2;
     end;
    为什么程序会出错呀?是:Variable reqired
    Prc是过程变量,tenfu1和tenfu2是过程名!为什么会出错呀?
      

  2.   

    参照这个吧,很好的
    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;
      

  3.   

    可我用了 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.
    这是为什么?是哪里漏写了定义吗?
      

  4.   

    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!
      

  5.   

    我也看出了在repeat循环里的错误!我也加了!
    可程序错误在 prc:=@prc1;这一行,老说Variable reqired!(意思好像是没有必需的变量)
    这是为什么呀?
      

  6.   

    xiaoxiao_8(小小_8)和我说,让我替他领分:)
      

  7.   

    xiaoxiao_8(小小_8)在不来我就把分散啦~:)
      

  8.   

    "   我原来写过程的时候里面的参数是var类型的,因为我在repeat和until里该过程的后面要对这个参数+1,如果把参数写成记录的话,那我的要求不知道怎么实现?"不太懂你的意思?你照我那样做了的话,传递的是指针(我以前是学C的),
    在进程中对参数的操作将返回到调用程序的。补充一点:
       var类型的参数在编译时传递的就是地址(与指针差不多);
    如果参数的个数相同,你不用改太多。原来的程序都不用改。
      

  9.   

    指针类型的参数与var类型的差不多(几乎一样)
    你可以对参数+1不妨贴一下你的 过程定义。
      

  10.   

    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里操作完传回来?
      

  11.   

    指针操作本来就是会把值传回的。其实你可以这样嘛!效率更高。
    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;
      

  12.   

    var Min, Max: TDate; var LabelText: string 这内个变量的生存期是整个TReportForm.main;
    你在 TReportForm.main;中定义的过程都可以用的。
    编译的时候还可少好几个push