如何在Delphi7IDE中将方法挂接到编辑事件?

如何在Delphi7IDE中将方法挂接到编辑事件?,delphi,ide,delphi-7,clearcase,Delphi,Ide,Delphi 7,Clearcase,当我开始在Delphi 7IDE中编辑文件时,我希望自动签出该文件 ClearCase是我的版本控制系统,我真的不喜欢在开始编辑之前签出文件。它总是打断我的思维:我试图解决一个问题,找到我需要更改的地方,尝试编辑它,失败是因为文件是只读的,打开clearcase,搜索文件,最后签出,再次尝试编辑文件,失败是因为IDE仍然认为它是只读的,告诉IDE它不是只读的。当我最终回到代码时,我忘记了我要做什么 我找到了。它可以工作,但使用了不推荐使用的ToolIntf单元。我添加了几个快捷方式。以下是它的简

当我开始在Delphi 7IDE中编辑文件时,我希望自动签出该文件

ClearCase是我的版本控制系统,我真的不喜欢在开始编辑之前签出文件。它总是打断我的思维:我试图解决一个问题,找到我需要更改的地方,尝试编辑它,失败是因为文件是只读的,打开clearcase,搜索文件,最后签出,再次尝试编辑文件,失败是因为IDE仍然认为它是只读的,告诉IDE它不是只读的。当我最终回到代码时,我忘记了我要做什么

我找到了。它可以工作,但使用了不推荐使用的ToolIntf单元。我添加了几个快捷方式。以下是它的简化版本(未尝试编译):

