怎样实现Delphi7的IDE的标题栏中显示打开工程的完整路径?

lcmlhs_2005 2012-08-23 09:36:27
如题:
delphi IDE开发环境中怎样显示出打开工程的完整路径,最好在IDE环境中的主窗体的标题栏上显示出来,因为这样一看就知道工程文件所在的路径,很方便。
...全文
2631 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcmlhs_2005 2012-12-31
  • 打赏
  • 举报
回复
楼上的很不错,多给你点儿分
蓝色光芒 2012-12-29
  • 打赏
  • 举报
回复
佩服搂主的精神,执着追求源代码的精神...!! 首先把 $(DELPHI)\Source\ToolsAPI 加入到搜索搜索路径中, 把以下代码复制到一个单元中并保存为IDEShowPath.pas; 然后点菜单 Component -> Install Component... 弹出的窗口中,Package file name中选择 ???\borland\delphi7\Lib\dclusr.dpk,这个是用户自定义包,方便搞的, 然后在Unit file name 一栏中,选择刚才保存的文件IDEShowPath.pas,然后点OK 询问是否重新编译,选择YES,然后关闭Delphi 7,关闭过程中,选择保存 dclusr 以后所有已经保存的工程就会在标题上显示全路径了.
//在Delphi 7的IDE的主窗口中显示项目全路径
//由于使用了固定名称,所以只能在Delphi7中使用,其他版本自行调整
//By 蓝色光芒
unit IDEShowPath;

interface

procedure Register;

implementation

{$IFDEF VER150}        //只有Delphi 7.0用,其它版本相应调整
Uses
  Windows, Messages, Forms, Classes, SysUtils , ToolsAPI;

Type
  TNotifyOTAObject = class(TNotifierObject, IOTANotifier, IOTAIDENotifier)
  protected
    procedure FileNotification(NotifyCode: TOTAFileNotification;
      const FileName: string; var Cancel: Boolean);
    procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); overload;
    procedure AfterCompile(Succeeded: Boolean); overload;

    procedure HwndProc(var Message: TMessage);
  end;

var
  Obj : TNotifyOTAObject;
  fOldHwndProc : TWndMethod;
  fFileName : String;
  liIndex : integer;

procedure SetTextProc(var Message: TMessage);
var
  fCaption : String;
  PJ : IOTAProject;
begin
  PJ := GetActiveProject;
  if PJ<>NIL then fCaption := 'Delphi 7 - ' + PJ.FileName
  else if StrScan(PChar(Message.LParam) , '-')=NIL then fCaption := 'Delphi 7'
  else fCaption := 'Delphi 7 - ' + fFileName;
  Message.LParam := integer(fCaption);
  fOldHwndProc(Message);
end;

{ TNotifyOTAObject }
procedure TNotifyOTAObject.HwndProc(var Message: TMessage);
begin
  if Message.Msg=WM_SETTEXT then SetTextProc(Message)
  else fOldHwndProc(Message);
end;


procedure TNotifyOTAObject.AfterCompile(Succeeded: Boolean);
begin
end;
procedure TNotifyOTAObject.BeforeCompile(const Project: IOTAProject;var Cancel: Boolean);
begin
end;
procedure TNotifyOTAObject.FileNotification(NotifyCode: TOTAFileNotification;
  const FileName: string; var Cancel: Boolean);
begin
  if NotifyCode=ofnActiveProjectChanged then
    fFileName := FileName;
end;

procedure Register;
begin
  Obj := TNotifyOTAObject.Create;
  fOldHwndProc := Application.MainForm.WindowProc;
  Application.MainForm.WindowProc := Obj.HwndProc;
  liIndex := (BorlandIDEServices as IOTAServices).AddNotifier(Obj);
end;

initialization
finalization
  Application.MainForm.WindowProc := fOldHwndProc;
  (BorlandIDEServices as IOTAServices).RemoveNotifier(liIndex);
{$ELSE}
procedure Register;
begin
end;
{$ENDIF}
end.
XStar2008 2012-12-28
  • 打赏
  • 举报
回复
楼主真执着呀
CCDDzclxy 2012-12-28
  • 打赏
  • 举报
回复
引用 72 楼 taixinltd 的回复:
编写一个组件: Txxxx= class(TTimer) private procedure WndProc(var Msg: TMessage); public constructor Create(AOwner: TComponent);override; destructor Destroy; override; end; constru……
没看明白怎么用??能在 delphi32.exe 中运行??
taixinltd 2012-12-28
  • 打赏
  • 举报
