如何为Delphi Docking示例添加持久化功能

11
尽管我意识到除了包含的Delphi停靠演示之外,还有其他更好的停靠库可用,例如Developer Express LibraryJVCL Docking Library,但对于特定的演示项目,我只能使用Delphi内置功能(尽管存在一些已知缺陷)。我的问题涉及将持久性添加到停靠状态。从检查Controls.pas文件中,我看到TDockTree是默认的停靠管理器,并且它具有Stream I/O例程。但是,在SO和各种论坛上搜索后,我无法看到任何人如何调用这些例程。我尝试从相关的Create和OnDrop事件加载和保存到文件,但是我是在摸索。我可以保存和恢复表单大小和状态,但是我在理解应该保存什么方面遇到了困难。是否有善良的人可以给我一个起点? 我正在使用Delphi XE3,所以所有(?)的事情都是可能的!
许多感谢。

1
我发现使用JVCL进行持久化尝试非常困难,如果内置的(几乎无用的)停靠库代码更好的话,我会感到惊讶,事实上,我确信它更糟糕。没有意义。如果你的时间很宝贵,就购买一些能够满足你需求的东西吧。;-) - Warren P
2个回答

0

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

该工具提供了像TBRegSavePositionsTBRegSavePositions这样的函数,以将用户自定义存储到注册表中。

通过一行代码轻松加载“视图”:

TBRegLoadPositions(self, HKEY_CURRENT_USER, c_BaseUserRegKey);

在这种情况下,self 是我的表单。


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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接