📄 resourceform.pas
字号:
| |
| '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 + -