回复
编写一个组件: Txxxx= class(TTimer) private procedure WndProc(var Msg: TMessage); public constructor Create(AOwner: TComponent);override; destructor Destroy; override; end; constructor Txxxx.Create(AOwner: TComponent); begin ... if not (csDesigning in ComponentState) then begin FmyHandle := AllocateHWnd(WndProc); if SetTimer(FmyHandle , 1, 1000,nil) = 0 then raise EOutOfResources.Create('error '); end; end; destructor Txxxx.Destroy; begin if not (csDesigning in ComponentState) then begin KillTimer(FMyHandle, 1); DeallocateHWnd(FMyHandle); end; inherited Destroy; end; procedure Txxxx.WndProc(var Msg: TMessage); var apptitle:string; len:integer; begin if (Msg.Msg = WM_TIMER) then try apptitle:=Application.Title; len:=length(apptitle); if (len<FcmTitleSize)or(copy(apptitle,Len+1-FcmTitleSize,FcmTitleSize)<>FcmTitle)then Application.Title:=apptitle+"你的路径,自己想办法获取了!"; except Application.HandleException(Self); end else Msg.Result := DefWindowProc(FMyHandle, Msg.Msg, Msg.wParam, Msg.lParam); end;
CCDDzclxy 2012-12-28
  • 打赏
  • 举报
回复
引用 68 楼 andrew57 的回复:
是在另一个进程中控制的。不是打开工程直接出来的。
你的这个字符串"C:\Program Files\Borland\Delphi7\Projects\Project1.exe" 是从哪里得来的? 是从 delphi32.exe 进程里面取到的?还是自己手工输入,然后再SendMessage???
lcmlhs_2005 2012-12-28
  • 打赏
  • 举报
回复
这个问题难道要到2013年才能解决吗?是本年度的最难一问????
dusttosky 2012-12-20
  • 打赏
  • 举报
回复
同问 1
UnkownState 2012-12-20
  • 打赏
  • 举报
回复
是在另一个进程中控制的。不是打开工程直接出来的。
UnkownState 2012-12-20
  • 打赏
  • 举报
回复
引用 66 楼 lcmlhs_2005 的回复:
引用 59 楼 andrew57 的回复: 你是怎样做到的,分享一下啊
FindWindow SendMessage(handle, WM_SETTEXT, 0, 字符串地址)
lcmlhs_2005 2012-12-20
  • 打赏
  • 举报
回复
引用 59 楼 andrew57 的回复:
你是怎样做到的,分享一下啊
lcmlhs_2005 2012-12-15
  • 打赏
  • 举报
回复
如果不能达到我的满意,我永远不结贴,也会让我的后人顶这个帖
阚雷--闞靁 2012-12-14
  • 打赏
  • 举报
回复
我也受够了这个折磨
CCDDzclxy 2012-12-14
  • 打赏
  • 举报
回复
引用 61 楼 andrew57 的回复:
SendMessage(WM_SETTEXT)。不过改变ide的title不行哦。有个0x00AE消息不知道什么消息
那这个路径是怎么获得的呢?不会是自己手输的吧.........
luxuewei5214 2012-12-14
  • 打赏
  • 举报
回复
Project Manager是个比较好的解决方法,并且可以在一个IDE实例里管理多个project。实在达不到你的要求就自己想办法解决,解决不了就一边失望去吧
UnkownState 2012-12-14
  • 打赏
  • 举报
回复
引用 60 楼 CCDDzclxy 的回复:
引用 59 楼 andrew57 的回复: 这个是怎么弄的啊?
SendMessage(WM_SETTEXT)。不过改变ide的title不行哦。有个0x00AE消息不知道什么消息
CCDDzclxy 2012-12-13
  • 打赏
  • 举报
回复
引用 59 楼 andrew57 的回复:
这个是怎么弄的啊?
UnkownState 2012-12-13
  • 打赏
  • 举报
回复
q34098 2012-12-13
  • 打赏
  • 举报
回复
Delphi的代码分页上面,右键鼠标。
lcmlhs_2005 2012-12-13
  • 打赏
  • 举报
回复
楼上的,你是怎样做到的?是在Delphi7里实现的吗?
加载更多回复(55)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