你如何处理.dpr使用部分中的IFDEF

时间:2009-04-16 21:05:53

标签: delphi

无论何时向项目添加新单元,Delphi都会重建.dpr文件,并且使用部分中的所有IFDEF都将消失。

要解决此问题,我通常使用NotePad创建新的.pas文件,并手动将其添加到.dpr中。如果我需要表单,我使用File-> New-> Form,然后将.dpr文件还原为以前的版本。如果你问我,不是很好; - )

你是如何处理的?有没有办法在保留IFDEF的同时在IDE中添加一个单元?

7 个答案:

答案 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再次搞砸了您的使用条款后:

  1. 关闭项目
  2. 转到您选择的版本控制工具,并针对最新的签到区分DPR 版本使用支持合并的差异工具,如WinMerge
  3. 还原IDE更改
  4. 保存DPR
  5. 继续吧

答案 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}之后)。

因此,您的解决方案应该是:

  1. 定义一个IFDEF语句,例如“{$ IFDEF DELPHIBASISCONFIGURATION}”代替我的“{$ IFDEF TESTIFDEF}”,其中将添加所有表格。
  2. 为您要使用的不同配置定义尽可能多的替代LABEL。
  3. 每次将表单添加到项目中时,请将第一个块的插入行复制到下面的相应块中 - 具体取决于您的需求...
  4. 使用define语句或选项对话框
  5. 激活所需的配置
  6. 永远不要定义“DELPHIBASISCONFIGURATION”;)
  7. 因此,它应该是这样的:

    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(...)的调用。

    恕我直言,通常最好在您真正需要时动态创建补充表格,即不是程序启动时的所有表格......