unitclearcase;
接口
使用ToolsApi、ToolIntf;
实施
使用
窗口、对话框、类、ExptIntf、菜单、ShellApi、SysUtils;
类型
TDelphiClearcase=类别
私有的
FClearcase菜单,
FDoCheckOutPasDfm,
FDoCheckInPasDfm:timenumitemintf;
过程执行命令(const命令:字符串;路径:PChar=nil);
公众的
毁灭者毁灭;推翻
程序DoClick(发送方:timenumitemintf);
属性ClearcaseMenu:TIMenuItemIntf读取FClearcaseMenu写入FClearcaseMenu;
属性DoCheckOutPasDfm:timenumitemintfwrite FDoCheckOutPasDfm;
属性DoCheckInPasDfm:timenumitemintfwrite FDoCheckInPasDfm;
结束;
变量
dcc:TDelphiClearcase=nil;
{TDelphiClearcase}
销毁器TDelphiClearcase.销毁;
程序删除(项目:TIMenuItemIntf);
开始
如果(项目=无),则
出口
item.MenuItem;
自由零(项目);
结束;
开始
移除(FDoCheckOutPasDfm);
移除(FDoCheckInPasDfm);
继承;
结束;
程序TDelphiClearcase.DoClick(发送方:TIMenuItemIntf);
函数GetPasDfm(const f:string):string;
变量
aux:字符串;
开始
aux:=副本(f,1,长度(f)-4);
结果:=aux+'.pas'+'+aux+'.dfm'
结束;
变量
命令,文件名:string;
开始
文件名:=ToolServices.GetCurrentFile;
如果(发送方=FDoCheckOutPasDfm),则
命令:='cleartoolco'+GetPasDfm(文件名)
否则,如果(发送方=FDoCheckInPasDfm),则
命令:='cleartoolci'+GetPasDfm(文件名);
ExecCommand(命令);
ToolServices.ReloadFile(文件名);
结束;
过程TDelphiClearcase.ExecCommand(const命令:字符串;路径:PChar);
变量
pi:t过程信息;
stinfo:TStartupInfo;
开始
FillChar(stinfo,SizeOf(stinfo),0);
stinfo.cb:=SizeOf(stinfo);
如果(CreateProcess(nil,PChar(命令)),nil,nil,True,创建新控制台,
nil,path,stinfo,pi)然后开始
WaitForSingleObject(pi.hProcess,无限);
CloseHandle(pi.hProcess)
结束
结束;
程序菜单;
变量
服务:服务;;
开始
如果(borlandiservices=nil),则
出口
服务:=工具服务;
如果(服务=零),则
出口
dcc:=TDelphiClearcase.Create;
dcc.ClearcaseMenu:=services.GetMainMenu.GetMenuItems.InsertItem(6,
“C&learcase”、“ClearCase菜单”、“ClearcaseTools”、0、0、0、,
[mfEnabled,mfVisible],无);
dcc.DoCheckOutPasDfm:=dcc.ClearcaseMenu.InsertItem(2,
“签出pas和dfm”、“DoCheckOutPasDfm”、“撤消签出”、快捷方式(Ord(“>”),
[ssCtrl]),0,2,
[mfEnabled,mfVisible],dcc.DoClick);
dcc.DoCheckInPasDfm:=dcc.ClearcaseMenu.InsertItem(4,

“签入pas和dfm”、“DoCheckInPasDfm”、“签入当前文件”、快捷方式(Ord(a)编写API或类似程序的固有方式是只使用快照视图,并使用“Highjack”自动编写文件功能性…然后稍后将其签入。

或者,当用户更改了文件中的任何内容时,您可以使用open ToolsAPI来侦听编辑器中的更改并签出文件。

一种可能的解决方法可能是使用git管理项目,在本地进行更改,并将更改推到最后您可以查看以下问题以获取更多相关信息Holy sh*t刚刚发现了这个问题:首先,您不应该使用版本控制系统强制您签出文件,因为存在重新选择。试试Suversion、Git、Mercurial。如果你真的被Clearcase困住了,你真的不想意外地签出文件,所以你不应该尝试自动签出它们。@Cosmin:我同意你不应该尝试自动签出内容(实际上我更喜欢迫使你签出内容的vcs).这就是为什么我们创造了一个“简单的”菜单专家。签出文件现在只需键盘快捷键即可进入菜单项。专家可以识别文件位于dpr或带有dfm的pas文件中,并将同时签出dfm和pas,或同时签出dpr和dproj(如果适用)。@neves:快捷键已嵌入我的肌肉记忆中,因此签出文件不再中断我的工作流程我想。我必须使用ClearCase。我们使用它只是为了集成;对于日常工作,我们使用Mercurial。这不是我问的答案,但你是对的。被劫持的文件是使用ClearCase的唯一合理方式。
unit clearcase;

interface
uses ToolsApi, ToolIntf;

implementation
uses
  Windows, Dialogs, Classes, ExptIntf, Menus, ShellApi, SysUtils;

type
  TDelphiClearcase = class
  private
    FClearcaseMenu,
    FDoCheckOutPasDfm,
    FDoCheckInPasDfm : TIMenuItemIntf;

    procedure ExecCommand(const command: string; path: PChar = nil);
  public
    destructor Destroy;override;
    procedure DoClick(Sender: TIMenuItemIntf);
    property ClearcaseMenu: TIMenuItemIntf read FClearcaseMenu write FClearcaseMenu;
    property DoCheckOutPasDfm:TIMenuItemIntf write FDoCheckOutPasDfm;
    property DoCheckInPasDfm: TIMenuItemIntf write FDoCheckInPasDfm;
  end;

var
  dcc: TDelphiClearcase = nil;

{ TDelphiClearcase }

destructor TDelphiClearcase.Destroy;
  procedure Remove(item: TIMenuItemIntf);
  begin
    if( item = nil )then
      Exit;
    item.DestroyMenuItem;
    FreeAndNil(item);
  end;
begin
  Remove(FDoCheckOutPasDfm);
  Remove(FDoCheckInPasDfm);
  inherited;
end;

procedure TDelphiClearcase.DoClick(Sender: TIMenuItemIntf);
  function GetPasDfm(const f: string): string;
  var
    aux: string;
  begin
    aux := Copy(f, 1, Length(f) - 4);
    Result := aux + '.pas' + ' ' + aux + '.dfm'
  end;

var
  command, fileName  : string;
begin
  fileName := ToolServices.GetCurrentFile;

  if( Sender = FDoCheckOutPasDfm )then
    command := 'cleartool co ' + GetPasDfm(fileName)
  else if( Sender = FDoCheckInPasDfm )then
    command := 'cleartool ci ' + GetPasDfm(fileName);

  ExecCommand(command);

  ToolServices.ReloadFile(fileName);

end;

procedure TDelphiClearcase.ExecCommand(const command: string; path: PChar);
var
  pi  : TProcessInformation;
  stinfo : TStartupInfo;
begin
  FillChar(stinfo, SizeOf(stinfo), 0);
  stinfo.cb := SizeOf(stinfo);

  if( CreateProcess(nil, PChar(command), nil, nil, True, CREATE_NEW_CONSOLE,
      nil, path, stinfo, pi) )then begin
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess)
  end
end;

procedure CreateMenus;
var
  services: TIToolServices;
begin
  if( BorlandIDEServices = nil )then
    Exit;
  services := ToolServices;

  if( services = nil )then
    Exit;

  dcc := TDelphiClearcase.Create;

  dcc.ClearcaseMenu := services.GetMainMenu.GetMenuItems.InsertItem(6,
    'C&learcase', 'ClearcaseMenu', 'ClearcaseTools', 0, 0, 0,
    [mfEnabled, mfVisible], nil);


  dcc.DoCheckOutPasDfm := dcc.ClearcaseMenu.InsertItem(2,
    'Check Out pas and dfm', 'DoCheckOutPasDfm', 'Undo the check outs', ShortCut(Ord('>'),
    [ssCtrl]), 0, 2,
    [mfEnabled, mfVisible], dcc.DoClick);
  dcc.DoCheckInPasDfm:= dcc.ClearcaseMenu.InsertItem(4,
    'Check In pas and dfm', 'DoCheckInPasDfm', 'Check in current files', ShortCut(Ord('<'),
    [ssCtrl]), 0, 2,
    [mfEnabled, mfVisible], dcc.DoClick);

end;

procedure DestroyMenus;
begin
  FreeAndNil(dcc);
end;

initialization
  CreateMenus;

finalization
  DestroyMenus
end.