加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使源可以从Delphi IDE中写入

发布时间:2020-12-15 04:15:04 所属栏目:大数据 来源:网络整理
导读:是否可以在Delphi IDE中编写只读源代码(例如,.pas .dfm)?右键单击选项可在IDE中生成文件Readonly / Writable,但不会更改文件系统上的属性.是否有IDE扩展或类似可以实现此目的? 在不必集成源控制系统的情况下执行此操作的方法将是优选的.我使用的是Delphi X
是否可以在Delphi IDE中编写只读源代码(例如,.pas& .dfm)?右键单击选项可在IDE中生成文件Readonly / Writable,但不会更改文件系统上的属性.是否有IDE扩展或类似可以实现此目的?

在不必集成源控制系统的情况下执行此操作的方法将是优选的.我使用的是Delphi XE和Delphi 6.

谢谢!

上证

解决方法

我就是这样做的.

创建一个新的包,它将在设计时安装到IDE中.如果你有一个现有的包方便,那么你可以继续使用它.确保包装需要指定包装.您可以在项目管理器中执行此操作,或者仅通过查看项目源并将requireide添加到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)),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.

当您编译并安装此软件包时,您现在将在“文件”菜单上有一个新菜单项,它既清除输入缓冲区中的只读标志,又使文件可写.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读