DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

VCLは以下で、usesして容量がデカッ、の2

9/7のネタの続きです。


   ∧,,∧ どもっす。
  ミ,,゚Д゚∩
  ∪  ,,ノ
 @ミ   ミ
   ∪''∪


文字列処理が
どれほど、楽しいかといいますとですね。

EmEditorPlugin Delphi

こんな感じです。

例えば
・メールの引用記号の、最新のものだけ残す
つまり、[> ]が一段階だけ着いている本文だけ残したり

・最深のものだけ削除
本文の中に[> ]が4段階のものがみつかったら
4段階目のものだけを削除する

・引用記号だけの行を削除
本文の中に[> > > ]で、文章無し、という行があったら
削除する

こういう処理を、プログラムにやらせるのは非常に簡単じゃないですか?

これを実装して1クリックで手なじみのエディタに処理させることができたら
便利だし、作った甲斐があるってものです。


もちろん、俺みたいにEmEditor使っているわけではない
かもしれないでしょうから、エディタのプラグイン実装ではなく、
お使いのエディタでDelphiコードで処理を書くことができなくっても
工夫して文字列処理をさせることは簡単です。

概要としてはdprファイルの中で次のように実装すればいいわけっす。


・クリップボードから文字列呼び出し
 Text := Clipboard.AsText;
 Text := testFunction(Text);//処理
 Clipboard.AsText := Text;

たくさん、プログラムが作れそうです。
様々な上手な仕組みを考えてみてくださいね。

・クリップボードから文字列呼び出し
 Text := Clipboard.AsText;
 メニューを表示して機能を選択させる
 case 機能により処理わけ of
  A: Text := FuncA(Text);
  B: Text := FuncB(Text);
  C: Text := FuncC(Text);
 end;
 Clipboard.AsText := Text;

こういうのもとてもいいでしょう。


まだ実装していませんが、
ある文字列Aからある文字列Bまでの囲まれた範囲を抽出
もしくは除去するソースをつくるつもりです。そうすると

・アンカーリンクだけを抽出
・イメージリンクだけを抽出
・Delphiソースからuses節だけを抽出
・HTMLからJavaScriptコードだけ除去
とかも設定変更くらいで再利用できて便利ですね。


さて、VCLのusesしたら増加するユニットについてですが
主要なVCLユニットについて調べてみました。

library TestDLLSize;

uses
//Types, //増加無し

//◆Form標準
//Windows //+1KB
//Messages //+1KB
//SysUtils //+26KB
//Variants //+53KB
//Classes //+60KB
//Graphics //+70KB
//Controls //+368KB
//Forms //+368KB
//Dialogs //+368KB

//◆その他VCL
//ComObj, //+72KB
//ShlObj, //+53KB
//Contnrs, //+60KB
//DateUtils,//+26
//IniFiles, //+60
//Registry, //+60KB
//ToolWin, //+368KB
//Math, //+26KB

//Menus, //+368KB
//ImgList, //+368KB
//ComCtrls, //+375KB
//StdCtrls, //+368KB
//ExtCtrls, //+368KB
//Grids, //+368KB
//Clipbrd, //+368KB
//Buttons, //+374KB
//CheckLst, //+368KB
//RichEdit, //+0KB
//Spin, //+375KB
//jpeg, //+190KB
//FileCtrl, //+377KB

//ShellAPI, //+0KB
//ActiveX, //+53KB
//WinSock, //+0KB
//
//ActnList //+368KB
//StdActns, //+368KB
//
//AppEvnts, //+373KB
//Taskbar, //+368KB
//
//XPMan, //+61KB
//Themes, //+368KB

uses_end;

begin
end.

これをひとつひとつコメントアウト解除すれば
例えば二つのユニットをusesした時の
容量が簡単にわかるのです。

上記は、Delphi2007、での調査結果です。
最も基本的なDLLは17KBですから
作成されたDLLが385KBなら、それから17を引いた値が、+368KBとかです。

Delphi2007はDelphi2006とコンパイラ自体は同一なので容量は変わらないはず。
Delphi2005やDelphi7、Delphi6でも、誰か比較してみてください。
※D8はなかった事にして歴史の闇に葬り去りましょうかね。

俺はD6とか、アンインストールしてしまっているので
ブログネタにするためだけにインストールするのは、ちょっと手間すぎなので、
誰かやって!


usesする"だけ"で、そのユニットの何の機能も使っていないのに
実行ファイルのサイズが増加したらたまったものではないんですが
スマートコンパイルの仕組みはあるにも関わらず無視して、こうなってしまいます。
+368KBとか、たくさん出てきますので
原因となっているのは数カ所だとは思いますがVCLを使うときのこれが足かせです。

ちっちゃいプログラムを作るためにVCLを使うな。という話もあるわけですが
開発効率を考えると、その選択肢はちょっと現実感が薄く....
EmEditorPluginなどを作っていると、その便利さと容量でかさの引っ張り合いがやっかいでやっかいで....


たしかDLL内でTListを使うだけで、368KBも増加して、それは実に嫌なので
TListの全ソースをコピってTListCloneと名付けて
ListClone.pasとしてコンパイルすればずいぶん軽いDLLが出来ました。

いやあ、実に不愉快な回避テクニックです。
仕方ないのですが、大人になる。ってこういう汚いテクを使ってでも一人前にやっていく。
そういうことなんでしょうね(違....)


プラグインじゃなくて、普通のexeをつくる限りは300KBの増加なんて漏れも気にしませんが
だからといって、usesだけで何の機能も使用してないのに
バイナリサイズが増加するような仕組みは、やっぱりおもしろくないっしょ。

VCL2.0(なんてものがあるのなら)では解決してもらいたいです。


さて、最もネタにしたかったのは
実はVCLのusesサイズ増加に関することではございませんでして

上のソースをよーーーくみてくださいな。
コピってコンパイルしようと試してみてくださいな。
気がつくと思いますが。

uses_end;

なんですかね。これは。。。

次回に続きましょう。
スポンサーサイト

| 未分類 | 18:55 | comments:3 | trackbacks:0 | TOP↑

COMMENT

あまり AA は得意では無いんですが

 __

| nishi | 2007/09/10 23:26 | URL | ≫ EDIT

あまり AA は得意では無いんですが

 __


こんな感じかなぁ。最初は急激に大きさが増えてある程度のところで打ち止め。

その、最初のディスク使用量が急激に増えるように見えるところだけで比較するから気になるのでは?

私は、Delphi VCL で作った複数のプラグインを使うときには、カスタムの実行時パッケージを作って共有しています。RTL+基本 VCL + 自前のライブラリ。といった感じですね。

| nishi | 2007/09/10 23:29 | URL | ≫ EDIT

どーも、どーも、nishiさんこんにちは。

ん~、そうですねEmEditorのプラグインに関して言えば、300KBとか、激しく致命的サイズなんですよ。世間のEmEditorプラグインで100KBのものもほとんど皆無ですが300KBとかってありえない。
それがつらいんですよね。

EmEditor本体

Plugin.DLL

実行時パッケージ

という事をおっしゃってるのでしょうか?
それって、結局メモリ上に展開されるバイナリのサイズとしては

本体サイズ+プラグインサイズ(複数分)+共有パッケージサイズ(複数分)
ということにならないでしょうか?

DLLって概念としては違うのかな?
それにしても、実行時パッケージ...が作れないっす...トホホ...どうやって作るんだ?

| ミ・д・彡 | 2007/09/11 00:35 | URL | ≫ EDIT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/80-6caaa2b2

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。