Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向Delphi停靠示例添加持久性_Delphi_Persistence_Docking_Delphi Xe3 - Fatal编程技术网

如何向Delphi停靠示例添加持久性

如何向Delphi停靠示例添加持久性,delphi,persistence,docking,delphi-xe3,Delphi,Persistence,Docking,Delphi Xe3,虽然我意识到除了包含的Delphi对接演示之外,还有可用的,如和,但对于特定的演示项目,我仅限于使用Delphi内置功能(尽管存在一些明显的缺陷) 我的问题与向停靠状态添加持久性有关。通过检查Controls.pas,我发现TDockTree是默认的dock manager,它具有流I/O例程。尽管我看不出有人怎么称呼这些惯例,但我还是在各种论坛上四处挖掘。我已经尝试过从相关的Create和OnDrop事件加载并保存到一个文件中,但我正在暗中摸索。我很高兴保存和恢复表单大小和状态,但我仍在为我应

虽然我意识到除了包含的Delphi对接演示之外,还有可用的,如和,但对于特定的演示项目,我仅限于使用Delphi内置功能(尽管存在一些明显的缺陷)

我的问题与向停靠状态添加持久性有关。通过检查Controls.pas,我发现TDockTree是默认的dock manager,它具有流I/O例程。尽管我看不出有人怎么称呼这些惯例,但我还是在各种论坛上四处挖掘。我已经尝试过从相关的Create和OnDrop事件加载并保存到一个文件中,但我正在暗中摸索。我很高兴保存和恢复表单大小和状态,但我仍在为我应该保存的内容的概念而挣扎。有什么好心人能给我一个起点吗

我使用的是Delphi XE3,所以一切都是可能的

非常感谢。

我正在使用。它提供了面板、工具窗口和工具栏

它提供了类似于
TBRegSavePositions
TBRegSavePositions
的函数来将用户定制存储到注册表中

在代码行加载“视图”可轻松完成:

TBRegLoadPositions(self, HKEY_CURRENT_USER, c_BaseUserRegKey);

在本例中,self是我的表单。

您可以通过将数据存储在字符串中,使用
LoadFromStream
SaveToStream
方法加载和保存停靠配置

因此,需要以下方法:

  • 将当前停靠配置保存为字符串
  • 从字符串加载当前停靠配置
下面是一些执行此操作的代码:

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
只提供了非常基本的用户体验。您可以对此做些什么,但测试和调试很困难-我已经花了太多时间来使用和覆盖
TCustDockDragObject
tcoptionedtabdocktree
,因此我建议使用停靠框架

下面是一个创建两个表单并读取停靠配置的最小示例

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;

我发现使用JVCL进行持久化的尝试非常困难,如果内置的(几乎无用的)对接库代码更好一些,我会感到惊讶,事实上,我确信它更糟糕。没有意义。如果你的时间物有所值,就买一些你需要的东西