⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resourceform.pas

📁 學習資料網上下載
💻 PAS
📖 第 1 页 / 共 2 页
字号:
 |                                                                      |
 | 'Get' handler for RedoDescription property.  Return the description  |
 | for the entry at the top of the redo stack.                          |
 *----------------------------------------------------------------------*)
function TfmResource.GetRedoDescription: string;
var
  details : TUndoDetails;
  entry : TUndoEntry;
begin
  result := '';
  if ResourceDetails.Tag <> 0 then
  begin
    details := TUndoDetails (resourceDetails.Tag);
    if details.fRedoStack.Count > 0 then
    begin
      entry := TUndoEntry (details.fRedoStack.Peek);

      if Assigned (entry) then
        result := entry.fDetails
    end
  end
end;

(*----------------------------------------------------------------------*
 | TfmResource.GetResourceDetails                                       |
 |                                                                      |
 | 'Get' method for ResourceDetails property.  Check 'Obj' is really    |
 | TResourceDetails, and return it.                                     |
 *----------------------------------------------------------------------*)
function TfmResource.GetResourceDetails: TResourceDetails;
begin
  result := Obj as TResourceDetails
end;

(*----------------------------------------------------------------------*
 | TfmResource.GetUndoDescription                                       |
 |                                                                      |
 | 'Get' handler for UndoDescription property.  Return the description  |
 | for the entry at the top of the redo stack.                          |
 *----------------------------------------------------------------------*)
function TfmResource.GetUndoDescription: string;
var
  details : TUndoDetails;
  entry : TUndoEntry;
begin
  result := '';
  if ResourceDetails.Tag <> 0 then
  begin
    details := TUndoDetails (resourceDetails.Tag);
    if details.fUndoStack.Count > 0 then
    begin
      entry := TUndoEntry (details.fUndoStack.Peek);

      if Assigned (entry) then
        result := entry.fDetails
    end
  end
end;

(*----------------------------------------------------------------------*
 | TfmResource.Redo                                                     |
 |                                                                      |
 | 'Redo' the last change for the resource details.                     |
 *----------------------------------------------------------------------*)
procedure TfmResource.Paste;
begin

end;

procedure TfmResource.Redo;
var
  details : TUndoDetails;
begin
  if ResourceDetails.Tag <> 0 then
  begin
    details := TUndoDetails (resourceDetails.Tag);
    details.Redo;
  end
end;

(*----------------------------------------------------------------------*
 | TfmResource.SetObject                                                |
 |                                                                      |
 | 'Set' property handler overridden to initialize the details undo     |
 | stack.  Note that the redo stack is cleared here to prevent          |
 | unlimited memory usage.                                              |
 *----------------------------------------------------------------------*)
procedure TfmResource.SelectAll;
begin
// Stub
end;

procedure TfmResource.SetObject(const Value: TObject);
var
  details : TUndoDetails;
begin
  if Assigned (Obj) and (Value <> Obj) then
    if ResourceDetails.Tag <> 0 then
    begin
      details := TUndoDetails (resourceDetails.Tag);  // ie.   The *old* object's
                                                      // details

      details.ClearRedoStack;

      if details.fUndoStack.Count = 0 then
      begin
        ResourceDetails.Tag := 0;
        gUndoDetails.Remove (details)
      end
    end;
  inherited;  // Call inherited to set the 'obj' property
end;

(*----------------------------------------------------------------------*
 | TfmResource.Undo                                                     |
 |                                                                      |
 | 'Undo' the last change.                                              |
 *----------------------------------------------------------------------*)
procedure TfmResource.Undo;
var
  details : TUndoDetails;
begin
  if ResourceDetails.Tag <> 0 then
  begin
    details := TUndoDetails (resourceDetails.Tag);
    details.Undo;
  end
end;

//=======================================================================
// TUndoDetails methods

{ TUndoDetails }

(*----------------------------------------------------------------------*
 | TUndoDetails.AddUndoEntry                                            |
 |                                                                      |
 | Add an entry to the undo list                                        |
 *----------------------------------------------------------------------*)
procedure TUndoDetails.AddUndoEntry(const details: string);
begin
  fUndoStack.Push (TUndoEntry.Create (details, fResourceDetails));
end;

(*----------------------------------------------------------------------*
 | TUndoDetails.ClearRedoStack                                          |
 |                                                                      |
 | Clear the Redo list                                                  |
 *----------------------------------------------------------------------*)
procedure TUndoDetails.ClearRedoStack;
begin
  while fRedoStack.Count > 0 do
    fRedoStack.Pop.Free;
end;

(*----------------------------------------------------------------------*
 | TUndoDetails.Create                                                  |
 |                                                                      |
 | Constructor for TUndoDetails.  Create the undo and redo stacks       |
 *----------------------------------------------------------------------*)
constructor TUndoDetails.Create (ResourceDetails : TResourceDetails);
begin
  fResourceDetails := ResourceDetails;
  fUndoStack := TObjectStack.Create;
  fRedoStack := TObjectStack.Create;
end;

(*----------------------------------------------------------------------*
 | TUndoDetails.Destroy                                                 |
 |                                                                      |
 *----------------------------------------------------------------------*)
destructor TUndoDetails.Destroy;
begin
  ClearRedoStack;

  while fUndoStack.Count > 0 do // Clear the undo stack
    fUndoStack.Pop.Free;

  fUndoStack.Free;              // nb.  Object stacks don't own their Objects!
  fRedoStack.Free;
  inherited;
end;

(*----------------------------------------------------------------------*
 | TUndoDetails.Redo                                                    |
 |                                                                      |
 | Redo the changes at the top of the 'redo' stack                      |
 *----------------------------------------------------------------------*)
procedure TUndoDetails.Redo;
var
  entry : TUndoEntry;
begin
  if fRedoStack.Count > 0 then
  begin
    entry := TUndoEntry (fRedoStack.Pop);
    fUndoStack.Push (TUndoEntry.Create (entry.fDetails, fResourceDetails));
    fResourceDetails.ResourceName := entry.fName;
    fResourceDetails.ResourceLanguage := entry.fLanguage;
    fResourceDetails.ChangeData (entry.fData);
    entry.Free
  end
end;

(*----------------------------------------------------------------------*
 | TUndoDetails.Undo                                                    |
 |                                                                      |
 | Undo the changes at the top of the undo stack                        |
 *----------------------------------------------------------------------*)
procedure TUndoDetails.Undo;
var
  entry : TUndoEntry;
begin
  if fUndoStack.Count > 0 then
  begin
    entry := TUndoEntry (fUndoStack.Pop);
    fRedoStack.Push (TUndoEntry.Create (entry.fDetails, fResourceDetails));
    fResourceDetails.ResourceName := entry.fName;
    fResourceDetails.ResourceLanguage := entry.fLanguage;
    fResourceDetails.ChangeData (entry.fData);
    entry.Free
  end
end;

//=======================================================================
// TUndoEntry methods

{ TUndoEntry }

constructor TUndoEntry.Create(const details : string; res : TResourceDetails);
begin
  fData := TMemoryStream.Create;
  fData.CopyFrom (res.Data, 0);
  fLanguage := res.ResourceLanguage;
  fDetails := details;
  fName := res.ResourceName
end;

destructor TUndoEntry.Destroy;
begin
  fData.Free;
  inherited;
end;

initialization
  gUndoDetails := TObjectList.Create;
finalization
  gUndoDetails.Free;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -