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