📄 mainform.pas
字号:
try
fBlockUpdate := True;
tvResources.Items.Clear;
if (fResourceModule is TPEResourceModule) and fCOFFSectionsShowing then
begin
// If the fCOFFSectionsShowing flags is set, and if it's a PE resource module
// then add the PE section nodes
peModule := TPEResourceModule (fResourceModule);
if peModule.ImageSectionCount > 0 then
begin
tvResources.Items.AddObject (Nil, 'DOS Header', pointer (otDOSHeader));
tvResources.Items.AddObject (Nil, 'COFF Header', pointer (otCOFFHeader));
tvResources.Items.AddObject (Nil, '''Optional'' Header', pointer (otOptionalHeader));
rootNode := tvResources.Items.AddObject (Nil, 'Sections', pointer (otSections));
for i := 0 to peModule.ImageSectionCount - 1 do
begin
section := peModule.ImageSection [i];
sectionNode := tvResources.Items.AddChildObject (rootNode, section.SectionName, section);
if section.SectionName = '.rsrc' then
begin
AddResources (sectionNode);
RootNode.Expand (False);
SectionNode.Expand (False)
end
end
end
end
else
// It's a .RES file, or the fCOFFSectionsShowing flag is not set.
// Just add the resources.
AddResources (Nil)
finally
fBlockUpdate := False;
tvResources.Items.EndUpdate
end
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.MRUList1PopupMenuClick |
| |
| Open a file from the MRU list popup. |
*----------------------------------------------------------------------*)
procedure TfmMain.MRUList1PopupMenuClick(Sender: TObject);
var
item : TMenuItem;
p : Integer;
begin
if Sender is TMenuItem then
begin
item := TMenuItem (sender);
p := Pos (' ', Item.Caption);
if p > 0 then
OpenFile (Copy (Item.Caption, p + 1, MaxInt))
end
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.OpenFile |
| |
| Open the specified module or .res file |
*----------------------------------------------------------------------*)
procedure TfmMain.OpenFile(const fileName: string);
var
ext : string;
begin
if SaveChanges then
begin
FreeAndNil (fResourceModule);
ClearUndoDetails;
ext := UpperCase (ExtractFileExt (fileName));
if (ext = '.RES') or (ext = '.DCR') then
fResourceModule := TResModule.Create
else
fResourceModule := TPEResourceModule.Create;
fResourceModule.LoadFromFile (fileName);
Self.FileName := FileName;
MRUList1.AddFile (fileName);
UpdateDisplay;
end
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.tvResourcesChange |
| |
| Switch view when a tree node is selected |
*----------------------------------------------------------------------*)
procedure TfmMain.tvResourcesChange(Sender: TObject; Node: TTreeNode);
begin
if (not fBlockUpdate) and Assigned (Node) then
SwitchView (TResourceDetails (Node.Data))
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.UpdateActions |
| |
| Update the action list, depending on the state. |
*----------------------------------------------------------------------*)
procedure TfmMain.UpdateActions;
var
res : TResourceDetails;
resForm : TfmResource;
begin
actResourceDeleteResource.Enabled := Assigned (tvResources.Selected) and Assigned (tvResources.Selected.Data);
resForm := ResourceForm;
if Assigned (resForm) then
begin
actEditUndo.Enabled := resForm.CanUndo;
actEditRedo.Enabled := resForm.CanRedo;
actEditCut.Enabled := resForm.CanCut;
actEditCopy.Enabled := resForm.CanCopy;
actEditPaste.Enabled := resForm.CanPaste;
actEditSelectAll.Enabled := resForm.CanSelectAll;
actEditDelete.Enabled := resForm.CanDelete;
res := SelectedResourceDetails;
actResourceExportResource.Enabled := Assigned (res);
actResourceProperties.Enabled := Assigned (res) and not (res is TIconCursorResourceDetails);
end
else
begin
actEditUndo.Enabled := False;
actEditRedo.Enabled := False;
actEditCut.Enabled := False;
actEditCopy.Enabled := False;
actEditPaste.Enabled := False;
actEditSelectAll.Enabled := False;
actResourceExportResource.Enabled := False;
actResourceProperties.Enabled := False;
actEditDelete.Enabled := False;
end
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.actEditDeleteExecute |
| |
| EditDelete action handler |
*----------------------------------------------------------------------*)
procedure TfmMain.actEditDeleteExecute(Sender: TObject);
begin
if ResourceForm <> nil then
ResourceForm.EditDelete
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.SwitchView (details : TObject) |
| |
| 'details' can be: |
| |
| * A TResourceDetails object |
| * A TImageSection object |
| * A dummy object - otDOSHeader, otCOFFHeader, etc. |
| * Nil |
*----------------------------------------------------------------------*)
procedure TfmMain.SwitchView(details: TObject);
type
TObjectFormRec = record
details : TClass;
form : TResourceObjectFormClass;
end;
const
NoObjectDetails = 12;
NoHeaderForms = 3;
ObjectForms : array [0..NoObjectDetails - 1] of TObjectFormRec = (
(details : TGraphicsResourceDetails; form : TfmGraphicsResource),
(details : TTextResourceDetails; form : TfmTextResource),
(details : TImageSection; form : TfmPESection),
(details : TIconCursorGroupResourceDetails; form : TfmGroupResource),
(details : TVersionInfoResourceDetails; form : TfmVersionResource),
(details : TMenuResourceDetails; form : TfmMenuResource),
(details : TDialogResourceDetails; Form : TfmDialogResource),
(details : TRCDataDescriptionResourceDetails; Form : TfmRCDataDescriptionResource),
(details : TRCDataPackagesResourceDetails; Form : TfmPackagesResource),
(details : TRCDataFormResourceDetails; Form : TfmRCDataFormResource),
(details : TXPManifestResourceDetails; Form : TfmXPManifestResource),
(details : TResourceDetails; form : TfmRawResource) // Must be last entry!
);
HeaderForms : array [0..NoHeaderForms - 1] of TResourceObjectFormClass = (
TfmDOSHeader,
TfmCOFFHeader,
TfmOptionalHeader
);
var
i : Integer;
formClass : TResourceObjectFormClass;
begin
formClass := Nil;
if Integer (details) > 32 then
begin
for i := 0 to NoObjectDetails - 1 do
if details is ObjectForms [i].details then
begin
formClass := ObjectForms [i].form;
break
end
end
else
if (Integer (details) > 0) and (Integer (details) <= NoHeaderForms) then
formClass := HeaderForms [Integer (details) - 1];
// formClass is now a valid form class - or Nil
if not Assigned (fmResourceObject) or not Assigned (formClass) or not (fmResourceObject is formClass) then
begin
if Assigned (fmResourceObject) then
begin
SetFormMenuButton (Nil);
FreeAndNil (fmResourceObject);
end;
if Assigned (formClass) then
begin
fmResourceObject := formClass.Create (Nil);
fmResourceObject.Parent := pnlResource;
fmResourceObject.ResourceModule := fResourceModule;
SetFormMenuButton (fmResourceObject.Menu);
fmResourceObject.Show;
fmResourceObject.Font := Self.Font;
fmResourceObject.Obj := details
end
end
else // Form class is valid, and hasn't changed. Update the form.
if Assigned (fmResourceObject) then
fmResourceObject.obj := details;
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.WmInitialize |
| |
| WM_INITIALIZE handler. Start with a blank .res file. |
*----------------------------------------------------------------------*)
procedure TfmMain.WmInitialize(var msg: TMessage);
begin
fUndo := actEditUndo.Caption;
fRedo := actEditRedo.Caption;
if ParamCount = 0 then
actFileNew.Execute
else
OpenFile (ParamStr (1))
end;
(*----------------------------------------------------------------------*
| procedure TfmMain.actFileSaveExecute |
| |
| File/Save handler. If we know the file name, overwrite it. |
| Otherwise do File/Save As instead. |
*----------------------------------------------------------------------*)
procedure TfmMain.actFileSaveExecute(Sender: TObject);
begin
SaveFile
end;
(*----------------------------------------------------------------------*
| TfmMain.actEditCutExecute |
| |
*----------------------------------------------------------------------*)
procedure TfmMain.actEditCutExecute(Sender: TObject);
begin
if ResourceForm <> nil then
ResourceForm.Cut
end;
(*----------------------------------------------------------------------*
| TfmMain.actViewToolbarExecute |
| |
| Turn the toolbar on/off. |
*----------------------------------------------------------------------*)
procedure TfmMain.actViewToolbarExecute(Sender: TObject);
begin
fProperties.ShowToolbar := not fProperties.ShowToolbar;
end;
(*----------------------------------------------------------------------*
| TfmMain.actViewStatusbarExecute |
| |
| Turn the status bar on/off |
*----------------------------------------------------------------------*)
procedure TfmMain.actViewStatusbarExecute(Sender: TObject);
begin
fProperties.ShowStatusBar := not fProperties.ShowStatusBar
end;
(*----------------------------------------------------------------------*
| TfmMain.Loaded |
| |
| Initialize. |
*----------------------------------------------------------------------*)
procedure TfmMain.Loaded;
begin
inherited;
SetCaption;
fProperties := TPEResourceExplorerProperties.Create (self);
PostMessage (handle, WM_INITIALIZE, 0, 0);
end;
(*----------------------------------------------------------------------*
| TfmMain.WmPropertiesChanged |
| |
| Handle our 'WM_PROPERTIESCHANGED' message. Apply persistent |
| properties |
*----------------------------------------------------------------------*)
procedure TfmMain.WmPropertiesChanged(var msg: TMessage);
begin
psToolbar.Visible := fProperties.ShowToolbar;
actViewToolbar.Checked := psToolbar.Visible;
sbMain.Visible := fProperties.ShowStatusBar;
actViewStatusbar.Checked := sbMain.Visible;
if fProperties.ShowCOFFSections <> fCOFFSectionsShowing then
UpdateDisplay;
end;
(*----------------------------------------------------------------------*
| TfmMain.actViewPropertiesExecute |
| |
| Display/execute the 'Properties' dialog |
*----------------------------------------------------------------------*)
procedure TfmMain.actViewPropertiesExecute(Sender: TObject);
var
dlg : TfmProperties;
begin
dlg := TfmProperties.Create (Nil);
try
dlg.Properties := fProperties;
dlg.ShowModal
finally
dlg.Free
end
end;
(*----------------------------------------------------------------------*
| TfmMain.SetFormMenuButton |
| |
| Turn on or off the '...object' menu button. This is set to the |
| form's menu item. |
*----------------------------------------------------------------------*)
procedure TfmMain.SetFormMenuButton(item: TMenuItem);
begin
if Assigned (item) then
begin
btnResourceObject.Caption := item.Caption;
btnResourceObject.MenuItem := item;
btnResourceObject.Visible := True;
end
else
begin
btnResourceObject.Visible := False;
btnResourceObject.MenuItem := Nil;
btnResourceObject.Caption := '...object'
end
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -