旧Delphi FAQ - ActiveX

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

    ChartFX のインストールについて

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

Q:
ChartFX を使用したアプリケーションを別のマシンにインストールした場合,エラーが発生して動作しません。インストールしただけではレジストリの情報が登録されません。

A:
はじめに,CFX32.OCX を C:\Windows\System にコピーしてください。
次に,Delphi 2.0J で作成した以下のプログラムを実行して,レジストリに必要な情報を登録してください。

unit Install_;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ole2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
const
  OCXName = 'CFX32.OCX';
var
  hOCX: THandle;
  RegFunc: function: HResult; stdcall;
begin
  if Failed(OleInitialize(nil)) then
    Exit;
  hOCX := LoadLibrary(PChar(OCXName));
  if hOCX = 0 then begin
    OleUninitialize;
    ShowMessage(OCXName + 'が見つかりません');
    Exit;
  end;
  @RegFunc := GetProcAddress(hOCX, PChar('DllRegisterServer'));
  if (@RegFunc <> nil) and Succeeded(RegFunc) then
    ShowMessage(OCXName + 'を導入しました')
  else
    ShowMessage(OCXName + 'の導入に失敗しました');
  FreeLibrary(hOCX);
  OleUninitialize;
end;

end.

    VBX を使ったアプリケーションとともに配布すべきファイル

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

Q:
VBX を使ってアプリケーションを開発しましたが,アプリケーションとともにどんなファイルを配布すべきでしょうか?

A:
VBX を使っている場合は,その VBX ファイルと Windows の SYSTEM ディレクトリにある BIVBX11.DLL を配布する必要があります。BIVBX11.DLL は,Delphi で VBX を使って作成したアプリケーションとともに再配布できます。また,VBX の配布については VBX のメーカーが認めている再配布条件に基づいて,再配布してください。

    VBX を使おうとしたのですが,正しく動作していないようです。

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

Q:
VBX を使おうとしたのですが,正しく動作していないようです。

A:
Delphi は VB 1.0 互換の VBX のみをサポートしています。VB 2.0/3.0 対応のVBX は使用できません。

    VB 1.0 レベルの VBX を使っているのですが,正しく動作していないようです

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

Q:
VB 1.0 レベルの VBX を使っているのですが,正しく動作していないようです。

A:
残念ながら,VB で動作するすべての VBX を Delphi で正しく使えるとは限りません。たとえば,VB 2.0 は VBX の仕様に含まれるすべての機能を呼び出すわけではないので,VB 2.0 で使われない機能を Delphi が呼び出す場合,VBX がその機能を正しく実装していなければ,Delphi では正しく動作しないことになります。また,VB 2.0 で動作している VBX が Delphi で動作しないケースのすべてについて,明確な回答は得られません。なお,VBX メーカーによっては,Delphi 上での VBX の動作確認されている場合もあります。

    "Interface の保存エラー" のエラー

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

Q:
オートメーションサーバーや ActiveForm/ActiveX を作成しようとしています。
プロジェクトをセーブしようとすると,"Interface の保存エラー"が表示されます。
何が悪いのでしょうか?

A:
マシンに入っている OLE DLL(s) は古いものの可能性があります。 CD-ROM に入っている Internet Explorer をインストールするとこれらの DLL は更新されます。または,Delphi のCD-ROM の Runimage からコピーしてください。

    Error 0:RLINK32 error opening file(TypeLibrary).tlb

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

Q:
オートメーションサーバーや ActiveForm/ActiveX を作成しようとしています。
"Error 0:RLINK32 error opening file my_type_library.tlb" が表示されます。
何が悪いのでしょうか?

A:
マシンに入っている OLE DLL(s) は古いものの可能性があります。 CD-ROM に入っている Internet Explorer をインストールするとこれらの DLL は更新されます。または,Delphi のCD-ROM の Runimage からコピーしてください。

    Internet Explorer 上に ActiveForm が表示されない

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

Q:
Internet Explorer 上に ActiveForm が表示されません。時々,ActiveForm や ActiveX が Internet Explorer に表示されないのは何故ですか? .htm ページに空の四角形内に赤いXが表示されるだけです。

A:
ActiveForm を作成する際に,"設計時モードライセンスを追加" オプションをチェックした可能性があります。しかし,.LIC ファイルを OCX ファイルを一緒に添付していないためです。

ActiveX/ActiveForm は,Web サイトを向上させるためなのにコントロールを無料で配布するので,通常は,"設計時モードライセンスを追加" オプションはチェックしません。

Web サイトの機能を拡張するために ActiveX/ActiveForm を使う場合にはライセンス問題は発生しないので,通常は,"設計時モードライセンスを追加" オプションはチェックする必要はありません。

"設計時モードライセンスを追加" を無効にするには,ActiveForm の XXXImpl ファイルの Initialization セクションの TActiveXControlFactory の最後から2番目のパラメータを置き換えます。次のように,空の文字列を使用します。

   initialization
     TActiveFormFactory.Create(
       ComServer,
       TActiveFormControl,
       TActiveFormX,
       Class_ActiveFormX,
       1,
       '',   0);

    "設計時モードライセンスを追加" を有効にする

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

Q:
"設計時モードライセンスを追加" を有効にする場合は,どのような場合ですか?

A:
ActiveX や ActiveForm を他のデベロッパに販売する場合には,"設計時モードライセンスを追加" を有効にします。それらのデベロッパは,完成したアプリケーションをエンドユーザーに販売します。つまり,.LIC ファイルが存在するとコントロールは,設計時の環境(Delphi,C++Builder,VB など)で動作しますが,.LIC ファイルが無いと実行時の環境(エンドユーザーのアプリケーション)でのみ動作します。

