旧Delphi FAQ - COM

Abstract: このQ&Aは、旧www.borland.co.jp に掲載されていた記事を転載したものです。記事は掲載時点の情報をあるがままに掲載しており、新バージョンでのご利用においては、コンポーネントやAPIの仕様変更等によりご利用いただけない場合がありますのでご留意ください。

    FileSeek の Help の例実行でコンパイルエラー

該当するバージョン:Delphi 1.0

Q:
FileSeek 関数の Help の例を実行したところ,HFILE_ERROR が未定義の識別子だとコンパイルエラーになったのですが何故ですか。

   if FileSeek(MyFileHandle,0,2) = HFILE_ERROR then
      HandleFileError
   else
      AppendStuff;

A:
Delphi 1.0 では HFILE_ERROR は定義されていませんので,-1 と比較してください。

    プログラムでリソースを読み込めません。

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Windows API でリソースを使うために,アプリケーションのリソース(.RES)を編集しているのですが,プログラムでリソースを読み込めません。

A:
プロジェクトソース(.DPR)と同名のリソースファイル(.RES) は,Delphi によって自動的に更新されてしまいます。別のファイル名でリソースを作成し,{$R} コンパイル指令で指定してください。

    コンパイルされた Delphi のバージョンを取得

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Delphi のバージョンによって条件コンパイルを行いたいのですが, そのためにはどのようなシンボルを参照すればいいでしょうか?

A:
Delphi 自身のバージョンを現すシンボルはありませんが、Delphi が使用するパスカルコンパイラのバージョンを参照することで, 対応できます。

Delphi の各バージョンで以下の条件シンボルが定義されています。

  ・VER80  - Delphi 1.0
  ・VER90  - Delphi 2.0
  ・VER93  - C++Builder 1.0
  ・VER100 - Delphi 3.x
  ・VER110 - C++Builder 3.0
  ・VER120 - Delphi 4.0
  ・VER125 - C++Builder 4.0

たとえば以下のコードは,Delphi2 と Delphi3 それぞれにおいて,正しくコンパイルされます。

   {$IFDEF VER90}
   uses sysytem, windows, oleauto;
   {$ENDIF}

   {$IFDEF VER100}
   uses sysytem, windows, comobj;
   {$ENDIF}

    Delphi 2 のコンポーネントを Delphi 3 のパッケージにインストールするとエラー

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Delphi 2 のコンポーネントを Delphi 3 のパッケージにインストールすると PAS ソースコードが見つからないといわれてしまいます。

A:
Delphi の .DCU ファイルは基本的に異なるバージョン間での互換性がありません。
そのため .DCU 単独ではインストールできません。問題を解決するには

  1. コンポーネントの作成元から 対象となる Delphi 3 で再コンパイルした .DCU を手に入れる。
  2. コンポーネントのソースコードが手に入る場合は,自分で再コンパイルする。

どちらかの対応が必要になります。

    コンパイル時の [ヒント] を抑止する方法 (99/6/4)

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
コンパイル時の [ヒント] を抑止できますか?

A:
プロジェクトオプションの [コンパイラ] ページで [ヒントを表示(N)]のチェックを外せば, ヒントは表示されなくなります。
この方法では, プロジェクト全体が対象となりますが, プロジェクト中の一部分だけに適用したい場合などは, {$HINTS} 指令を使って, 例えば以下のようにします。

{$HINTS OFF}
procedure TForm1.Button1Click(Sender: TObject);
var
  d: TDate;
begin
  try
    d := StrToDate(Edit1.Text);
  except
  on E: Exception do
    ShowMessage('無効な日付です');
  end;
end;
{$HINTS ON}

デバッグ用に関数の戻り値をチェックするなどの場合を除き, このようなコンパイラ指令による抑止を行なうよりも, 不要な代入や, 不要な変数宣言を削除して, [ヒント] そのものを表示されなくなるようコーディングされることを推奨します。 そのほうが本質的な解決です。
同様に [警告] を抑止するには, {$WARNINGS} 指令を使います。