我定义了这样一个窗体(部分省略);
unit unitChannel;
interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;
type
  TAnalysis = class
  private
    FPeakData: array [0..1] of string;
  public
    procedure CalcPeak;
  end;  TFormChannel = class(TForm)
    Label15: TLabel;
  private
    
  end;var
  FormChannel: TFormChannel;implementation{$R *.DFM}我想在TAnalysis的过程CalcPeak中访问FormChannel的Label15.caption,
但总是报错,为什么?
如下:
procedure TAnalysis.CalcPeak;
begin
   FPeakData[1]:=FormChannel.Label15.caption;
end;不同的类之间要怎样才能访问呢?先谢谢了

解决方案 »

  1.   

    首先你要保证这个窗体没有释放掉的
    然后在另外的一个窗体上引用这个窗体alt+f11就可以了
    但是推荐你把FormChannel.Label15.caption保存到这个窗体的一个变量上 然后引用变量可能
    更好一些
      

  2.   

    不同类之间访问,就是在一个类中应用另一个类的实例。这里FormChannel就是TFormChannel类的一个实例,FormChannel是一个全局变量,而且已经初始化了。从现在看的话,我觉得一点问题都没有。不知道你的出错信息是什么。因为现在只是定义了TAnalysis类,还没有用TAnalysis的实例。保证用TAnalysis的实例的时候,能够访问到FormChannel全局变量就行了。
      

  3.   

    你这样定义类不严格,应这样改一下:
    unit unitChannel;
    interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;
    type
      TFormChannel = class;//////////////ADD
      TAnalysis = class
      private
        FPeakData: array [0..1] of string;
      public
        procedure CalcPeak(FChannel: TFormChannel);// ADD Param
      end;  TFormChannel = class(TForm)
        Label15: TLabel;
      private
        
      end;var
      FormChannel: TFormChannel;implementation{$R *.DFM}
    procedure TAnalysis.CalcPeak(FChannel: TFormChannel);
    begin
       FPeakData[1]:=FChannel.Label15.caption;/// Modify
    end;
      

  4.   

    还是不行,麻烦大家试着运行一下如下代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TFormChannel = class;
      TAnalysis = class
      private
        FPeakData: array [0..1] of string;
      public
        procedure CalcPeak(FChannel: TFormChannel);
      end;  TFormChannel = class(TForm)
        Label1: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
          FAnalysis: TAnalysis;
      end;var
      FormChannel: TFormChannel;implementation{$R *.DFM}procedure TAnalysis.CalcPeak(FChannel: TFormChannel);
    begin
       FPeakData[1]:=FChannel.Label1.caption; ///这句报错
    end;procedure TFormChannel.Button1Click(Sender: TObject);
    begin
      FAnalysis.CalcPeak(FormChannel);//新增加的
    end;end.
      

  5.   

    删除:  TFormChannel = class;下面几行:
      TAnalysis = class
      private
        FPeakData: array [0..1] of string;
      public
        procedure CalcPeak(FChannel: TFormChannel);
      end;
    放后到TFormChannel...  end;后面,var的前面。原因:按你的定义,TFormChannel是个没有任何功能的、从基类class集成过来的类,哪里能用什么label1啊!
      

  6.   

    从你的代码中可以看出,FAnalysis 没有 Create
    另外,如果 FormChannel 不是自动创建的,也不是主窗体,则也要 Create
    在 FormChannel 的OnCreate 事件中,FAnalysis:=TAnalysis.Create;
      

  7.   

    我说明一下:
    FAnalysis和FormChannel都已经Create了,
    我在这里省略而已。按照dowsun()的做法:把TAnalysis类的定义放到
    TFormChannel的后面。
    但是,这样做的话,如果在TFormChannel类中引用
    TAnalysis,又无法找到,例如:
    type
      TFormChannel = class(TForm)
        Label1: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        FAnalysis: TAnalysis;////这里找不到TAnalysis类
      end;  TAnalysis = class
      private
        FPeakData: array [0..1] of string;
      public
        procedure CalcPeak(FChannel: TFormChannel);
      end;var
      FormChannel: TFormChannel;
      

  8.   

    楼主看看这个代码,也许有用,你必须注意的事,类必须都创建(create),
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    type
      MyClass = class
      private
        FString:string;
      public
        procedure GetCatpion();
    end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      MyClass1:MyClass;
    begin
      Form1:=TForm1.Create(Application);
      MyClass1:=Myclass.Create;
      MyClass1.GetCatpion;
      showmessage(Myclass1.FString);
    end;{ MyClass }procedure MyClass.GetCatpion;
    begin
      FString:=Form1.Label1.Caption;
    end;end.
      

  9.   

    这样,可以通过MyClass类的getcaption方法访问到form1上label1的东西了,