如何在Delphi 7 IDE中将方法挂接到Edit事件?
我想在Delphi 7 IDE中开始编辑文件时自动检出一个文件。
ClearCase是我的版本控制系统,我真的很讨厌在开始编辑之前需要检出一个文件。 它总是打破我的思想stream:我试图解决一个问题,find我需要改变的地方,尝试编辑它,失败,因为文件是只读的,打开clearcase,search文件,最后结帐,尝试编辑文件再次失败,因为IDE仍然认为它是只读的,告诉不是只读的IDE。 当我终于回到代码,我忘记了我正在尝试做什么。
我发现了这个漂亮而简单的ClearCase IDE集成代码 。 它工作,但使用不赞成的ToolIntf单位。 我已经添加了几个快捷键。 这里是它的简化版本 (没有尝试编译):
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.
我想在第一次开始编辑时检出文件,而且只读。 我不知道如何挂钩一个文件的IDE编辑事件的function。 任何指针都是受欢迎的。
编写API或类似的替代方法是简单地使用快照视图并使用“Highjack”function自动编写文件…然后在稍后检查。
或者,您可以使用打开的ToolsAPI来监听编辑器中的更改,并在用户更改文件中的任何内容时检出文件。