基本的な事だと思うのですが、ご教授下さい。
あるプロジェクトである型が未定義(=宣言されていない識別子)とのエラーが出ます。
その型は、別のユニットで定義済みであり、uses節で参照しているはずなのですが、未定義となります。
ファイルの依存関係は次ぎの通りです。('V'はuses節で上のファイルを参照)
型を定義してあるユニット
V
中間のユニット
V
エラーが出るユニット
となっています。
このプロジェクトには”中間ユニット”と”型を定義してあるユニット”は登録していません。
uses節のユニット名がエラーにはなっていないので、パスは通っていて参照で来ているはずです。
にも関わらず未定義となります。
試しに、”中間ユニット”と”型を定義してあるユニット”を登録してみます。未定義エラーは無くなりませんが、ファイル検索で”未定義となる型”を検索すると定義したユニット内で見つかります。
つまり、スペルの誤りと言うわけでもありません。
ちょっと解決方法が見出せません。
よろしくお願いします。
環境は、
32bit Windows7+DELPHI XE6 + FireMonkey
です。
一般的な問題ではなくて、プロジェクト固有の問題なのかもしれません。
以下例示させて頂きます。
インターネットで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を使うのはほぼ初めてです。
よろしくお願いします。
ダウンロード元を提示していませんでした。
”http://www.kluug.net/delphitwain.php”
です。
サンプルプロジェクト自体はvcl版にしろFMX版にしろ、一応動作してスキャンする事は出来ています。
ただ、サンプルは非常にシンプルで各種設定などの細かい指示が例示されていません。色々と試行錯誤が必要かと思いましたが、一歩目の段階で躓いている状況です。
ダウンロード元へも問い合わせは入れているのですが、こちらでも何かアドバイスが頂ければと思いました。
解決策ではありません.
確認ですが,Twain.pas にはライブラリのパスは通っているんですよね ?
確認ですが、プロジェクトのUnit.pasの uses に Twain は、ありますか?
>解決策ではありません.
>確認ですが,Twain.pas にはライブラリのパスは通っているんですよね ?
失礼しました !!
uses 部でのエラーはないようですので,ライブラリのハスが通っていないということは考えられませんね.
Mr.XRAYさん igyさん
ありがとうございます。
パスは最初に考えました。
具体的には、プロジェクトの"Unit1.pas"のinterface部のuses節に"DelphiTwain.pas"があり、この"DelphiTwain.pas"のinterface部のuses節に"Twain.pas"があります。
ここにエラーはありません。
TWAINのライブラリはこの他にもダウンロードして試したりしています。
なので、現状がどうなっているのかは正確には把握出来ていません。
ただ、"Twain.pas"へはパスが通っていて、サンプルプログラムでスキャンが行えているので、必要な実装は為されているものと思っています。
Twain.pasも複数存在しますが、全てに件の定義は存在していますので、内容が違うTwain.Pasを参照しているわけでもなさそうです。
なにか見落としがあるのでしょうか?
>具体的には、プロジェクトの"Unit1.pas"のinterface部のuses節に"DelphiTwain.pas"があり、この"DelphiTwain.pas"のinterface部のuses節に"Twain.pas"があります。
プロジェクトのUnit.pasの uses に Twain を追加してみるのは、いかがですか?
ありがとうございました。
プロジェクトのUnit1.pasのuses節に"Twain"を追加したら、全て解消されました。
いまひとつ素直には納得しかねますが、多重の参照は正しく参照されないと言う事でしょうか?
とりあえず、エラーではなくなりましたので、助かりました。
C/C++の#includeとDelphiのusesは違いますよ
通りすがりさん
ご解説ありがとうございます。
自分で気付ければ良かったのですが、お騒がせ致しました。
ツイート | ![]() |