|  | 
          
            |  完成図 |  以前、解凍ソフトを作りましたが、「圧縮ソフトもぜひ」、と言う声があったので、今回は圧縮ソフトを作ってみます。前回作った解凍ソフトのコードがかなりの部分使えますので、作成したC++Builder                
        のプロジェクト(Project1)に圧縮部分のコードを追加していく形で進めたいと思います。
 
 解凍ソフトのヘッダーファイル(Unit1.h),                
        ソースファイル(Unit1.cpp)の OnActivate, OnDestory              
        で記述したコードはそのまま圧縮ソフトでも使えます。この部分の解説は繰り返しになりますので、ここでは省きます。(解凍ソフトを見ないで)こちらの解説を最初に見られた方は、解凍ソフトは難しい! を参照してください。
 
 圧縮ファイルは、前回同様 LHA                
        形式のみを考慮します。
 
 圧縮ソフト作成のポイント
 ●LoadLibrary/GetProcAddress などの API 関数の使い方。
 ●提供される DLL の情報・仕様の読解力。
 で、前回と同じですね。
 
 それではさっそくフォームの作成から見ていくことにします。
 
 
 
 前回作成した Form の "書庫ファイル展開" ボタンを右に移動して、圧縮で使うボタン("書庫ファイル作成")を追加します。コンポーネントの一覧では、今回追加した部分を赤色の太字で示してあります。
 
 
   
          
            | コンポーネント | Name | 説明 |  
            | TMemo | Memo1 | 圧縮・解凍の結果を表示します。 |  
            | TOpenDialog | OpenDialog1 | ファイル及び圧縮ファイルを指定します。 |  
            | TPopupMenu | PopupMenu1 | ダミーとして使います。 |  
            | TButton | CompressBtn, ExtractBtn,
 ExitBtn
 | Caption を各々 "書庫ファイル作成"、"書庫ファイル展開"、"終了"                
              としてください。 |  先ほども書いたように、ヘッダーファイル(Unit1.h),                
        ソースファイル(Unit1.cpp)の OnActivate, OnDestory                
        で記述したコードは今回もまったく同じに使用できます。なのでソースファイルに追加するのは、CompressBtn                
        の OnClick イベントだけです。
 この部分の説明は次回になります。
 一通りコードを記述しておきますので、見ておいてください(フォルダの圧縮には未対応です)。
 
 
          
            | 
void __fastcall TForm1::CompressBtnClick(TObject *Sender)
{
    AnsiString ArchiveName, //書庫名
               CompressName,//圧縮するファイル名
               cmdLine;     //コマンド変数
    //圧縮用のフィルタを設定する。
    OpenDialog1->Filter = "すべてのファイル (*.*)|*.*";
    //ファイルが選択されなければ処理終わり
    if (!OpenDialog1->Execute()) return;
    //選択したファイル名を圧縮ファイル名として使う
    CompressName = OpenDialog1->FileName;
    ArchiveName  = ChangeFileExt(CompressName, ".lzh");//書庫名
    //コマンドライン作成(空白パスなどには未対応)
    cmdLine = "a " + ArchiveName   //書庫名
            + " "  + CompressName; //圧縮するファイル名
    //Unlha 操作
    Unlha(Application->Handle, cmdLine.c_str(), "", 0);
    //結果表示用 Memo1 をクリア
    Memo1->Lines->Clear();
    Memo1->Lines->Add("ファイル \"" + ArchiveName +
                      "\" が作成されました。");
}
 |  続く・・・。
 
 |  |