2012-08-31 29 views
2

我使用对接模块在Delphi(BDS 2006)和JVCL库中进行编程。我有一个问题 - 如果控件的属性DragKind = dkDockDragMode = dmAutomatic,然后莫名其妙地TJvDockServer组件采取控件都是客户端,并提供对接。这是错误的,因为我发现JVCL的对接函数通常只控制包含组件类TJvDockClient的类TForm。我想知道是否有可能以某种方式阻止TJvDockServer对象的类与TForm不同?在Delphi中,每个事件的典型对接都称为OnGetSiteInfo对接,并且可以过滤客户端,但TJvDockServer中没有这样的事件。TJvDockServer和可停靠控件

+0

试过论坛http://newsportal.delphi-jedi.org/? JVCL现在对开发人员来说很短暂,但仍然很短。 最重要的将是签署最后的JVCL来源(发布时间比一年前更早,并且已经过时),并尝试将小演示项目加入跟踪器http://issuetracker.delphi-jedi.org 这也是不错的因为,我真的不知道你想要什么和发生什么。措辞有点模糊,很难理解组件及其行为的精确关联。看起来你的英语不太流利,那么信息来源会说得更好:) –

+0

我是绝地开发者,所以JvDocking的问题在StackOverflow中最受欢迎。 –

回答

2

属性DragKind和DragMode是标准的VCL属性。 Docking内置在VCL中,从看它的角度来看,它似乎在没有任何Jedi代码的情况下工作得很好。

VCL中已经内置了停靠表单之外其他功能的功能。因此,你觉得这个莫名其妙的暗示我认为你认为Jedi加入了VCL。不,它只是添加了一些漂亮的东西,如“标签式笔记本对接”和“连体区域”与假窗口标题栏。也就是说,表单也是从TCustomControl继承而来的,任何TCustomControl实际上都可以被停靠。就像VCl一样,你可以拖拽并停靠在TPanel上。好吧,这是一个古怪的功能,你的面板可以在运行时变成你的形式,但如果你不相信我,试试吧。这是VCL为你做的,而不是绝地。

如果你的智慧,你想阻止任何不是TForm的东西,我认为你可以。 当然你可以对吗? 更新。是的你可以。 OnDockOver可以正常工作,以阻止任何面板上的对接,您想要在其上停靠。 Jedi JvDockPanels的诀窍是你在设计时不会看到它们,所以你需要在运行时通过代码来访问它们的事件。

就像普通的TPanels一样,JvDockPanels有一个TPanel.OnDockOver事件,如果你想检查你正在对接的东西,并将接受设置为false,它将被阻止对接。

好了,这个工程:

type 
    TCustomControlAccess = class(TCustomControl); 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    TCustomControlAccess(dockServer.TopDockPanel).OnDockOver := MyDockOverEvent; 
    TCustomControlAccess(dockServer.CustomDockPanel).OnDockOver := MyDockOverEvent; 

    ... 
end; 

的JvDockPanel.OnDockOver面板大事做火,但是你需要求助于像上面砍一个黑客,实际上自己处理的事件。

更新以前认为没有办法阻止这一点。但是我错了。弄清楚了。

+0

沃伦 - 我为JVCL提供了一个更加普遍的补丁,希望你能回顾一下。这样的工作通道是显而易见的,但不是必需的。 –

+0

不,因为支持这不是JvDocking“我们做的事情”列表。 –

+0

支持什么? 我并不是说支持非表格,但是他们绝对应该在开发者一方没有hackathlon的情况下被拒绝 –

0

虽然我不能在Delphi XE2中准确再现您的行为,但通常我似乎设法阻止了JediVCL组件的VCL-frag-n-drop。

也许这不是最好的方法,但我不知道哪些是框架创建者的原创想法。

http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvDockServer只声明表单应该停靠。没有强制执行,只是硬连线的JVCL检查程序总是被调用。


unit JvDockSupportControl; 
    .... 
    TJvDockCustomControl = class(TJvCustomControl) 
    .... 
    protected 
     procedure GetSiteInfo(Client: TControl; var InfluenceRect: TRect; 
      MousePos: TPoint; var CanDock: Boolean); override; 

    ........... 

    function TJvDockCustomControl.GetJvDockManager: IJvDockManager; 
    begin 
    // Result := IJvDockManager(DockManager); 
    DockManager.QueryInterface(IJvDockManager, Result); 
    end; 

    procedure TJvDockCustomControl.GetSiteInfo(Client: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); 
    var jdm: IJvDockManager; idm: IDockManager; 
    begin 
    idm := DockManager; 
    if nil <> idm then 
     idm.QueryInterface(IJvDockManager, jdm); 

    if nil = jdm 
     then CanDock := false 
     else jdm.GetSiteInfo(Client,InfluenceRect, MousePos, CanDock); 
    end; 

unit JvDockTree; 
    ..... 
    procedure TJvDockTree.GetSiteInfo(Client: TControl; 
    var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); 
    begin 
    CanDock := IsDockable(DockSite, Client); 

    If CanDock then begin 
     GetWindowRect(DockSite.Handle, InfluenceRect); 
     InflateRect(InfluenceRect, DefExpandoRect, DefExpandoRect); 
    end; 
    end; 

http://issuetracker.delphi-jedi.org/view.php?id=5271

http://issuetracker.delphi-jedi.org/view.php?id=5974