为了解决这个问题,我通常使用记事本创建新的.pas文件,并手动将其添加到.dpr文件中。如果我需要一个窗体,我使用“文件”->“新建”->“窗体”,然后将.dpr文件恢复到以前的版本。如果您问我,这不是非常快速应用程序设计(RAD);-)
您如何处理这个问题?有没有一种方法可以在IDE中添加单元并保留IFDEF?
有时我会创建一个单元,专门用作放置所有IFDEF和其他IDE可能会搞砸的内容的地方。这个单元通常放在dpr的uses子句的顶部。这个技巧并不能适用于所有情况,但有时可以节省很多繁琐的工作。
我花了很长时间才明白这个问题,
最终我为每种构建类型准备了一个项目文件(.dpr), 在项目|项目选项|目录/条件中设置条件, 只将我想要添加到项目中的单元添加进去。
这样做的缺点是,如果你在.dpr中有自定义代码,当它发生变化时,必须手动复制到其他项目文件中。
正如Rob Kennedy所指出的,可以通过将自定义代码放入其自己的单元中,并调用单个过程来处理。从而最小化.dpr代码大小/需要进行的更改。
另外,你还能获得额外的好处,如果你将所有的.dpr文件添加到一个项目组中,你可以通过一个点击或命令行来构建所有不同版本。
我不在dpr文件中放置任何ifdefs。如果我想在项目中根据某些条件使用不同的单元/窗体,我会将项目拆分为两个。
TYPE
TMySpecialFormClass : class of TForm;
VAR
TMySpecialForm : TMySpecialFormClass;
3) 创建另一个单元,其中包含所有的IFDEF。它可能看起来像以下内容:
Unit uRegisterSpecialForms;
interface
uses
{$IFDF SPECIAL1}
uSpecial1,
{$ENDIF}
{$IFDEF SPECIAL2}
uSpecial2,
{$ENDIF}
uSpecialParent;
implementation
// no code needed.
initialization
{$IFDEF SPECIAL1}
TMySpecialForm := uSpecial1.TSpecialForm1;
{$ENDIF}
{$IFDEF SPECIAL2}
TMySpecialForm := uSpecial2.TSPecialForm2;
{$ENDIF}
end.
4) 在您的代码中引用此内容,您只需要在请求特殊表单的单元中添加uSpecialParent,然后动态创建它。例如,要显示此模态框,您可以调用以下内容:
var
frm : TForm;
begin
frm := TMySpecialForm.Create(nil);
try
frm.showmodal;
finally
frm.free;
end;
end;
为了完整起见,这里提供一种低技术的方法:
当IDE再次搞乱你的uses子句后:
(Delphi 7)
我刚刚尝试了一下。 看看第一个代码版本和我的下面的评论:
program Project1;
{$IFDEF TESTIFDEF}
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$ELSE}
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$ENDIF TESTIFDEF}
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
在那时,我刚刚插入了第二个窗体并注意到相应的单元(Unit2.pas)被插入到IFDEF的第一部分中,即在“TESTIFDEF”标记的部分内 - 因此未覆盖第二个块({$ELSE}之后)。
因此,您的解决方案应该是:
因此,它应该看起来像这样:
program Project1;
{$DEFINE MYCONFIG1} // THIS ONE IS NOW ACTIVE
{$IFDEF DELPHIBASISCONFIGURATION}
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3};
{$ELSE}
// THIS IS A "COMMON TO ALL CONFIG" PART
uses
Forms,
// FIRST CONFIGURATION
{$IFDEF MYCONFIG1}
Unit1 in 'Unit1.pas' {Form1},
Unit3 in 'Unit3.pas' {Form3}
{$ENDIF MYCONFIG1}
// SECOND CONFIGURATION
{$IFDEF MYCONFIG2}
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2}
{$ENDIF MYCONFIG2}
// THIS IS THE "COMMON TO ALL CONFIG" END :)
;
{$ENDIF TESTIFDEF}
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
//Application.CreateForm(TForm3, Form3);
//Application.CreateForm(TForm2, Form2);
Application.Run;
end.
正如您所看到的,我已经放弃了对Form2和Form3的Application.CreateForm(...)调用。
在我看来,通常最好在真正需要这些补充窗体的时候动态创建它们,即不是在程序启动时创建所有窗体...