ActiveX を Web 上で配布することは,エンドユーザー(デベロッパに対応して)に配布するということになり,"設計時モードライセンスを追加" を有効にする必要はありません。

    "TActiveFormX クラスの宣言が無いか間違っています"

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

Q:
"TActiveFormX クラスの宣言が無いか間違っています" のエラーが表示されます。
このエラーの原因および対処方法はどうしたら良いですか?

A:
ActiveForm 名を間違った順序で変更した場合に発生することがあります。
coclass 名を先に変更すると,更新時に AV(Access Violation) が発生します。その後,オブジェクトインスペクタからフォームの名前を変更すると,"TActiveFormX クラスの宣言が無いか間違っています" が発生します。修正するには,.DFM ファイルをオープンして以下の行を変更してください。

object ActiveForm: TActiveFormX 

object MyForm: TMyForm 

に変更します。

    "DAX エラー" のエラーが表示

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

Q:
"DAX エラー" のエラーが表示:
このエラーの原因および対処方法はどうしたら良いですか?

A:
[クライアント側から DCOM によるアクセスを行うには,どうしたら良いですか?] の説明に従ったかどうか確認してください。説明に従いながらも動作しない場合は,サーバーをもう一度手動で実行してください。

    古い ActiveForm の情報が表示

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

Q:
バージョン情報付きの ActiveForm をアップデートしたにもかかわらず,古い ActiveForm の情報が表示されます。Internet Explorer で見ると,古い ActiveForm が表示されます。何が悪いのでしょうか?

A:
バージョン情報を使用したとしても,このような事が場合によっては発生します。
TREGSVR.exe または REGSVR32.EXE を使用して,OCX(通常,C:\WINDOWS\OCCACHE\ または C:\WINNT\OCCACHE にあります) の登録を削除すると,問題が解決される場合があります。

対処方法:

  1. Internet Explorer を終了します。
  2. "TREGSVR.exe /u c:\windows\occache\MyActiveX.ocx" または
    "regsvr32.exe /u c:\windows\occache\MyActiveX.ocx" を実行します。
  3. Internet Explorer を再起動し,Web ページにアクセスします。

ActiveX 用に他のファイルを配布している場合は,すべてのファイルがOCCACHE ディレクトリに入れられる事が判るでしょう。
また,ダウンロードしたファイル間で名前の衝突が起きた場合,OCCACHE\CONFLICT.x(x は数値)ディレクトリが作成され移動されます。

    テーブルの内容を EXCEL のシートに書き込むには

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

Q:
テーブルの内容を EXCEL のシートに書き込みたいのですが,どのようにすればよいでしょうか。

A:
Delphi 2.0 及び Delphi 3 以降では,OLE オートメーションを使用してテーブルの内容を EXCEL に書き込む事ができます。以下のコードは Delphi のサンプルテーブルANIMALES.DBF を EXCEL(※) のシートに書き込むサンプルです。

※重要 ここで使用している EXCEL は Excel for Windows95 (ver 7.0)です。
EXCEL 97 では VBA フォーマットが変更されていますので,EXCEL 97 を使用する場合には,サンプルコードの修正が必要です。

手順 :

  1. Delphi 2.0 では OLEAuto,Delphi 3 では Comobj を uses 節に追加します。
  2. フォーム上に Table,Button コンポーネントを配置し,Table コンポーネントにANIMALS.DBF を接続します。
  3. Button コンポーネント の OnClick イベントハンドラに以下のように記述します。
 var
   E_Excel: Variant;
   E_Application: Variant;
   E_WorkBook: Variant;
   E_WorkSheet: Variant;
   i: Integer;
 begin

   // Excel をオープン
   E_Excel :=  CreateOleObject('Excel.Application');
   E_Application :=  E_Excel.Application;
   E_Application.Visible :=  TRUE;
   E_Application.WorkBooks.Open('C:\tmp\MyData.XlS'); // XLS ファイルを指定
   E_WorkBook :=  E_Application.ActiveWorkbook;
   E_WorkSheet :=  E_Application.ActiveSheet;

   // Table1 のデータをファイルに書き込む
   i :=  1;
   Table1.First;
   while not Table1.eof do
   begin
     E_WorkSheet.Cells(i,1).Value  :=  Table1.FieldByName('NAME').AsString;
     E_WorkSheet.Cells(i,2).Value  :=  Table1.FieldByName('AREA').AsString;
     E_WorkSheet.Cells(i,3).Value  :=  Table1.FieldByName('SIZE').AsString;
     i := i + 1;
     Table1.Next;
   end;
   Table1.First;

   // WorkBook の内容を保存して Excel を終了する
   E_WorkBook.Saved  :=  FALSE;
   E_Application.WorkBooks.Close;
   E_Excel.Quit;

 end;

    現在実行中の ActiveForm が格納されているディレクトリが知りたい (99/4/2)

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

Q:
現在実行中の ActiveForm が格納されているディレクトリが知りたいのですが, どのように取得すればいいでしょうか?

A:
GetModuleFilename を使って, インスタンスからそのモジュールを取得すればいいでしょう。
Application.Exename では Web ブラウザへのパスが,GetCurrentDirectory では, "デスクトップ" ディレクトリへのパスが返されます。

var
  ModuleName: array[0..255] of Char;
begin
  GetModuleFilename(HInstance, ModuleName, SizeOf(ModuleName));
  ShowMessage( String(ModuleName) );
end;