【问题标题】:How to add persistence to the Delphi Docking example如何向 Delphi Docking 示例添加持久性
【发布时间】:2012-12-19 02:31:54
【问题描述】:

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

我的问题与为停靠状态添加持久性有关。我通过检查 Controls.pas 看到 TDockTree 是默认的停靠管理器,并且它具有 Stream I/O 例程。尽管我看不出有人如何调用这些例程,但在 SO 和各种论坛上进行挖掘。我已经尝试从相关的 Create 和 OnDrop 事件中加载并保存到文件中,但我在黑暗中刺伤。我很高兴保存和恢复表单大小和状态,但我正在为我应该保存的概念而苦苦挣扎。有好心人能给我一个起点吗?

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

非常感谢。

【问题讨论】:

  • 我发现尝试使用 JVCL 进行持久化非常困难,如果内置的(几乎没用的)对接库代码更好,我会感到惊讶,事实上,我敢肯定它更糟。没有意义。如果您的时间物有所值,那就买些能满足您需求的东西。 ;-)

标签: delphi persistence docking delphi-xe3


【解决方案1】:

您可以使用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;

【讨论】:

    【解决方案2】:

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

    那个提供了TBRegSavePositionsTBRegSavePositions之类的功能来将用户自定义存储到注册表中。

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

    TBRegLoadPositions(self, HKEY_CURRENT_USER, c_BaseUserRegKey);
    

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

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多