从Delphi IDE中使源代码可写

7

在Delphi IDE内部,是否可能使只读源代码(例如.pas和.dfm)可写?右键单击在IDE内部将文件标记为只读或可写选项不能更改文件系统上的属性。是否有可以实现此功能的IDE扩展程序或类似工具?

最好不要使用集成源代码控制系统来实现此目的。我正在使用Delphi XE和Delphi 6。

谢谢!

sse

3个回答

8
这是我会这样做的方法。
创建一个新的包,它将在设计时安装到IDE中。如果您有现成的包可用,那么您可以继续使用它。确保该包 requires designide 包。您可以在项目管理器中执行此操作,也可以通过查看项目源代码并将 designide 添加到 requires 子句中来完成。
现在将以下单元添加到您的包中。
unit MakeEditable;

interface

procedure Register;

implementation

uses
  Windows, SysUtils, Menus, ToolsAPI;

type
  TMakeEditable = class(TObject)
  private
    FEditorServices: IOTAEditorServices;
    FFileMenu: TMenuItem;
    FMakeEditable: TMenuItem;
    function MenuItemWithCaptionLike(const Menu: TMenuItem; const DesiredCaption: string): TMenuItem;
    procedure MakeEditableClick(Sender: TObject);
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TMakeEditable.Create;
var
  Index: Integer;
  PreviousMenuItem: TMenuItem;
begin
  inherited;
  FEditorServices := (BorlandIDEServices as IOTAEditorServices);
  FFileMenu := MenuItemWithCaptionLike((BorlandIDEServices as INTAServices40).MainMenu.Items, 'File');
  if Assigned(FFileMenu) then begin
    PreviousMenuItem := MenuItemWithCaptionLike(FFileMenu, 'Reopen');
    if Assigned(PreviousMenuItem) then begin
      Index := PreviousMenuItem.MenuIndex;
      if Index>=0 then begin
        FMakeEditable := TMenuItem.Create(FFileMenu);
        FMakeEditable.Caption := 'Ma&ke Editable';
        FMakeEditable.OnClick := MakeEditableClick;
        FFileMenu.Insert(Index, FMakeEditable);
      end;
    end;
  end;
end;

destructor TMakeEditable.Destroy;
begin
  FMakeEditable.Free;
  inherited;
end;

function TMakeEditable.MenuItemWithCaptionLike(const Menu: TMenuItem; const DesiredCaption: string): TMenuItem;
var
  i: Integer;
  Target, Found: string;
begin
  Target := StringReplace(LowerCase(Trim(DesiredCaption)), '&', '', [rfReplaceAll, rfIgnoreCase]);
  for i := 0 to Menu.Count-1 do begin
    Result := Menu.Items[i];
    Found := StringReplace(LowerCase(Trim(Result.Caption)), '&', '', [rfReplaceAll, rfIgnoreCase]);
    if Pos(Target, Found)>0 then begin
      exit;
    end;
  end;
  Result := nil;
end;

procedure TMakeEditable.MakeEditableClick(Sender: TObject);

  procedure MakeFileEditable(const FileName: string);
  var
    Attributes: DWORD;
  begin
    Attributes := GetFileAttributes(PChar(FileName));
    SetFileAttributes(PChar(FileName), Attributes and not FILE_ATTRIBUTE_READONLY);
  end;

var
  FileName: string;
  FileExt: string;
  LinkedFileName: string;
  EditBuffer: IOTAEditBuffer;

begin
  EditBuffer := FEditorServices.TopBuffer;
  FileName := EditBuffer.FileName;
  if FileExists(FileName) then begin
    MakeFileEditable(FileName);
    EditBuffer.IsReadOnly := False;

    FileExt := ExtractFileExt(FileName);
    if SameText(FileExt,'.dfm') then begin
      LinkedFileName := ChangeFileExt(FileName, '.pas');
    end else if SameText(FileExt,'.pas') then begin
      LinkedFileName := ChangeFileExt(FileName, '.dfm');
    end else begin
      LinkedFileName := '';
    end;
    if (LinkedFileName<>'') and FileExists(LinkedFileName) then begin
      MakeFileEditable(LinkedFileName);
    end;
  end;
end;

var
  MakeEditableInstance: TMakeEditable;

procedure Register;
begin
  MakeEditableInstance := TMakeEditable.Create;
end;

initialization

finalization
  MakeEditableInstance.Free;

end.

当您编译并安装此软件包后,文件菜单中将会有一个新的菜单项,它可以清除输入缓冲区中的只读标志,并使文件可写。如下图所示:enter image description here

2
+1,这是展示如何使用IDE菜单构建软件包的好方法 :) - user741875
为了处理主程序/包文件,还需添加.dpr和.dpk文件检查。在这里,您还应该更改.dproj和.res文件的RO属性。 - Larsdk
@larsdk 说得好。这段代码是由我们使用遗留版本控制系统驱动的,我们从未将这些文件设置为只读。所以这就是它的存在方式。不过,我希望上面的代码提供了一个有用的模板。 - David Heffernan
1
FYI:在XE3中,我不得不更改使用条款以使用Vcl.Menus(而不是Menus - TmTron

3
您可以从工具菜单调用 .bat 文件。因此,您可以编写一个 .bat 文件来为您完成工作,并使用 $EDNAME 作为参数进行调用。 您的 .bat 文件应将文件名视为 %1。然后,您需要一点逻辑来更改只读标志(attrib 命令?),然后查看是否有 .dfm 并执行它。 如果您不熟悉 .bat 文件,则还可以制作一个 Delphi 命令行应用程序来执行此操作。 这个想法是受到这篇文章的启发,该文章介绍了如何使用 .bat 文件将 SVN 命令与 Delphi 工具菜单集成: http://delphi.wikia.com/wiki/Adding_TortoiseSVN_to_the_Tools_menu

除非您使用我知道的软件包,否则我不知道如何切换编辑器的只读标志。 - David Heffernan
OP的问题是关于更改磁盘文件的只读属性,而不是编辑器。 - Chris Thornton
从个人经验来看,其中之一缺少都是不令人满意的。 - David Heffernan
对我来说,源文件只读也不够满意。同样,没有版本控制系统也是如此。 - Chris Thornton
我同意。我最近迁移到 SVN,摆脱了这些烦恼。 - David Heffernan
显示剩余3条评论

0
另一个想法:只需在工具菜单中添加一个选项:“在此处打开命令提示符”。它可以让您从命令行执行各种操作,例如运行attrib命令。
添加一个新条目到工具菜单,并使用以下设置:
Title: Open Command Prompt Here
Program: cmd.exe
Working Dir (leave blank)
Parameters:  cd $PATH($EDNAME)

另外,为自己创建一个“在此处打开文件夹”条目:

Title: Open Folder Here
Program: explorer.exe
Working Dir (leave blank)
Parameters: $PATH($EDNAME)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接