宣言されていない識別子

解決


yTake  2016-05-29 04:43:50  No: 48184

基本的な事だと思うのですが、ご教授下さい。

あるプロジェクトである型が未定義(=宣言されていない識別子)とのエラーが出ます。
その型は、別のユニットで定義済みであり、uses節で参照しているはずなのですが、未定義となります。

ファイルの依存関係は次ぎの通りです。('V'はuses節で上のファイルを参照)

型を定義してあるユニット
    V
中間のユニット
    V
エラーが出るユニット

となっています。

このプロジェクトには”中間ユニット”と”型を定義してあるユニット”は登録していません。

uses節のユニット名がエラーにはなっていないので、パスは通っていて参照で来ているはずです。

にも関わらず未定義となります。

試しに、”中間ユニット”と”型を定義してあるユニット”を登録してみます。未定義エラーは無くなりませんが、ファイル検索で”未定義となる型”を検索すると定義したユニット内で見つかります。
つまり、スペルの誤りと言うわけでもありません。

ちょっと解決方法が見出せません。

よろしくお願いします。

環境は、
32bit Windows7+DELPHI XE6 + FireMonkey
です。


yTake  2016-05-29 06:37:25  No: 48185

一般的な問題ではなくて、プロジェクト固有の問題なのかもしれません。

以下例示させて頂きます。

インターネットでDELPHI用のTWAINスキャナーI/Fのライブラリーがダウンロード出来ます。

”delphitwain-kluug-1-5--2014-06-25.zip”と言うものです。

ここにFireMonky向けのサンプルプロジェクトがあります。
FireMonkeyなので、これを応用すればWindowsとMacで動作するTWAINアプリケーションを作れるのでは?と思いました。

TWIANの事がほとんど分からないので、サンプルプログラムをベースに色々試してみたいと考えています。
そこで、この一連のダウンロードにあったヘルプにあったサンプルソースを試そうとその一部をサンプルプロジェクトへ組み込んでみたところ、本件の宣言されていない識別子のエラーが出ました。

FireMonkeyのサンプルプロジェクトのUnitへ、
function GetIHighlight(Source: TTwainSource;   var Return: Extended; Mode: TRetrieveCap = rcGet):   TCapabilityRet;
var
  Value     : String;
  ItemType  : TW_UINT16;
begin
  Result := Source.GetOneValue( ICAP_HIGHLIGHT,    ItemType, Value, Mode );

  //The itemtype must be TWTY_FIX32
  if  ( Result = crSuccess ) and     ( ItemType <> TWTY_FIX32 ) then
      Result := crUnsupported;

  //If everything went ok
  if  ( Result = crSuccess ) then
      Return  := StrToFloat( Value );
end;
を、移植したところ、
TW_UINT16、ICAP_HIGHLIGHT、TWTY_FIX32が未定義です。
各々、型、定数、定数、の定義で、Twain.pasで定義されていて、DelphiTwain.pasからuses節で参照され、更にサンプルプロジェクトのユニットからuses節で参照されています。

FireMonkeyが何か影響しているのでしょうか?FireMonkeyを使うのはほぼ初めてです。

よろしくお願いします。


yTake  2016-05-29 21:03:50  No: 48186

ダウンロード元を提示していませんでした。

http://www.kluug.net/delphitwain.php
です。

サンプルプロジェクト自体はvcl版にしろFMX版にしろ、一応動作してスキャンする事は出来ています。

ただ、サンプルは非常にシンプルで各種設定などの細かい指示が例示されていません。色々と試行錯誤が必要かと思いましたが、一歩目の段階で躓いている状況です。

ダウンロード元へも問い合わせは入れているのですが、こちらでも何かアドバイスが頂ければと思いました。


Mr.XRAY  2016-05-29 21:23:23  No: 48187

解決策ではありません.
確認ですが,Twain.pas にはライブラリのパスは通っているんですよね ?


igy  2016-05-29 21:51:45  No: 48188

確認ですが、プロジェクトのUnit.pasの uses に Twain は、ありますか?


Mr.XRAY  2016-05-29 22:08:12  No: 48189

>解決策ではありません.
>確認ですが,Twain.pas にはライブラリのパスは通っているんですよね ?

失礼しました !!
uses 部でのエラーはないようですので,ライブラリのハスが通っていないということは考えられませんね.


yTake  2016-05-30 02:00:54  No: 48190

Mr.XRAYさん igyさん
ありがとうございます。

パスは最初に考えました。

具体的には、プロジェクトの"Unit1.pas"のinterface部のuses節に"DelphiTwain.pas"があり、この"DelphiTwain.pas"のinterface部のuses節に"Twain.pas"があります。

ここにエラーはありません。

TWAINのライブラリはこの他にもダウンロードして試したりしています。
なので、現状がどうなっているのかは正確には把握出来ていません。

ただ、"Twain.pas"へはパスが通っていて、サンプルプログラムでスキャンが行えているので、必要な実装は為されているものと思っています。

Twain.pasも複数存在しますが、全てに件の定義は存在していますので、内容が違うTwain.Pasを参照しているわけでもなさそうです。
なにか見落としがあるのでしょうか?


igy  2016-05-30 02:08:13  No: 48191

>具体的には、プロジェクトの"Unit1.pas"のinterface部のuses節に"DelphiTwain.pas"があり、この"DelphiTwain.pas"のinterface部のuses節に"Twain.pas"があります。

プロジェクトのUnit.pasの uses に Twain を追加してみるのは、いかがですか?


yTake  2016-05-30 04:31:13  No: 48192

ありがとうございました。

プロジェクトのUnit1.pasのuses節に"Twain"を追加したら、全て解消されました。

いまひとつ素直には納得しかねますが、多重の参照は正しく参照されないと言う事でしょうか?

とりあえず、エラーではなくなりましたので、助かりました。


通りすがり  2016-05-30 05:05:28  No: 48193

C/C++の#includeとDelphiのusesは違いますよ


yTake  2016-05-30 17:46:47  No: 48194

通りすがりさん

ご解説ありがとうございます。

自分で気付ければ良かったのですが、お騒がせ致しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加