CnPack Forum


 
Subject: 我想写个东西发给cnpack,但是有个问题,进来看吧
SuperYoyoNC
新警察
Rank: 1



UID 310
Digest Posts 0
Credits 9
Posts 8
点点分 9
Reading Access 10
Registered 2004-2-2
Location 中国上海
Status Offline
Post at 2006-2-10 17:11  Profile | Site | Blog | P.M.  | QQ
我想写个东西发给cnpack,但是有个问题,进来看吧

在做一种类似一些软件的“选项”对话框所采用的形式,目的是不管是用TreeView,还是用Tab,都可作出软件的“选项”对话框,现在正在实现一个TreeNodes和Frame结合的形式。

可能说不清楚。可以看一个图:



具体的问题,请先把这些声明看下去,自然就知道问题是什么了

Type
  TBaseFrameClass = Class Of TBaseFrame; //对TBaseFrame的类引用
  {* 关于TBaseFrame,在这里可以就当它是一个TFrame。}
  TBaseFrameEvent = Procedure(Sender: TObject; Frame: TBaseFrame) Of Object;

  TBasePreference = Class(TObject) //抽象基类
  Protected
    Procedure DoApply; Virtual; Abstract; //具体“应用”或者“确定”交给子类
    Procedure DoReset; Virtual; Abstract; //具体“恢复默认值”交给子类
    Procedure DoResetAll; Virtual; Abstract; //具体“全部恢复默认值”交给子类
  Public
    Procedure Apply; //响应“应用”或者“确定”命令
    Procedure Reset; //响应“恢复默认值”命令
    Procedure ResetAll; //响应“全部恢复默认值”命令
  End;

  TTreePreference = Class(TBasePreference) //使用TreeNodes来管理的子类
  Protected
    FItems: TTreeNodes;
    FCurrItem: TTreeNode;
    FRelatedTreeView: TCustomTreeView;
    Procedure SetRelatedTreeView(TreeView: TCustomTreeView); Virtual; Abstract;
  Public
    Property RelatedTreeView: TCustomTreeView Read FRelatedTreeView Write
      SetRelatedTreeView;
  End;

  TFrameTreePreference = Class(TTreePreference) //Frame和TreeNodes的结合
  Private
    FFrameOwner: Boolean;
    FCurrFrame: TBaseFrame;
    FNullFrame: TBaseFrame;
    FOnApply: TBaseFrameEvent;
    FOnReset: TBaseFrameEvent;
    Procedure SetRelatedTreeView(TreeView: TCustomTreeView); Override;
    Procedure DoApply; Override;
    Procedure DoReset; Override;
    Procedure DoResetAll; Override;
    // 实际上,有点像在包装TTreeNodes
    Procedure GetNodeFromIndex(Index: Integer);
  Public
    Constructor Create(NullFrame: TBaseFrame; FrameOwner: Boolean;
      TreeNodesOwner: TCustomTreeView);
    Destructor Destroy; Override;
    // 实际上,有点像在包装TTreeNodes
    Function AddChildObjectFirst(Parent: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Function AddChildObject(Parent: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Function AddObjectFirst(Sibling: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Function AddObject(Sibling: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Function AddNode(Node, Relative: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass; Method: TNodeAttachMode): TTreeNode;
    Function AlphaSort(ARecurse: Boolean = False): Boolean;
    Procedure Assign(Source: TPersistent); Override;
    Procedure BeginUpdate;
    Procedure Clear;
    Function CustomSort(SortProc: TTVCompare; Data: Longint; ARecurse: Boolean =
      False): Boolean;
    Procedure Delete(Node: TTreeNode);
    Procedure EndUpdate;
    Function GetFirstNode: TTreeNode;
    Function GetNode(ItemId: HTreeItem): TTreeNode;
    Function InsertObject(Sibling: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Function InsertNode(Node, Sibling: TTreeNode; Const S: String; FrameType:
      TBaseFrameClass): TTreeNode;
    Property Count: Integer Read GetCount;
    Property Item[Index: Integer]: TTreeNode Read GetNodeFromIndex;
    {* 我的困惑就在Item属性的类型:TTreeNode上}
    {因为现在这样注定是可以通过Item来随便篡改Data的指向的指针,就
     是说,BaseFrame和TreeNode的关系就会乱掉!
     现在我的解决办法是把这个属性定义修改成:
     Property Item[Index: Integer]: TPreferenceNode,
     当然,上面很多的TTreeNode都要改为TPreferenceNode,然后再定义
     一个TPreferenceNode,也是在包装TTreeNode,只不过把Data属性给
     修改了,变成Data是TBaseFrame类型的对象。这样就不会乱。

     不过这样又要借助一个TObjectList,主要是用它的FindInstanceOf,
     来查找TBaseFrame。这样会很复杂。有什么比这个更好的方法呢?
    }
  End;

[ Last edited by SuperYoyoNC on 2006-2-10 at 17:18 ]




中考没考好,惨死我了! 2004年09月01日开始努力
Top
flamingo
新警察
Rank: 1



UID 179
Digest Posts 0
Credits 39
Posts 39
点点分 39
Reading Access 10
Registered 2003-10-12
Status Offline
Post at 2006-2-16 02:08  Profile | Blog | P.M. 
WinMAP 没有使用新型的控件,他用的直接就是 Treeview ,Delphi 开源界中有个著名的
virtual Tree 可以看看。它几乎可以做到任何形式的效果。


Image Attachment: wamp.gif (2006-2-16 02:08, 18.33 K)

Top
SuperYoyoNC
新警察
Rank: 1



UID 310
Digest Posts 0
Credits 9
Posts 8
点点分 9
Reading Access 10
Registered 2004-2-2
Location 中国上海
Status Offline
Post at 2006-2-18 15:15  Profile | Site | Blog | P.M.  | QQ
不是啊

我没有说要做什么效果的TreeView,
我只是要做一个软件里通用的“选项设置”的系统,做到无论是TreeView+Frame,还是Tab+Pannel,还是其他什么形式的,都可以通用!!




中考没考好,惨死我了! 2004年09月01日开始努力
Top
VictorWoo
灌水科科长
Rank: 3Rank: 3



Medal No.1  
UID 1975
Digest Posts 1
Credits 114
Posts 98
点点分 114
Reading Access 10
Registered 2006-3-11
Location 福建
Status Offline
Post at 2006-7-25 10:32  Profile | Site | Blog | P.M.  | QQ | ICQ Status
要是PageControl能够隐藏标题就好了
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6762
Posts 3557
点点分 6762
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2006-7-31 10:09  Profile | Blog | P.M. 
要隐藏标题的PageControl,不如用TNoteBook
Top
VictorWoo
灌水科科长
Rank: 3Rank: 3



Medal No.1  
UID 1975
Digest Posts 1
Credits 114
Posts 98
点点分 114
Reading Access 10
Registered 2006-3-11
Location 福建
Status Offline
Post at 2006-7-31 10:22  Profile | Site | Blog | P.M.  | QQ | ICQ Status
啊,win3.1面板里的控件都是古董级的了,还能焕发第二春?
研究看看呵呵
Top
csofter
新警察
Rank: 1



UID 2218
Digest Posts 0
Credits 5
Posts 5
点点分 5
Reading Access 10
Registered 2006-5-26
Status Offline
Post at 2006-8-6 17:01  Profile | Blog | P.M. 
PageControl可以隐藏标题呀,把各个tab的tabvisible设成false就可以了
Top
小雨哥
新警察
Rank: 1



UID 14540
Digest Posts 0
Credits 14
Posts 7
点点分 14
Reading Access 10
Registered 2007-5-19
Location 浙江杭州
Status Offline
Post at 2007-5-22 01:09  Profile | Blog | P.M.  | QQ
一个思维

我赞同这样的研究,但我要说的是不用这样去研究。

Delphi 确实存在组件、类库,那是比较底层的架构,而使用这些东西的时候,通常进入一种叫功能性框架的领域。这时候
注重的是如何实现功能。至于是使用Tree还是Tab,只要不影响功能实现,通常会根据界面要求取其一。二种在界面效果
上都有自身的优势,做成通用架构不需要定位在这二个东西上,更好的是定义一组访问接口,如此,即便是 Listbox 也一
样可以融合到这个通用架构来。这时,这个通用接口好比就是一个抽象层。

PageControl 是 Windows 基础类库里带的东西,NoteBook 却是原生的 Delphi 实现,与 Win3.1 本身没有关系。只是表
示这个东西历史悠久,但并不表示这东西是落伍的。

一点愚见,谨奉大鉴。
Top
小笨象
新警察
Rank: 1



UID 18344
Digest Posts 0
Credits 8
Posts 3
点点分 8
Reading Access 10
Registered 2007-6-22
Status Offline
Post at 2007-6-22 11:51  Profile | Blog | P.M. 
NoteBook 是我用得最多的控件之一。
原因之一就是能不显示标题。
说真的,我还真不知道csofter 说的方法。刚才一试, 白写这么多年程序了。
以后全部转用PageControl ,因为NoteBook里有些地方实在是很让人头痛。
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-6-25 10:23  Profile | Site | Blog | P.M.  | QQ | Yahoo!
使用TPageControl时要小心自带的热键:Ctrl+Tab和Ctrl+Shift+Tab




小冬
http://MyvNet.com
Top
jAmEs_
灌水部部长
Rank: 8Rank: 8



Medal No.1  
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
Post at 2007-7-20 09:48  Profile | Blog | P.M. 


QUOTE:
原帖由 小笨象 于 2007-6-22 11:51 发表
NoteBook 是我用得最多的控件之一。
原因之一就是能不显示标题。
说真的,我还真不知道csofter 说的方法。刚才一试, 白写这么多年程序了。
以后全部转用PageControl ,因为NoteBook里有些地方实在是很让人头痛 ...

我也不知道,但是其實這個不是我們的錯,因為TabVisible := false后,它的Visible也=False了。所以一直以來,我都以為這個只是隱藏整個頁面的。
事實上,這個屬性本來的意義也在于這樣,只是Visible := false后也可以顯示頁面罷了
Top
ExSystem
新警察
Rank: 1



UID 1780
Digest Posts 0
Credits 2
Posts 1
点点分 2
Reading Access 10
Registered 2006-2-8
Location 中国·上海市
Status Offline
Post at 2007-7-21 19:47  Profile | Site | Blog | P.M. 
混,都有那么长时间了……还处于置顶

直接进CnPackI的群共享进行测试第一版的成品……
Top
 




All times are GMT++8, the time now is 2024-5-7 23:10

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009274 second(s), 8 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP