2012-08-31 2 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/을 시도


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; 

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; 
? JVCL은 현재 개발자에게 매우 부족하지만 여전히 있습니다. 모두의 베스트는 checkign 마지막 JVCL 근원 일 것입니다 (방출은 더 일년 전에이고 종류에 쓸모 없습니다) 추적자로 작은 민주당 원 프로젝트를 만들는 시도하십시오 http://issuetracker.delphi-jedi.org 그것은 또한 좋을 왜냐하면, 진심으로, 나는 단지 당신이 무엇을 원하는지 그리고 무슨 일이 일어나는지 알 수 없다. 표현은 다소 모호하며 구성 요소와 그 동작의 정확한 상관 관계를 이해하기 어렵습니다. 당신이 영어에 능숙하지 않아서 소스가 더 잘 말할 것 같습니다. –

+0

저는 제다이 개발자입니다. 그래서 JvDocking 질문은 StackOverflow에서 가장 환영합니다. –

답변

2

속성 DragKind 및 DragMode는 표준 VCL 속성입니다. 도킹은 VCL에 내장되어 있으며이를 보면 Jedi 코드가 전혀 포함되지 않은 상태에서 작동하는 것으로 보입니다.

양식 이외의 것을 도킹 할 수있는 기능은 이미 VCL에 내장되어 있습니다. 그러므로이 설명 할 수없는 것이 제다이가 VCL에 도킹을 추가했다고 생각한다는 것을 나에게 알게 해줍니다. 아니요, 가짜 윈도우 제목 표시 줄을 사용하여 "탭이있는 노트 도킹"및 "결합 된 영역"과 같은 예쁜 것들을 추가했습니다.

즉, Forms는 TCustomControl에서도 상속되며 모든 TCustomControl은 실제로 도킹 될 수 있습니다. VCl과 마찬가지로 드래그하여 도킹하고 TPanels 위에 올려 놓을 수 있습니다. 좋아, 그것은 당신의 패널이 런타임에 당신에게 형태로 바뀔 수있는 기이 한 기능이지만, 당신이 나를 믿지 않는다면 시도하십시오. 제다이가 아닌 VCL이 당신에게 이것을합니다.

당신의 지혜가 TForm이 아닌 것을 차단하려는 경우, 가능하다고 생각했습니다. 분명히 옳을 수 있습니까? 업데이트. 그래 넌 할수있어. OnDockOver는 도킹을 차단하려는 모든 패널에서 도킹을 차단하는 데 적합합니다. Jedi JvDockPanels의 트릭은 디자인 타임에 볼 수 없기 때문에 런타임에 코드에 연결하여 이벤트에 액세스해야합니다.

일반 TPanels와 마찬가지로 JvDockPanels에는 TPanel.OnDockOver 이벤트가 있으며, 도킹중인 항목을 확인하고 Accept를 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

워렌 (Warren) - JVCL에 대한보다 일반적인 패치를 sugegsted하여 검토해 보시기 바랍니다. 그런 작업장은 분명한 일이지만 반드시 필요하지는 않습니다. –

+0

아니요, 지원이 JvDocking "things things"목록에 없기 때문에. –

+0

무엇을 지원합니까? 지원되지 않는 양식은 아니지만 개발자 측에서 해킹 론 없이는 거부해야합니다. –

0

나는 델파이 XE2에서 당신의 행동을 정확하게 재현 할 수 없지만, 일반적으로 나는 JediVCL 컴포넌트에 대해 VCL-frag-n-drop을 차단하는 것처럼 보입니다.

어쩌면 최선의 방법은 아니지만 프레임 워크 작성자의 원래 아이디어가 무엇인지 알 수 없습니다.

http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvDockServer 소유권 주장은 도킹해야합니다. 그것을 시행하지 않았고, 항상 유선 JVCL 점검 루틴이 호출되었습니다.

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

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

관련 문제