unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private    { Private declarations }
  public
    { Public declarations }
  end;  TTest = class
    Button1: TButton;
  private
    fConnect:Integer;
    { Private declarations }
  public
    procedure change( aState:PInteger);
    procedure change2;
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TTest }procedure TTest.change( aState: PInteger);
begin
  fConnect := 1;
  aState := @fConnect;        //这句为什么编译器不执行(问题的关键) ???
end;procedure TTest.change2;
begin
  fConnect := 2;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  vT:TTest;
  vState:PInteger;
  i,j:Integer;
begin
  j := 0;
  i:= 10;
  vState := @i;  j := vState^ ;
  ShowMessage(InttoStr(j));      //正确的得到值 10  vT := TTest.Create;
  vT.change(vState);
                                 // 期望得到1 怎么做 ???
   j := vState^;
  ShowMessage(InttoStr(j));  vT.change2;
                               // 期望得到2 怎么做 ???
   j := vState^ ;
  ShowMessage(InttoStr(j));end;
end.

解决方案 »

  1.   

    aState没有用到,那一句自然不会执行。aState^=fConnect;
      

  2.   

    procedure TTest.change( var aState: PInteger);
      

  3.   

    procedure TTest.change( aState: PInteger);
    begin
      fConnect := 1;
      aState := @fConnect;        //这句为什么编译器不执行(问题的关键) ???///////change(var aState:Pinteger);否则编译器优化掉了这句。
    end;
      

  4.   

    错了,应该是
    aState^=:fConnect;
      

  5.   

    我不是说了吗?aState在以后的程序里没用,自然就被编辑器优化了,一般情况下Pascal参数是不会返回值的,除非是var参数。
      

  6.   

    应该把procedure change( aState:PInteger);
    改成procedure change(var aState:PInteger);吧。你试试,是不是你想要的结果
      

  7.   

    DELPHI 貌似默认的吧,没用到就优化了,加var就好了。
      

  8.   


    procedure TTest.change( aState: PInteger);
    begin
      fConnect := 1;
      aState := @fConnect;        //这句为什么编译器不执行(问题的关键) ???
    end;楼主对指针的理解有问题,你用这句话vT.change(vState)调用的时候,调用不会影响vState,可以理解为编译器在调用Change的时候,会对vState进行复制,生成另外一个vState_1然后传入Change当参数,你用aState := @fConnect; 实际是改变了vState_1,而没有改变vState的值,你改为change(var aState: PInteger)就可以了,当然aState := @fConnect这句也就被优化了。对于这种指针的指针一定要概念清楚,另外楼主的代码风格需要改进一下,格式写清楚,这样看你的代码就不会觉得别扭了。
      

  9.   

    procedure TTest.change( var aState: PInteger);
    begin
      fConnect := 1;
      aState := @fConnect;        //这句为什么编译器不执行(问题的关键) ???end; 就加個VAR 引用就行了吧
      

  10.   

    在DELPHI中使用指针要非常注意,容易混淆。