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

📄 mainform.pas

📁 學習資料網上下載
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  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 + -