Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi/400 コンポーネント リファレンス【TCoIFS】

『コンポーネント リファレンス』シリーズでは、Delphi/400の
ネイティブコンポーネントについて1記事1コンポーネントずつ解説します。

本記事では、TCoIFSについて解説します。
(内部で使用するTDirThread・TIFSObjectもここで解説します)


概要

プロパティ

  • Asynchronous
    • Boolean型
    • ListDirectoryメソッドやListDirectroryNextメソッド(後述)で使用します。
      これによって、Directoryオブジェクトに繰り返しアクセスできるようになります。
  • AS400
    • TAS400コンポーネントを指定(必須)
    • AS400 プロパティは、オブジェクト(コマンドやプログラムなど)が格納されている IBM i を示します。
  • Connected
    • Boolean型
    • Connectedプロパティは、IFSへの接続が確立しているかどうかを示します。
  • CurThread
    • TDirThread型
    • カレントディレクトリ内のオブジェクトに関する情報を持った TDirThread クラスを指定します。
    • ※TDirThreadについては、後述の「内部で使用する型やオブジェクトについて」をご参照ください。
  • Stream
    • TMemoryStream型
    • Streamプロパティは、CopyFileASToStreamメソッド呼び出し後に、
      ビットマップのメモリーイメージを受け取るストリームオブジェクトです。
  • TransferComplete
    • Boolean型
    • TransferCompleteプロパティは、カレントディレクトリ情報の転送が完了したかどうかを示します。

 

メソッド

(※TComponentから継承のものを除く)

各メソッドでエラーが発生すると、例外が生成されます。
例外については後述の「TCoIFS 例外クラス」をご覧ください

  • Connect
    • 引数、戻値:なし
    • Connectメソッドは、IFSへの接続を確立します。
      ConnectedプロパティはTrueに設定されます。
  • CopyFileASToStream
    • 引数:①ASFile(String)
    • 戻値:なし
    • CopyFileASToStreamメソッドは、ビットマップファイルのメモリーイメージを
      Streamオブジェクトにコピーします。
    • 詳細は、DBBitmapサンプル(後述)を参照してください。
  • CopyFileToAS
    • 引数:①PCFile(String) ②ASFile(String) ③overwrite(Boolean) ④Showprogress(Boolean)
    • 戻値:なし
    • CopyFileToASメソッドは、PCFileをASFileにコピーします。
    • OverwriteがTrueに設定されASFileが存在する場合は、ASFileが上書きされます。
    • ShowprogressがTrueに設定されている場合、プログレスバーが画面に表示されます。
  • CopyFileFromAS
    • 引数:①ASFile(String) ②PCFile(String) ③overwrite(Boolean) ④Showprogress(Boolean) ⑤convert(Boolean) ⑥linelenconvert(Smallint)
    • 戻値:なし
    • CopyFileFromASメソッドは、ASFileをPCFileにコピーします。
    • OverwriteがTrueに設定されPCFileが存在する場合は、PCFileが上書きされます。
    • ShowprogressがTrueに設定されている場合、プログレスバーが画面に表示されます。
    • ConvertがTrueに設定されている場合、
      ASFileの内容はEBCDICからAnsi文字セットに変換されます。このパラメータは、
      QSYS.LIBの中にあるソースファイルを転送する場合にだけ使用してください。
  • CopyStreamToFileAS
    • 引数:①ASFile(String) ②overwrite(Boolean)
    • 戻値:なし
    • CopyStreamtoFileASメソッドは、Streamオブジェクトの内容をASFileにコピーします。
    • OverwriteがTrueに設定されている場合は、ASFileが上書きされます。
    • 詳細は、DBBitmapサンプル(後述)を参照してください。
  • CreateDir
    • 引数:①path(String)
    • 戻値:なし
    • CreateDirメソッドは、新しいディレクトリを作成します。
  • DeleteDirectory
    • 引数:①path(String)
    • 戻値:なし
    • DeleteDirectoryメソッドは、パスで指定されたディレクトリを削除します。
      空でないディレクトリに対して実行すると例外が生成されます。
  • DelFile
    • 引数:①path(String)
    • 戻値:なし
    • DelFileメソッドは、パスで指定されたファイルを削除します。
  • DisConnect
    • 引数・戻値:なし
    • DisConnectメソッドは、IFSへの接続を終了します。
      ConnectedプロパティはFalseに設定されます。
  • ListDirectory
    • 引数:①RootDir(String) ②nbentry(Smallint)
    • 戻値:なし
    • ListDirectoryメソッドは、引数のディレクトリのオブジェクトを取得し、
      Curthreadオブジェクトを生成します。
    • AsynchronousプロパティがFalseの場合、すべてのオブジェクトが返されます。
    • AsynchronousプロパティがTrueの場合、nbentryオブジェクトだけが取得されます。
      次のオブジェクトを取得するには、ListdirectoryNextメソッドを使用します。
    • すべてのオブジェクトが取得されると、
      プロパティTransferCompleteがTrueに設定されます。
    • ※Curthread(TDirThread)については、
       後述の「内部で使用する型やオブジェクトについて」をご参照ください。
  • ListDirectoryNext
    • 引数:①RootDir(String) ②nbentry(Smallint)
    • 戻値:なし
    • ListDirectoryNextメソッドは、カレントディレクトリのオブジェクトを取得して、Curthreadオブジェクトに値を入力します。
    • AsynchronousプロパティがTrueに設定されているときは、ListDirectoryへの呼び出しが成功した後に使用する必要があります。
    • すべてのオブジェクトが取得されると、プロパティTransferCompleteはTrueに設定されます。

 


