如何将方法挂钩到 Delphi 7 IDE 中的 Edit 事件?
Posted
技术标签:
【中文标题】如何将方法挂钩到 Delphi 7 IDE 中的 Edit 事件?【英文标题】:How to hook a method to the Edit event in Delphi 7 IDE? 【发布时间】:2011-10-03 23:29:35 【问题描述】:我想在 Delphi 7 IDE 中开始编辑文件时自动签出文件。
ClearCase 是我的版本控制系统,我真的很讨厌在开始编辑之前需要签出文件。它总是打破我的思路:我正在尝试解决一个问题,找到我需要更改的地方,尝试编辑它,因为文件是只读的而失败,打开 clearcase,搜索文件,最后结帐,尝试编辑再次文件,失败,因为 IDE 仍然认为它是只读的,告诉 IDE 不是只读的。当我终于回到代码上时,我忘记了我想要做什么。
我找到了this nice and simple ClearCase IDE integration code。它可以工作,但使用了已弃用的 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 编辑事件。欢迎大家指点。
【问题讨论】:
一种可能的解决方法可能是让您的项目在 git 中管理,在本地进行更改并在一天结束时将更改推送到您的 Clearcase 存储库中。白天无需签出文件,也无需更改只读标志。您可以查看以下问题以获取更多相关信息***.com/questions/2342131/… 天哪,刚刚发现这个问题:***.com/questions/908942/… 首先,您不应该使用版本控制系统来强制您签出文件,仅仅因为有替代方案。试试 Suversion、Git、Mercurial。如果你真的被 Clearcase 卡住了,你真的不想意外检出文件,所以你不应该尝试自动检出它们。 @Cosmin:我同意你的观点,你不应该尝试自动检查东西(我实际上更喜欢强制你检查东西的 vcs)。这就是我们创建“简单”菜单专家的原因。签出文件现在是菜单项的键盘快捷方式。专家识别出它何时位于带有 dfm 的 dpr 或 pas 文件中,并且它将同时检查 dfm 和 pas,或同时检查 dpr 和 dproj(如果适用)。 @neves:快捷键在我的肌肉记忆中根深蒂固,因此检查文件不再打断我的思路。 我必须使用 ClearCase。我们仅将其用于集成;对于我们使用 Mercurial 的日常工作。 【参考方案1】:编写 API 等的替代方案是简单地使用快照视图并使用“Highjack”功能自动写入文件......然后稍后再签入。
【讨论】:
这不是我问的答案,但你是对的。劫持文件是使用 ClearCase 的唯一合理方式。【参考方案2】:或者,您可以使用打开的 ToolsAPI 来监听编辑器中的更改,并在用户更改文件中的任何内容时签出文件。
【讨论】:
以上是关于如何将方法挂钩到 Delphi 7 IDE 中的 Edit 事件?的主要内容,如果未能解决你的问题,请参考以下文章
可以将组件及其事件处理程序复制到新窗体或框架的 Delphi 6 实用程序或 IDE 专家?