声明一个指向panel的指针,用来存储当前的panel对象,然后实现panel间的切换(通过panel.visble) 
建一个全局变量 
curpanel:^TPanel; 主要程序如下procedure TActiveFormX.ActiveFormCreate(Sender: TObject);
begin
  new(curpanel);
end;procedure TActiveFormX.ActiveFormDestroy(Sender: TObject);
begin
  dispose(curpanel);
end;procedure TActiveFormX.showpanel(var panelx:TPanel);
var TempPanel:^TPanel;
begin
  try
  if CurPanel=nil then
   begin
   TempPanel:=@panelx;
   CurPanel^ := TempPanel^;
   curpanel^.Visible:=true;
   end
   else
    begin
    curpanel^.Visible:=false;
    TempPanel:=@panelx;
    CurPanel^:= TempPanel^;
    curpanel^.Visible:=true;
    end;
   except
     exit;
  end;end;
问题:在ocx使用时经常会出现panel无法正常切换的问题,不知道是什么问题,大家帮我看看程序是不是有bug,或着说在ocx下面这样做是不是有什么局限性?

解决方案 »

  1.   


    var
      curpanel:TPanel; //这样定义,curpanel已经相当于指针了。。  curpanel:^TPanel;//你这样定义是把curpanel定义成指针的指针....干嘛不好好学学PASCAL语法?
      

  2.   

    我是从java刚转到delphi这边来的
    刚接触到指针,确实有点头痛,
    上面这个程序是我先学现写的,
    在普通的app下没有问题,
    可是在ocx下,偶尔会出现无法实现效果的情况,
    想知道这是不是ocx中的问题,
    望能指点一二
    谢谢
      

  3.   

    应该是代码问题,
    OCX同普通EXE是有些不同,但不会直接造成你那现象.
      

  4.   

    >>var
    >>  curpanel:TPanel; //这样定义,curpanel已经相当于指针了。。是啊,你在这里声明指针就在给自己找麻烦。不用指针,直接curpanel:TPanel;就可以了
    >>声明一个指向panel的指针,用来存储当前的panel对象,然后实现panel间的切换(通过panel.visble)实现panel的切换不是判断指针是不是nil 而是判断panel的visible.
    还有curpanel:TPanel;这个声明的curpanel就已经指向了堆上了内存.而你再生命指针等于栈上的元素指栈上的元素,呵呵,自己找麻烦.
      

  5.   

    明白了,delphi中的声明也相当于一个隐性的指针,
    那各位大大能不能说说delphi中什么时候需要用到真正的指针,因为有了隐性的指针了呀