ロジック記述例

<ファイルをIFS領域からPCにダウンロードする例>

if SaveDialog1.Execute then
begin
  CoIFS1.CopyFileFromAS(CoIFSBrowseFiles1.ItemFocused.Caption, // IFS領域のパス
                        SaveDialog1.FileName,                  // PCファイルのパス
                        True,                                  // 存在する場合に上書き
                        True,                                  // プログレスバー表示
                        False,                                 // Ansi文字に変換しない
                        0);                                    // 変換時の設定
end;

 

<ファイルをPCからIFS領域にアップロードする例>

if OpenDialog1.Execute then
begin
  CoIFS1.CopyFileToAS(OpenDialog1.FileName,                  // PCファイルのパス
                      CoIFSBrowseDirs1.SelectedDir +
                      ExtractFileName(OpenDialog1.FileName), // IFS領域のパス
                      True,                                  // 存在する場合に上書き
                      True);                                 // プログレスバー表示
end;
ShowprogressがTrueの場合、
このように進捗状況が表示される

 

<IFS領域の特定フォルダ内のファイル名を一覧取得し、PCに一括ダウンロードする例>

procedure TdmMain.SilentDLTest;
const
  cIFSDIR = '/TEST/TEMP/';   // IFS内のフルディレクトリ名
var
  AS400: TAS400;
  CoIFS: TCoIFS;

  i: Integer;           // for文用
  sTEMPDIR: String;     // 保存先パス
  slFiles: TStringList; // IFSのファイル名を一覧保管
begin

  // 一時フォルダの作成
  sTEMPDIR := 'C:\TEMP\XXXX\';    // 実際の保存先パスを指定
  if not(DirectoryExists(sTEMPDIR)) then
  begin
    ForceDirectories(sTEMPDIR);   // パスのフォルダが無い場合は作成
  end;

  // ここからDelphi/400処理
  AS400   := TAS400.Create(nil);
  CoIFS   := TCoIFS.Create(nil);
  slFiles := TStringList.Create;
  try
    // AS/400 接続
    CoIFS.AS400    := AS400;
    AS400.PLUAlias := 'AS400NAM'; // 実際のエリアス名を指定
    AS400.Userid   := 'USERID';   // 実際のユーザー名を指定
    AS400.PWD      := 'PASSWD';   // 実際のパスワードを指定
    AS400.Connect;
    CoIFS.Connect;

    // 指定ディレクトリにある全ファイルの名称/更新日/サイズをCurthreadに取得
    CoIFS.ListDirectory(cIFSDIR, 1);

    // 取得したファイル名をリスト化
    for i := 0 to (CoIFS.Curthread.Files.Count - 1) do
    begin
      slFiles.Add(CoIFS.Curthread.Files.Names[i]);
    end;

    // ファイル名を抽出しダウンロード
    for i := 0 to (slFiles.Count - 1) do
    begin
      CoIFS.CopyFileFromAS(cIFSDIR + slFiles[i],   // IFS領域のパス
                           sTEMPDIR + slFiles[i],  // PCファイルのパス
                           True,                   // 存在する場合に上書き
                           True,                   // プログレスバー表示
                           False,                  // Ansi文字に変換しない
                           0);                     // 変換時の設定

      // 取込終わったファイルをIFSから削除(※任意)
      CoIFS.DelFile(cIFSDIR + slFiles[i]);
    end;

  finally
    // 内部生成したコンポーネントを切断&解放
    CoIFS.Disconnect;
    AS400.Disconnect;

    FreeAndNil(slFiles);
    FreeAndNil(CoIFS);
    FreeAndNil(AS400);
  end;
