我要做一个控件,想有如下的功能,当放置控件的窗口被CLOSE后,控件能停止特定的工作(比如关闭控件内的TTIMER),反之当窗口SHOW之后能恢复这些工作,我试了一下TWINCONTROL的showing属性发现没作用,有谁知道这控件如何做。

解决方案 »

  1.   

    在ONSHOW和ONCLOSE事件中写相应的代码
      

  2.   

    你这种想法是行不通的,当Form执行Close后,它会自动释放所有放置在上面的组件,当你重新恢复后所有的组件又会重新构建,不可能恢复原来的值。所以解决的办法是在Form释放之前把你需要的值保存下来,有很多方法可以解决。比如:记录在文本文件中、注册表中、数据库中,当窗体重新Create时,把这些记录取出来赋值。
      

  3.   

    重载TreeView的CreateParams:typeTCheckBoxTreeView = class(TTreeView)protectedprocedure CreateParams(var Params: TCreateParams); override;end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);begininherited;Params.Style:=Params.Style or TVS_CHECKBOXES;{ TVS_CHECKBOXES declared in CommCtrl }end;如果要Check这个CheckBox,可以用下面的代码:function IsNodeChecked(Node :TTreeNode) :Boolean;constTVIS_CHECKED = $2000;varTvItem :TTVItem;beginTvItem.Mask := TVIF_STATE;TvItem.hItem := Node.ItemId;TreeView_GetItem(Node.TreeView.Handle, TvItem);Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);constTVIS_CHECKED = $2000;varTvItem :TTVItem;beginFillChar(TvItem, SizeOf(TvItem), 0);with TvItem do beginhItem := Node.ItemId;Mask := TVIF_STATE;StateMask := TVIS_STATEIMAGEMASK;if Checked thenTvItem.State :=TVIS_CHECKEDelseTvItem.State :=TVIS_CHECKED shr 1;TreeView_SetItem(Node.TreeView.Handle, TvItem);end;end;可以做成事件和封装成一个类:private OldState :Boolean;procedure Change(Node: TTreeNode); override;begininherited Change(Node);OldState := IsNodeChecked(Node);end;procedure Click; override;varNewState :Boolean;begininherited Click;NewState := IsNodeChecked(Self.Selected);if NewState = OldState then Exit;if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()else if (not NewState) and Assigned(OnNodeUnChecked) thenOnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declareend;                                       -----我有源码,可以发给你。
      

  4.   

    只要被CLOSE的不是主窗口,其上的控件继续工作呀
      

  5.   

    Application.CreateForm(TForm1, Form1);
    这样也可以。
    在ONSHOW和ONCLOSE事件中写相应的代码,也可以的