如何在Delphi Docking示例中添加持久性

时间:2013-01-04 16:17:40

标签: delphi persistence docking delphi-xe3

虽然我意识到除了包含的Delphi对接演示之外还有other and better docking libraries可用,例如Developer Express LibraryJVCL Docking Library,但对于特定的演示项目,我只能使用只有Delphi的内置功能(尽管存在一些明显的缺陷)。

我的问题涉及为对接状态添加持久性。我从检查Controls.pas看到,TDockTree是默认的Dock管理器,它有Stream I / O例程。在SO和各种论坛上挖掘,虽然我无法看到有人称这些例程。我已经尝试从相关的Create和OnDrop事件加载并保存到一个文件,但是我在黑暗中刺伤。我很高兴保存和恢复表单大小和状态,但我正在努力解决我应该保存的概念。任何善良的人都会给我一个起点吗?

我正在使用Delphi XE3,所以所有(?)事情都是可能的!

非常感谢。

2 个答案:

答案 0 :(得分:0)

我正在使用Toolbar 2000 from J. Russels。它提供面板,工具窗口和工具栏。

提供TBRegSavePositionsTBRegSavePositions等功能,将用户自定义存储到注册表中。

加载"视图"通过代码行轻松完成:

TBRegLoadPositions(self, HKEY_CURRENT_USER, c_BaseUserRegKey);

在这种情况下,自我是我的形式。

答案 1 :(得分:0)

通过将数据存储在字符串中,可以使用LoadFromStreamSaveToStream方法加载和保存对接配置。

因此,需要以下方法:

  • 将当前对接配置保存为字符串
  • 从字符串中加载当前的对接配置

以下是执行此操作的代码:

function GetDockString(const AManager: IDockManager): AnsiString;
var
  LStream: TMemoryStream;
begin
  LStream := TMemoryStream.Create();
  try
    AManager.SaveToStream(LStream);
    SetLength(Result, 2 * LStream.Size);
    BinToHex(LStream.Memory, PAnsiChar(Result), LStream.Size);
  finally
    FreeAndNil(LStream);
  end;
end;

procedure ReadDockString(const ADockString: AnsiString; const AManager: IDockManager);
var
  LStream: TMemoryStream;
begin
  LStream := TMemoryStream.Create();
  try
    LStream.Size := Length(ADockString) div 2;
    HexToBin(PAnsiChar(ADockString), LStream.Memory, LStream.Size);
    LStream.Position := 0;
    AManager.LoadFromStream(LStream);
  finally
    FreeAndNil(LStream);
  end;
end;

我已经在应用程序中使用了此类方法来创建可停靠的窗口,但是vcl仅提供了非常基本的用户体验。您可以做一些事情,但是很难测试和调试-我已经花了太多时间来使用和覆盖TCustDockDragObjectTCaptionedTabDockTree,所以我会推荐使用对接框架。

这是一个最小的示例,它创建两种形式并读取对接配置。

TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  procedure FormDblClick(Sender: TObject);
private
    FPanel: TPanel;
end;

实施:

procedure TForm1.FormCreate(Sender: TObject);
var
  LWindow: TForm;
const
  LDockExample = '0000080000000000000000000000000000000000000000000000000100000000000000000B0000004368696C6457696E646F77FFFFFFFF';
begin
  FPanel := TPanel.Create(Self);
  FPanel.Align := alTop;
  FPanel.Height := 300;
  FPanel.DockSite := true;
  FPanel.Parent := Self;

  LWindow := TForm.CreateNew(Self);
  LWindow.Name := 'ChildWindow';
  LWindow.DragKind := dkDock;
  LWindow.BoundsRect:=Rect(10, 10, 400, 400);
  LWindow.Color := clGreen;
  LWindow.Show;

  ReadDockString(LDockExample, FPanel.DockManager);
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
  ShowMessage(GetDockString(FPanel.DockManager));
end;