|
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
|