お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"バイナリをEXEに同梱するコンポ例"



 いろんなファイルやデータをEXEに同梱したい というケースは結構あると思
います。リソースとしてコンパイルする方法がありますが、簡単にコンポにでき
ないかやってみました。本当はプロパティエディタでTOpenDialogを開くべきだ
とおもいますが、手が回りませんでした (^^; ということで手で入力して下さ
い。(アイコンにDrag&Dropでフルパスをゲットするというやくざなアプリを作っ
て使っている私でした。(^^;;) 
 streamからの読み込みをサポートしていない手段に対してリソースを用意する
場合(midiをTMediaPlayerで、、など)一旦ファイルに書き出してから使って消す
という方法です。 LibにUpしようかと思いましたが、めちゃ小さいのと、コー
ディング自体参考になるのではないかと思いこちらにあげました。
 ちなみにコンポーネントセミナーオフの案内exeでjpgをEXEに同梱するために作
りました。



unit BinaryKeeper;
{
TBinaryKeeper ver0.1 rel98.9.15
任意のファイルをExe内に取り込みます。
ファイルの指定はデザイン時のみです。
デザイン時にファイルを指定してやるだけで
コンパイルすればそのファイルがExeファイルに含まれます。

実行時にファイルに書き出したいときは writeOut メソッドを使って下さい。
     procedure writeOut(fname:string);

streamとして扱いたいときはstreamプロパティを使って下さい。
}

interface

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

type
  TbinaryKeeper = class(TComponent)
  private
    { Private 宣言 }
     FFilename:string;
     FSize:integer;
     mystream:TMemoryStream;
     procedure readData(theStream: TStream);
     procedure writeData(theStream: TStream);
     procedure setFilename(value:string);
  protected
    { Protected 宣言 }
     procedure defineproperties(Filer:TFiler);overRide;
  public
     procedure freeStream;
     procedure writeOut(fname:string);
     constructor create(AOwner: TComponent);overRide;
     destructor destroy;overRide;

    { Public 宣言 }
  published
    { Published 宣言 }
     property stream:TMemoryStream read myStream;
     property Size:integer read FSize;
     property Filename:string read FFilename write setFilename;
  end;

procedure Register;

implementation

constructor TbinaryKeeper.create;
begin
   inherited;
   myStream:=nil;
   FFilename:='';
end;
destructor TbinaryKeeper.destroy;
begin
   if myStream<>nil then myStream.free;
   inherited;
end;
procedure TbinaryKeeper.writeOut(fname:string);
begin
   if myStream<>nil then myStream.saveToFile(fname);
end;
procedure TbinaryKeeper.setFilename(value:string);
begin
   if (csLoading in ComponentState) then
   begin
      FFilename:=value;
   end
   else
   begin
      if (csDesigning in ComponentState) then
      begin
         if fileExists(value) then
         begin
            if myStream=nil then myStream:=TMemoryStream.create;
            myStream.loadFromfile(value);
            FSize:=myStream.size;
            FFilename:=value;
         end
         else
         begin
            if myStream<>nil then
            begin
               myStream.free;
               myStream:=nil;
            end;
            FFilename:='';
         end;
      end;
   end;
end;
procedure TBinaryKeeper.freeStream;
begin
   myStream.free;
   myStream:=nil;
end;

procedure TbinaryKeeper.ReadData(theStream: TStream);
begin
  if myStream=nil then myStream:=TMemorystream.create;
  theStream.read(FSize,sizeOf(integer));
  myStream.SetSize(FSize);
  myStream.copyFrom(theStream,Fsize);
end;

procedure TbinaryKeeper.WriteData(theStream: TStream);
begin
  if mystream<>nil then
  begin
     theStream.write(FSize,sizeOf(integer));
     myStream.saveToStream(theStream);
  end;
end;

procedure TbinaryKeeper.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineBinaryProperty('Data', ReadData, WriteData, TRUE);
end;

procedure Register;
begin
  RegisterComponents('Samples', [TBinaryKeeper]);
end;

end.

(*
//ちなみに使用例

//streamとしての使用方法 jpgファイルをFilenameプロパティにセットした場合
jpg:=TJpegImage.create;
try
   BinaryKeeper1.stream.Position:=0;
   jpg.LoadFromStream(BinaryKeeper1.stream);
   image1.Picture.assign(jpg);
finally
   jpg.free;
end;

//ファイルに書き出してロードする場合(midiファイルをセットした例)
//書き出すファイル名はExeフルパスの拡張子を変えたものにしている
BinaryKeeper1.writeOut(changeFileExt(paramStr(0),'.mid'));
application.processmessages;
try
   mediaplayer1.filename:=changeFileExt(paramStr(0),'.mid');
   mediaplayer1.Open;
   mediaplayer1.play;
except
end;
//適当なタイミングで
DeleteFile(changeFileExt(paramStr(0),'.mid'));

*)
☆☆☆  かわいいコードにゃ旅をさせよう いざサンプル蔵へ!! ☆☆☆
                                 98/11/02(月) 00:43 凛(MXB01744)

Original document by 凛              氏 ID:(MXB01744)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum