2013-06-05 13 views
8

私はコードから単位がThe Tomes of Delphiに含まれてTDRecLstTDSplyCmを使用しようとしているが、私はTDBasics.pasでコンパイルエラーを取得:「The Tomes of Delphi」のコードをコンパイルできないのはなぜですか?

Identifier expected but 'CONST' found

私は同様のを取得しますTDStrRes.incでエラー:

Same error as above

何が問題なのですか?それを修正するにはどうすればよいですか?

The codeは、著者から入手可能です。

+1

質問はとても良いと思います。ポスターは「プログラムをコンパイルできず、理由を理解できません」。何がもっと必要ですか?追加情報があれば、可能な回答にバイアスをかけることがあります。とにかく、10に対して1は検索パス/ユニットが見つかりませんでした。たとえば、TDRecList.pasをコンパイルするには、TDBasics.pasおよびTDDefine.incファイルが検索パスに存在する必要があります。 – Igor

+0

イゴール、ありがとう!私はあまりにも理解していない...ユニットがある(私の記事のリンクを参照)。ユニットをプログラムに追加します。それは明確ですか?コードをコンパイルできません。エラー: http://i.stack.imgur.com/VIM6x.png http://i.stack.imgur.com/7i3To。png – tbutton

+2

@Igor、あなたは正解です。それは、暗闇の中でただのショットの代わりに、*役立つ*に向かってそれらを偏らせるでしょう。この質問の欠落している情報の最も基本的な部分は*エラーメッセージ*です。 –

答えて

13

あなたは明らかにDelphi 6より新しいバージョンのDelphiを使用しています。2005年に更新されているにもかかわらず、その書籍のコードはそのバージョンまでしか検出しません。 TDDefine.incは、検出するバージョンに基づいていくつかのコンパイラシンボルを定義しますが、使用しているバージョンが認識できないものであれば、シンボルと定義されています。コンパイラが次のようなコードに遭遇したときに、最終的に問題につながる。TDBasics.pas;

implementation 

uses 
    {$IFDEF Delphi1} 
    WinTypes, WinProcs; 
    {$ENDIF} 
    {$IFDEF Delphi2Plus} 
    Windows; 
    {$ENDIF} 
    {$IFDEF Kylix1Plus} 
    Types, Libc; 
    {$ENDIF} 

{$IFDEF Delphi1} 
{$R TDStrRes.r16} 
{$ENDIF} 
{$IFDEF Delphi2Plus} 
{$R TDStrRes.r32} 
{$ENDIF} 
{$IFDEF Kylix1Plus} 
{$R TDStrRes.r32} 
{$ENDIF} 

const 
    UnitName = 'TDBasics'; 

Delphi1Delphi2Plus、又はKylix1Plusのいずれも定義されていないので、uses句は空です。我々は、すべてのコンパイラディレクティブと非アクティブなコードブロックを無視すると、コンパイラは、最終的には、このようなコードを見て:

コンパイラは constの代わりに識別子を期待して文句を言う理由です
implementation 

uses 

const 
    UnitName = 'TDBasics'; 

修正するには、TDDefine.incにあなたのバージョンのDelphiを認識させる必要があります。しかし、より簡単にを無視してください。すべてのバージョン検出コードと使用しているバージョンに適用されるすべての記号をハードコードしてください。 Delphi 6より古いバージョンを使用しない限り、すべてはすべてのバージョンに適用されます。

TDDefine.pasに次のコードブロックを探す:残り$DEFINE命令が無条件に処理されるように

{$IFDEF VER140} 
    {$DEFINE Delphi6} 
    {$DEFINE Delphi1Plus} 
    {$DEFINE Delphi2Plus} 
    {$DEFINE Delphi3Plus} 
    {$DEFINE Delphi4Plus} 
    {$DEFINE Delphi5Plus} 
    {$DEFINE Delphi6Plus} 
    {$DEFINE HasAssert} 
{$ENDIF} 

は、最初と最後の行を削除します。

+0

ありがとうございます! {$ IFDEF VER150} {$ DEFINE Delphi7} {$ DEFINE Delphi1Plus} {$ DEFINE Delphi2Plus} {$ DEFINE Delphi3Plus} {$ DEFINE Delphi4Plus} {$ DEFINE Delphi5Plus} {追加する問題を解決するために$ DEFINE Delphi6Plus} {$ DEFINE HasAssert} {$ ENDIF} in TDDefine.inc(Delphi 7) – tbutton

+0

しかし、Delphi XEまたはXE4に何を追加する必要がありますか? – tbutton

+0

誰が気にしますか?本書のコードの残りの部分は、Delphiの追加バージョンをチェックすることはありません。なぜ、それらを検出するために行とコード行を追加する必要がありますか?本当に知っていなければ、[Delphiのバージョンの定義の完全なリスト](http://stackoverflow.com/q/750801/33732)をチェックし、そのコードの代わりに定義されているシンボルを使用するようにコードを適合させてください著者が選んだ。 –

関連する問題