我用框架TFrame组合一个TPanel,一个TCheckBox,一个TImage
代表一个图层程序中根据层数动态创建这个框架移动TFrame表示图层的上下移动 怎么写?还有怎么得到Tframe所在的TForm?谢谢ps:相关内容还请参看我的另一贴:
http://expert.csdn.net/Expert/TopicView1.asp?id=1758115

解决方案 »

  1.   

    不明白移动是什么意思。
    得到Tframe所在的TForm:
    var ob:twincontrol;
    begin
        ob:=Frame31.Parent;
        while not (ob is Tform) do
        begin
            ob:=ob.Parent;
        end;
        showmessage(tform(ob).Caption);
    end;
      

  2.   

    "还有怎么得到Tframe所在的TForm?"直接说: 我想在Frame单元里操作另一个组件,这个组件和TFrame唯一的关系也就是 会在同一TForm上,有什么办法吗?
      

  3.   

    To lincanwen(密码错误)
    谢谢关于我的说要的移动,就是如果创建了7个TFrame(Frame2.align:=alTop,上下),拖动其中任一个,eg,把第3个拖到第5个下面. 怎么弄啊?
      

  4.   

    "还有怎么得到Tframe所在的TForm?"直接说: 我想在Frame单元里操作另一个组件,这个组件和TFrame唯一的关系也就是 会在同一TForm上,有什么办法吗?>>这种操作有违OOP的思想,你可以通过TForm1(TheFrame.Parent).Button1这种形式来做>>但是实际上,这种情况应该是通过给TheFrame添加一个事件来处理。关于我的说要的移动,就是如果创建了7个TFrame(Frame2.align:=alTop,上下),拖动其中任一个,eg,把第3个拖到第5个下面. 怎么弄啊?>>你要的是不是SendToBack和BringToFront?
      

  5.   

    To rustle() 先说移动. 你理解错了."一个框架代表一个图层",我是要移动图层间的上下顺序. 大概是在OnDragDrop里写,但是我不确定. 因为框架是一个独立单元,在程序中动态创建,移动的时候怎么判断和其它动态创建的TFrame的关系等等.--问题本身可能很简单,而我可能钻了牛角了,所以来求助.至于Frame单元里操作另一个组件的问题,倒并不是我违背OOP的思想,操作是在Tframe.panel1.OnClick上执行,并且我把这部分写在一个Dll里.
      

  6.   

    >>至于Frame单元里操作另一个组件的问题,倒并不是我违背OOP的思想,操作是在
    >>Tframe.panel1.OnClick上执行,并且我把这部分写在一个Dll里.   要不你需要的是一个TFrame的一个OnFramePanelClick事件,要不你就要给你的Frame添加一个RelateComponent属性,要不你就需要把你要操作的那另一个组件和你的Frame封装在一起,如果你试图把外面的这个控件实例和你的Frame建立一个硬性的联系,那么你就错了,如果这一切只是因为你想写这样一个DLL,那么你写这个DLL的初衷就错了,至少也是不合理。>>先说移动. 你理解错了."一个框架代表一个图层",我是要移动图层间的上下顺序. 大概是在
    >>OnDragDrop里写,但是我不确定. 因为框架是一个独立单元,在程序中动态创建,移动的时候
    >>怎么判断和其它动态创建的TFrame的关系等等.--问题本身可能很简单,而我可能钻了牛角
    >>了,所以来求助.
      我觉得你起码需要借助于一个TFrameList类,所有的这些Frame应该是属于一个整体的你应该多花点时间在程序的逻辑结构上,现在你的技术问题其实很简单,移动Frame没什么问题,你自己的程序逻辑阻碍了你。可以看看设计模式
      

  7.   

    To rustle() 
    谢谢你的解析你可以就 "在若干个动态创建的TFrame中移动某一个的相对位置" 的写法 写个实例吗?谢谢
      

  8.   

    把所有的Frame通过构造一个TFrameList来集中管理吧我觉得应该没有什么问题
      

  9.   

    只是每个Tframe 可以获得一个ItemIndex
    似乎还是没法回避 这个问题的具体写法哪位大侠能 就“在若干个动态创建的TFrame中移动某一个的相对位置” 写个实例 谢谢
      

  10.   

    问题:
      “至于Frame单元里操作另一个组件的问题,倒并不是我违背OOP的思想,操作是在Tframe.panel1.OnClick上执行,并且我把这部分写在一个Dll里.”
      
      即使是写在DLL中,也可以将当前调用DLL的程序中的函数按照 指针 的方式,传进去使用,就好像声明了一个事件一样。具体可以参考Windows API中,大概EnumChildWindow的实现方式。
      

  11.   

    问题:
      “在若干个动态创建的TFrame中移动某一个的相对位置”   如果我理解的正确的话,您要实现的情况是否与:在窗体中,按Tab键实现当前窗体的焦点转换相类似,如果类似的话,也许可以参考Tab实现的方式。
      其实, rustle() 提出的TFrameList是比较好的方法,通俗的说就是建一个所有动态创建的TFrame对象的管理类。
      

  12.   

    我有一个简单的移动元件,虽不能完全满足搂主的要求,但可供参考,该元件只能防在Tframe上:unit FrameMove;interfaceuses
      SysUtils, Classes, Controls, Forms, Dialogs;type
      TFrameQueryEvent = procedure(Sender: TObject; var Enable: Boolean) of Object;  TFrameMove = class(TComponent)
      private
        { Private declarations }
        FParentLeft: Integer;
        FParentTop: Integer;
        FOnInsertQuery: TFrameQueryEvent;
        FOnRemoveQuery: TFrameQueryEvent;
        FOnInsert: TNotifyEvent;
        FOnRemove: TNotifyEvent;
        function GetFrame: TFrame;
        function GetIsInsert: Boolean;
        procedure SetParentLeft(const Value: Integer);
        procedure SetParentTop(const Value: Integer);
      protected
        { Protected declarations }
        function CanInsert: Boolean; virtual;
        function CanRemove: Boolean; virtual;
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
        function InsertFrame(FrameParent: TWinControl): Boolean;
        function RemoveFrame: Boolean;
        property Frame: TFrame read GetFrame;
        property IsInsert: Boolean read GetIsInsert;
      published
        { Published declarations }
        property ParentLeft: Integer read FParentLeft write SetParentLeft default 0;
        property ParentTop: Integer read FParentTop write SetParentTop default 0;
        property OnInsertQuery: TFrameQueryEvent read FOnInsertQuery write FOnInsertQuery;
        property OnRemoveQuery: TFrameQueryEvent read FOnRemoveQuery write FOnRemoveQuery;
        property OnInsert: TNotifyEvent read FOnInsert write FOnInsert;
        property OnRemove: TNotifyEvent read FOnRemove write FOnRemove;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('User', [TFrameMove]);
    end;{ TFrameMove }function TFrameMove.CanInsert: Boolean;
    begin
      Result := not IsInsert;
      if Result and Assigned(OnInsertQuery) then
        OnInsertQuery(Self, Result);
    end;function TFrameMove.CanRemove: Boolean;
    begin
      Result := True;
      if Assigned(OnRemoveQuery) then
        OnRemoveQuery(Self, Result);
    end;constructor TFrameMove.Create(AOwner: TComponent);
    begin
      if not (AOwner is TFrame) then
      begin
        ShowMessage('TFrameMove必须放在TFrame元件上.');
        Exit;
      end;
      inherited;
    end;function TFrameMove.GetFrame: TFrame;
    begin
      Result := TFrame(Owner);
    end;function TFrameMove.GetIsInsert: Boolean;
    begin
      Result := Frame.HasParent;
    end;function TFrameMove.InsertFrame(FrameParent: TWinControl): Boolean;
    begin
      Result := CanInsert and Assigned(FrameParent);
      if Result then
      begin
        Frame.Parent := FrameParent;
        if ParentLeft <> 0 then Frame.Left := ParentLeft;
        if ParentTop <> 0 then Frame.Top := ParentTop;
        if Assigned(OnInsert) then OnInsert(Self);
      end;
    end;function TFrameMove.RemoveFrame: Boolean;
    begin
      Result := IsInsert;
      if Result then
      begin
        Result := CanRemove;
        if Result then
        begin
          Frame.Parent := nil;
          if Assigned(OnRemove) then OnRemove(Self);
        end;
      end;
    end;procedure TFrameMove.SetParentLeft(const Value: Integer);
    begin
      if FParentLeft <> Value then
      begin
        FParentLeft := Value;
        if IsInsert then Frame.Left := Value;
      end;
    end;procedure TFrameMove.SetParentTop(const Value: Integer);
    begin
      if FParentTop <> Value then
      begin
        FParentTop := Value;
        if IsInsert then Frame.Top := Value;
      end;
    end;end.