end;

(※このサンプルではTAS400・TCoIFSを内部生成しているが、内部生成にすることで、
  Delphi/400が入っていないPCでもEXEを起動可能&このprocedureを呼び出さない限りは動作可能になる。)

 

イベント

  • なし

 

内部で使用する型やオブジェクトについて

TDirThread クラス

  • TDirThread クラスを使用すると、カレントディレクトリにあるオブジェクトについての情報にアクセスできます。
  • 継承:TObject > TPersistent > TComponent > TDirThread
  • 主なプロパティ:
    • Dirs(型:TIFSObject)
      • カレントディレクトリに位置する子ディレクトリの情報を格納したTIFSObjectが参照されます。
    • Files(型:TIFSObject)
      • カレントディレクトリに位置する子ファイルの情報を格納したTIFSObjectが参照されます。
    • Path(型:TIFSObject)
      • カレントディレクトリのパスが含まれます。

 

TIFSObject クラス

  • TIFSObjectクラスは、ファイルやディレクトリの情報にアクセスするためのものです。
  • 継承:TObject > TPersistent > TComponent > TIFSObject
  • 主なプロパティ:
    • Count(型:Integer)
      • TIFSObjectにあるオブジェクトの数が返されます。
    • Names(型:String)
      • インデックスが参照したオブジェクト(ファイルまたはディレクトリ)の名前が返されます。
        ※『 Names[1] 』といった書式でインデックス番号を付けて使います。
    • Modified(型:TDateTime)
      • インデックスが参照したオブジェクト(ファイルまたはディレクトリ)の最終変更日が返されます。
        ※『 Modified[1] 』といった書式でインデックス番号を付けて使います。
    • Size(型:Integer)
      • インデックスが参照したオブジェクト(ファイルまたはディレクトリ)のサイズがバイト数で返されます。
        ※『 Size[1] 』といった書式でインデックス番号を付けて使います。

 

TCoIFS 例外クラス

TCoifs コンポーネントの使用でエラーが発生すると、次の例外のうち1つが発生します。
(使用しているユニット:IFSTools)

  • EIFSnotinitialized : IFS は初期化されません。
  • EIFSnotAsync : ListdirectoryNext が呼び出されましたが、
      Asynchronous プロパティが True に設定されていません。
  • EIFSunknownError : 不明のエラーです。
  • EIFSNoAs400 : TAS400 コンポーネントが定義されていません。
  • EIFSAccessDenied : アクセスは拒否されました。
  • EIFSObjectExists : オブジェクトはすでに存在します。
  • EIFSObjectBusy : オブジェクトはビジーです。
  • EIFSObjectNotFound :オブジェクトが見つかりません。
  • EIFSInvalidFileName : 無効なファイル名です。
  • EIFSPathTooLong : パスが長すぎます。
  • EIFSDirectoryNotEmpty : ディレクトリは空ではありません。
  • EIFSOpNotSupported : サポートされていない操作です。
  • EIFSPCFileNotFound : PC ファイルが見つかりません。

 

サンプルプログラム

Delphi/400 開発版をインストールしている場合、

C:\co4XX\DelphiXX\Samples\IFSexplorer

の場所に、TCoIFSTCoIFSBrowseDirsTCoIFSBrowseFiles
各コンポーネントを使ったサンプルプログラムが同梱されています。
 

また、TCoIFSの
CopyFileASToStreamCopyStreamToFileASメソッドのサンプルは

C:\co4XX\DelphiXX\Samples\DBitmaps

の場所にあります。

  • XX」部分はバージョンによって異なります。10.2 Tokyoの場合は「24」です。
  • インストール時にSample Filesのインストールを有効にしておく必要があります。

 

関連リンク

 

 

※本記事に記載のヘルプは、過去の製品マニュアルからの抜粋となります。
 貴社にてご利用のバージョンにおける設定などでご不明な点がございましたら、
 サポート窓口までお問い合わせ下さい。

※本記事で紹介しているコンポーネントは、基本的に過去バージョンで動作していたものの互換動作となります。
 最新バージョンでは、例えば全角文字のファイル名などに対応していない場合があります。
 TCoIFS・TCoIFSBrowseDirs・TCoIFSBrowseFilesで要件を満たす操作が実施できない場合は、
 FTP接続など別の手順によるIFS操作をご検討ください。