请帮我看看到底该怎么写那一句,
unit TestPorcMP;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,TypInfo;type
  TSetValue = Procedure (Value :String) of object;  //@@@
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FCP : String;       //@@@
    Procedure SetCP(Value:String); //@@@@
    { Private declarations }
  Published
    Property CP : String Read fCP write SetCP;  //@@@
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}Procedure TForm1.SetCP(Value:String);
begin
  Form1.FCP := Value;  //@@@如果不这样写就会出错
  //FCP := value;      //出错    ·1
  //self.FCP := Value; //一样出错·2
end;procedure TForm1.Button1Click(Sender: TObject);
var
  vProp: PPropInfo;
  SetValue : TSetValue;
begin
  vProp := GetPropInfo(Self, 'CP');
  @SetValue := vProp.SetProc;
  Self.fCP := '';
  SetValue('asd');  //如果是这样调用 , 前面的·1或者·2都会出错。
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  CP := 'asd';  //如果是这样调用, 前面的三种写法都不会出错,
end;end.请教高手,我该怎么写Button1的过程,才能使·1(FCP := Value/Self.FCP:=value)不出错?这里我只希望改Button1里的东西(或者SetValue : TSetValue;什么的),而这个就用:
Procedure TForm1.SetCP(Value:String);
begin
  FCP := value;end;
end;
也就是改Button1的过程,使起能正常使用 这个。

解决方案 »

  1.   

    你的 Property  和 Procedure SetCP(Value:String); 没有联系呀,那个property还是直接读写私有变量的。
    可以这样写
     private
        { Private declarations }
        FCP : String;
        Function ReadCP: string; //读出fcp
        Procedure WriteCP(aCp : String);//写入fcp
      public
        { Public declarations }
        property CP : string read ReadCp write WriteCp; 
      end;
    ................
    function TForm1.ReadCP: string;
    begin
        Result := FCP;
    end;procedure TForm1.WriteCP(aCp: String);
    begin
        FCP := acp;
    end;
      

  2.   

    多谢yansea(思宏) ,
    这个错误和读过程没有关系,
    并且 Property CP 怎么会和 Procedure SetCP(Value:String); 没有关系啦,你仔细看看。
      

  3.   

    UP!!!!!!!!!!!!!!!!!!!!!UP!!!!!!!!!!!!!!!!!!!!!UP!!!!!!!!!!!!!!!!!!!!!UP!!!!!!!!!!!!!!!!!!!!!
      

  4.   

    把这段代码写成一个单独的过程
    如:
    Procedure SetOBJValue;
    var
      vProp: PPropInfo;
      SetValue : TSetValue;
    begin
      vProp := GetPropInfo(Self, 'CP');
      @SetValue := vProp.SetProc;
      SetValue('asd');  //如果是这样调用 , 前面的·1或者·2都会出错。
    end;
    然后在Button1中调用,就OK了。