uses ToolsAPI;procedure TForm1.Button1Click(Sender: TObject); var I,J: Integer; Svc: IOTAModuleServices; Module: IOTAModule; Editor: IOTAEditor; Result: IOTAProjectGroup; filename: string; begin if Supports(BorlandIDEServices, IOTAModuleServices, Svc) then begin for I:=0 to Svc.ModuleCount-1 do begin if Supports(Module, IOTAProjectGroup, Result) then begin Module := Svc.Modules[I]; for J:=0 to Module.ModuleFileCount-1 do begin Editor := Module.ModuleFileEditors[J]; if Supports(Editor, IOTAFormEditor, Result) then begin filename := Editor.FileName; end; end; end; end; end; Result := nil; end;
to quark: RT_RCDATA段中的PACKAGEINFO里面有。
to Elysium 你的方法好像不是很通用,不仅你的,JEDI中类似代码也有问题,我的环境是WIN2000+D7,总是返回nil
uses TypInfo;{$M+} type Ta = class(Tobject) end; {$M-}procedure TForm1.Button1Click(Sender: TObject); var a : Ta; begin ShowMessage(GetTypeData(Ta.ClassInfo)^.UnitName); end;
RTTI不是用来做这个的吧?我想也做不到。在资源里包信息里面有单元文件的名称,不知道可不可以通过这个搞定?
GetTypeData(Tform1.ClassInfo)^.UnitName
GetTypeData(form1.ClassInfo)^.UnitName
var I,J: Integer;
Svc: IOTAModuleServices;
Module: IOTAModule;
Editor: IOTAEditor;
Result: IOTAProjectGroup;
filename: string;
begin
if Supports(BorlandIDEServices, IOTAModuleServices, Svc) then
begin
for I:=0 to Svc.ModuleCount-1 do
begin
if Supports(Module, IOTAProjectGroup, Result) then
begin
Module := Svc.Modules[I];
for J:=0 to Module.ModuleFileCount-1 do
begin
Editor := Module.ModuleFileEditors[J];
if Supports(Editor, IOTAFormEditor, Result) then
begin
filename := Editor.FileName;
end;
end;
end;
end;
end;
Result := nil;
end;
RT_RCDATA段中的PACKAGEINFO里面有。
有两个前提条件:
1.使用TypInfo单元;
2.GetTypeData函数使用的参数是类或是类的实例,但该类必须是TPersistent的派生类。
uses
TypInfo;{$M+}
type
Ta = class(Tobject)
end;
{$M-}procedure TForm1.Button1Click(Sender: TObject);
var
a : Ta;
begin
ShowMessage(GetTypeData(Ta.ClassInfo)^.UnitName);
end;
ToolsAPI需要Design包支持