无论何时向项目添加新单元,Delphi都会重建.dpr文件,并且使用部分中的所有IFDEF都将消失。
要解决此问题,我通常使用NotePad创建新的.pas文件,并手动将其添加到.dpr中。如果我需要表单,我使用File-> New-> Form,然后将.dpr文件还原为以前的版本。如果你问我,不是很好; - )
你是如何处理的?有没有办法在保留IFDEF的同时在IDE中添加一个单元?
答案 0 :(得分:9)
有时候我会专门创建一个单元来作为所有IFDEF和其他东西的地方,如果它在dpr中,IDE就会搞乱。该单元通常位于dpr的uses子句的顶部。这个技巧不适合所有场景,但它有时会节省大量繁琐的工作。
答案 1 :(得分:3)
我花了很长时间试图解决这个问题,
我最终为每个构建类型都有一个项目文件(.dpr), 使用项目|项目选项|目录/条件中的条件 并且只有我想要添加到项目中的单位
这个剂量的缺点是,如果.dpr中有自定义代码,则必须在更改时手动将其复制到其他项目文件中。
如Rob Kennedy所指出的,这可以通过将自定义代码放入其自己的单元来处理,该单元由单个过程调用。从而最小化.dpr代码大小/要做的更改另外,您获得的另一个好处是,如果您将所有.dpr文件添加到项目组,只需单击一次/ cmd行即可构建所有您的不同版本
答案 2 :(得分:3)
我没有将任何ifdef放入dpr文件中。如果我想在项目中使用不同的单位/表格,根据某些条件,我将项目分成两部分。
答案 3 :(得分:2)
您可以在IDE中手动添加它。 (使用项目中的“查看源”选项)。
通常dpr是“隐藏的”。你不应该在那里改变任何东西。 如果你这样做,你最好确保所有的更改都是手动的,否则你会丢失一些信息。
答案 4 :(得分:1)
对于表单,数据模块和其他包含单个类的单元,通过这些单元将替换功能,解决方案相当简单。只是不要将自定义单位直接添加到产品中,而是将它们保存在搜索路径中的某个位置(或修改项目搜索路径以包含其位置)。
1)创建一个新单元,其中包含所有其他类的父单元,或者它们都将实现的接口(我通常更喜欢后者,因为它允许更容易的自定义)[例如,这称为uSpecialParent .PAS]
2)添加一个类变量,该变量将在您需要创建新功能时引用。例如,如果你只是要向modal展示一堆表格,那么不关心任何其他方法,那么你可以有一个如下所示的变量:
TYPE
TMySpecialFormClass : class of TForm;
VAR
TMySpecialForm : TMySpecialFormClass;
3)创建另一个包含所有IFDEFS的单元。它看起来像下面这样:
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;
答案 5 :(得分:1)
这是完全性的低技术方法:
IDE再次搞砸了您的使用条款后:
答案 6 :(得分:0)
(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(...)的调用。
恕我直言,通常最好在您真正需要时动态创建补充表格,即不是程序启动时的所有表格......