mainmenu在父窗口,如何实现点击菜单选择子窗口里各PageControl页.

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        File1: TMenuItem;
        Select1: TMenuItem;
        procedure Select1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Select1Click(Sender: TObject);
    begin
      Form2.PageControl1.ActivePageIndex := 1;
      Form2.ShowModal;
    end;end.
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;type
      TForm2 = class(TForm)
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet3: TTabSheet;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
      Close;
    end;end.
      

  2.   

    例子中,共设计了3个页,分别为   
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet3: TTabSheet;Form2.PageControl1.ActivePageIndex := 页的索引(0,1,2);对应各页
      

  3.   

    不行,运行出错,‘Access violation at address XXXX’
      

  4.   

    我试过在unit2 写这段代码就没问题,不知问题出在哪里,郁闷!!
      

  5.   

    我试过在unit2 写这段代码就没问题,不知问题出在哪里,郁闷!!
    =================================================================
    这是在我的计算机上试好了的代码,绝对没有错误
      

  6.   

    不行,运行出错,‘Access violation at address XXXX’
    ============================================================================
    我的代码完全没问题!可能你的编译器有毛病了,不信,要楼下哪位把我上面代码贴着试一试
      

  7.   

    我试了,阿发伯的代码(据说楼主也是这样写的)没问题的。楼主退出Delphi,重新建一个工程试一下(这么少的代码,应该不费力)
      

  8.   

    如果楼主不愿用模式窗口form2.ShowModal;,可以简单地用form2.show;也行。
      

  9.   

    maozefa(阿发伯)是个热心肠、直脾气的人。一个“老”Coder
      

  10.   

    先谢过各位!有个地方忘记说了,form1为父窗口,form2为子窗口而且没有激活。会不会是这里的问题。我是Delphi2006的环境。试了一整天了…………
      

  11.   

    哦,那倒是。如果 Form2 对象根本就没有创建,对它的操纵将引发内存泄露。 form2 := TForm2.Create(nil);
     form2.PageControl1.ActivePageIndex :=1;
     form2.ShowModal;
     form2.Free;
      

  12.   

    对,就是这个问题,但为什么之前我已运行Create(application)还不行,它和Create(nil)有什么区别,请高手指点。
      

  13.   

    Form2 := TForm2.Create(Application);也行的。
      

  14.   

    这样写就是有问题:procedure Tf_kfmain.S0Click(Sender: TObject);
    var newform:Tf_shgl;
    begin
    if findForm('管理')=False then
      begin
       //若窗体不存在,则创建窗体
       newform:= Tf_shgl.Create(application);
       newform.Caption:='管理';
       f_shgl.RzPageControl1.ActivePageIndex:= 0;
      end;
    end;
      

  15.   

    谢谢maozefa(阿发伯)和lihuasoft(学习低调做人),最后我这样处理解决了问题:procedure Tf_kfmain.S0Click(Sender: TObject);
    //var newform: Tf_shgl;
    begin
    if findForm('管理')=False then
      begin
       //若窗体不存在,则创建窗体
       f_shgl:= Tf_shgl.Create(application);
       f_shgl.Caption:='管理';
       //f_shgl.RzPageControl1.ActivePageIndex:= 0;
      end;
    f_shgl.RzPageControl1.ActivePageIndex:= 0;
    end;那之前的问题是不是newform变量不能传递到子窗体的原因导致出错?
      

  16.   

    最好这样:begin
      if not Assigned(Form2) then
         begin
         Form2 := TForm2.Create(application);
         try
           Form2.PageControl1.ActivePageIndex := 1;
           Form2.ShowModal;
         finally
           Form2.Free;
           Form2 := nil;
         end;
         end;
    end;
      

  17.   

    不明白楼主说的“newform变量不能传递到子窗体”是什么意思。总结一下:1、最初的问题(窗体Form1操纵窗体Form2的PageCtrl):单元Unit1需引用单元Unit2。2、意外出错的问题(内存泄露):窗体Form2未创建。解决办法:或在工程里用CreateForm创建,或动态创建。方法上面已经说了。
      

  18.   

    那之前的问题是不是newform变量不能传递到子窗体的原因导致出错?
    =============================================================================
    不是这个原因,而是当Caption='窗体'的窗口不存在时,代码是正确的,而已经存在后,f_shgl.RzPageControl1.ActivePageIndex:= 0;不能执行导致的,你后来把这句提到if语句外面,就正确了。
      

  19.   

    嗯。楼主可以考虑结贴了。mazefa(阿发伯)乐于助人,发信息让我来一起给你解决问题,并且他的代码没有错误。似这样的好心人,该及时结贴大加奖励才是。许多小难题,往往是不细心所致。
      

  20.   

    呵呵,看了,估计重新买台电脑(一定要是品牌的),重新安装个系统(一定要是正版的WINDOWS),在去正版店买个DELPHI,然后...............
    呵呵.........