Создание источника для записи из Delphi IDE - PullRequest
7 голосов
/ 19 декабря 2011

Можно ли сделать исходный код только для чтения (например, .pas & .dfm) доступным для записи из Delphi IDE? Опция правой кнопки мыши, чтобы сделать файлы доступными для чтения / записи в среде IDE, не изменяет свойства файловой системы. Есть ли расширение IDE или подобное, которое может достичь этого?

Предпочтителен способ сделать это без необходимости интеграции системы контроля версий. Я использую Delphi XE и Delphi 6.

Спасибо!

1007 * сс *

Ответы [ 3 ]

8 голосов
/ 19 декабря 2011

Вот как бы я это сделал.

Создайте новый пакет, который будет установлен в 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

3 голосов
/ 19 декабря 2011

Вы можете вызвать .bat файл из меню инструментов. Таким образом, вы можете написать файл .bat, чтобы выполнить эту работу за вас, и вызвать его с параметром $ EDNAME. Ваш файл .bat должен видеть имя файла как% 1. Затем вам понадобится немного логики, чтобы изменить флаг только для чтения (команда attrib?), А затем посмотреть, есть ли файл .dfm, и сделайте то же самое.

Вы также можете (очевидно) создать приложение командной строки Delphi для этого, если вам неудобны файлы .bat.

Эта идея, вдохновленная этой статьей, в которой рассказывается, как использовать файл .bat для интеграции команд SVN с меню инструментов Delphi: http://delphi.wikia.com/wiki/Adding_TortoiseSVN_to_the_Tools_menu

0 голосов
/ 19 декабря 2011

Еще одна идея: просто добавьте опцию в меню инструментов: «откройте командную строку здесь». Он позволяет вам делать все что угодно из командной строки, например запускать команду 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...