2012-12-08 10 views
7

Mam różne definicje do obsługi różnych wersji Delphi w pliku włączającym. Obejmuje to plik "dołączony" do jednostki. Kompilator respektuje definicje podane w pliku włączającym, ale IDE nie. Powoduje to dodanie niektórych jednostek do klauzuli uses, które mogą już tam być - są zawarte w dyrektywie DEFINE kompilatora.Jak warunkowo dołączyć niektóre jednostki

W związku z tym, jeśli dodana zostanie jednostka, która nie jest dostępna w Delphi XE3, napotkasz duży problem, ponieważ jeśli IDE doda jednostkę i nie może skompilować jej z wersją Delphi XE3, która nie mieć tę jednostkę.

E.g. projekt z jedną jednostką z listą TActionList.

  1. MYINCLUDE.INC tylko jedno określenie {$DEFINE DELPHIXE3}

  2. Jednostka próbka może wyglądać

    unit Unit1; 
    
    {$I MYINCLUDE.INC}     
    
    uses 
        Winapi.Windows, 
        Winapi.Messages, 
        System.SysUtils, 
        System.Variants, 
        System.Classes, 
        Vcl.Graphics, 
        Vcl.Controls, 
        Vcl.Forms, 
        Vcl.Dialogs, 
        {$IFDEF DELPHIXE3} System.Actions, {$ENDIF} 
        Vcl.ActnList; 
        ... 
    
  3. Po udanej IDE dodaje System.Actions dodać koniec listy zastosowań, które z kolei powoduje Identyfikator ponownie zgłoszono błąd kompilatora. Jeśli go usuniesz, IDE doda go ponownie do następnego zapisu.

Po prostu zgłosiłem to do QC#111178.

Czy istnieje obejście tego błędu?

Christian

+1

IDE zawsze było trochę kiepskie warunkowe parsowania. Oczekuję, że twój raport QC zostanie zamknięty zgodnie z założeniami. Kwestia poruszana była wielokrotnie, zawsze z tą samą odpowiedzią. –

+0

IDE zawsze zniekształcone warunki w plikach * .dpk, ale ten problem jest czymś nowym i rozczarowujące. – kludg

+0

@Serg To zawsze zachowywał się w ten sposób również w plikach .pas. Nic nowego tutaj. Byłem taki od zawsze. –

Odpowiedz

3

Prawdopodobnie najprostszym rozwiązaniem jest skorzystanie z funkcji jednostka alias pomóc. Aby to zadziałało potrzebujesz różnych ustawień projektu dla różnych wersji kompilatora. Na przykład różne pliki .dpr i .dproj dla każdej obsługiwanej wersji kompilatora.

W projekcie XE2 zdefiniować alias jednostki tak:

System.Actions=Vcl.ActnList 

W projekcie XE3 pominąć ten alias.

Następnie w pliku .pas można z powodzeniem używać System.Actions bez problemów w obu wersjach Delphi.

Jeszcze prostszym rozwiązaniem jest utworzenie pustej jednostki o nazwie System.Actions, którą uwzględnisz tylko w projekcie dla wersji XE2.

+0

Tak, to brzmi jak najłatwiejsze/najczystsze obejście tego problemu. Dziękuję Ci. – Christian