我的MDI的主窗体的左边有一个Treeview,通过点击它的节点来调用三个子窗体。现在的问题是:
1、连续点击某个节点几次,对应的窗体就会重复出现几次。而我要实现的效果是:当连续点击某个节点时,对应的窗体只出现一次。(下面是我的代码)主窗体中:
procedure TMainForm.TreeView1Change(Sender: TObject; Node: TTreeNode);begin
if treeview1.Selected=nil then exit;
if treeview1.Selected.Text='工程概况' then
 TgcgkForm.create(self);
if treeview1.Selected.Text='招标工程登记表' then
  TZbdjForm.create(self);
if treeview1.Selected.Text='投标邀请书' then
TTbyqsForm.create(self);
end;
 而工程概况窗体:
procedure TGcgkForm.FormCreate(Sender: TObject);
begin
  Table1.Open;
  if Table1.IsEmpty then
  begin
    Table1.Append;
    Table1.Post;
  end;
end;
其中表Table已连接好数据库了。别的窗体的OnCreate事件大同小异,这里就不多说了。
2、怎样解决子窗体出现时的闪烁问题?即:子窗体出现时不是立即出现,而是运行、闪烁几秒钟,再最大化成理想状态。
3、当通过点击子窗体主菜单的“文件”→“退出”项喜欢关闭子窗体时,子窗体不是被关闭,而是变成设计时默认的大小了。这个怎样解决?
我在每个子窗体主菜单的“文件”→“退出”项的单击事件中写入:
procedure TGcgkForm.N10Click(Sender: TObject);
begin
 close;
end;

解决方案 »

  1.   

    To miky(miky):您好!如果您能解决此问题,只要我有的分,您要多少我都给您算啦!!!
      

  2.   

    if treeview1.Selected.Text='工程概况' then
     TgcgkForm.create(self);
    改成:
    var
      I: Integer;
    if treeview1.Selected.Text='工程概况' then begin
      for I := 0 to Screen.FormCount - 1 do begin
        if Screen.Forms[I] is TgcgkForm then
           Exit;
      end;
      TgcgkForm.create(self);
    end;我建议,先写一个过程
    function Tfrm_baseform.FindShowForm(FormClass: TFormClass; const Caption: string): TForm;
    var
      I: Integer;
    begin
      Result := nil;
      for I := 0 to Screen.FormCount - 1 do begin
        if Screen.Forms[I] is FormClass then
          if (Caption = '') or (Caption = Screen.Forms[I].Caption) then begin
            Result := Screen.Forms[I];
            if (Result.WindowState = wsMinimized) then Result.WindowState := wsNormal;
            Break;
          end;
      end;
      if Result = nil then begin
        Application.CreateForm(FormClass, Result);
      end;
      Result.Show;
    end;
    调用的时候:
    procedure TMainForm.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
    if treeview1.Selected=nil then exit;
    if treeview1.Selected.Text='工程概况' then
      FindShowForm(TgcgkForm,'');
    if treeview1.Selected.Text='招标工程登记表' then
      FindShowForm(TZbdjForm,'');
    if treeview1.Selected.Text='投标邀请书' then
      FindShowForm(TTbyqsForm,'');
    end;
      

  3.   

    不用那么麻烦吧
    Create前判断下就是了
      

  4.   

    TMainForm也是继承Tfrm_baseform的,如果不是,请写在TMainForm里就可以
    function Tfrm_baseform.FindShowForm(FormClass: TFormClass; const Caption: string): TForm;
    写成
    function TMainForm.FindShowForm(FormClass: TFormClass; const Caption: string): TForm;
      

  5.   

    与Tree无关,只能说你的调用代码有问题(创建前先判断之前有没有创,如有则Show否则Create后再Show)。找本书,即使最烂的书上也会说这个问题的
      

  6.   

    TO  windlin623(黄生):真是非常非常的感谢您!!!用您的方法我解决了“1、连续点击某个节点几次,对应的窗体就会重复出现几次。而我要实现的效果是:当连续点击某个节点时,对应的窗体只出现一次。”的问题!
        但您又说:“TMainForm也是继承Tfrm_baseform的”,我不太理解这句话的含义。我带上主窗体一共是四个窗体呀:MainForm 、GcgkForm、 ZbdjForm 、TbyqsForm。是不是还得要再添加一个窗体frm_baseform呀?到底是该怎样的呀?
      

  7.   

    第三个问题:
    procedure TGcgkForm.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      Action:=caFree;end;
      

  8.   

    总:为什么总是问这些简单的问题,多学习吧,问别人的不如自己学来的好
    1.在节点操作的时候,判断一下, 如 
    if gcgkForm = nil then 
      gcgkForm := TgcgkForm.Create(application);  
    gcgkForm.Show;这样就不会出现重复的问题
    2.在Form的子窗体OnClose事件写
      Action := Cafree; 
      gcgkForm := nil;
      

  9.   

    T0  quicksand201(流沙) and czx0514(czx0514):
       两位对第三个问题理解错了。我是要在每个子窗体中主菜单的“文件”→“退出”项的单击事件中写代码的,不是要在子窗体OnClose事件中写的。 我也知道在MDI结构中,关闭一个窗体只是把它最小化了。要让一个窗体消失,只有在子窗体的OnClose事件中设置:Action := Cafree; 但在菜单的单击事件中怎样写呢?
      

  10.   

    说你笨还真笨得可以,事实上Close就会调用OnClose事件,调试一下就知道了,做人还是不要浮躁的好
      

  11.   

    To dragmanII() :“说你笨还真笨得可以,事实上Close就会调用OnClose事件,调试一下就知道了,做人还是不要浮躁的好” 
          哥(姐),你误会我了,我是怕没人回复我的帖子,才在题目的后面加上“(别认为很简单,能做出效果才是高手!)”的! 我认为搞计算机的没有笨与不笨之说,只有先知道和后知道之谈。 小弟是今年刚毕业的学生,工作经验是欠缺些,但我认为时间会证明一切的。如果基础或起步一样,经过相同的一段时间后,别人都做出来了,您没做出来,那才叫笨!
         好了,不计较你说我笨了。这是技术论坛,不是人身攻击的地方!
         不过我还得感谢您,您让我认识到:我今后发帖子的时候应该谦虚一些!言归正传,第一个问题我已经解决了。第二个问题——2、怎样解决子窗体出现时的闪烁问题?即:子窗体出现时不是立即出现,而是运行、闪烁几秒钟,再最大化成理想状态。
    还没有解决,不知道哪位老师或师傅还能对无知的小弟指点一二?!当然,想要分的话,只管说!
      

  12.   

    To lzyzuixin(醉心) : 你恶心什么呢?说不定你刚毕业时,还不如我呢!
      

  13.   

    好啦!到此为止,不再说了!
    TO  czx0514(czx0514) :“下三烂”,彼此彼此,是在说自己吧!
    TO   wnnnnnn6(谁说女子不能搞软件?!) :你主持公道,15分全给你!
      

  14.   

    dragmanII() 兄:
         好人啊!谢谢!!! 误会您了,小弟不会说话,请别介意!第三个问题我当然想解决,而且很想解决。
        上面我的表述不太准确,第三个问题应为:“当通过点击子窗体主菜单的“文件”→“退出”菜单项来关闭该菜单项所在的子窗体时,该子窗体可以被关闭,但其他两个子窗体却变成设计时默认的大小了,不是最大化显示了。而我想要的结果是关闭一个子窗体,其他两个子窗体呈最大化显示。这个怎样解决?”