お世話になります。 今まで使っていたXP+D6p から Win7 + XE3(starter)に数日前より移植を始めました。Delphiではヴァージョン間の互換性の問題から移植はかなり面倒ではないかと思っていましたがいくつか試したところ(見た目の不具合は多々あるものの)とりあえずはそのまま動くものもありました。見た目の問題は追々解決するとして次の問題に引っかかりました。勉強不足で申し訳ありませんが教えてください。
1.実行ファイルサイズの問題: とりあえずエラーがなく通った2つのexeファイルのサイズをD6で作ったものと比較すると Aアプリ=679KB→2454KB Bアプリ=1084KB→2650KB と巨大化してしまいました。対策がありましたら教えてください。
2.Unicodeの問題(?) (ここで”PAnsiCharとPWideCharには互換性がありません”のエラーが出る)
①他のアプリを起動させる:
kfile:=MyPath + '\PictureResize.exe';
WinExec(pchar(kfile), SW_SHOW);
②関連付けしたソフトを起動:
kfile:=mypath + '\help\index.html';
shellexecute(0,'open',pchar(kfile),nil,'',sw_shownormal);
何か解決法があるのではないかといろいろと探しましたが見つかっていません。 よろしくお願いします。
1はパス
2は関数にカーソルを持ってゆけば分かると思います。
WinExec(PAnsiChar,Cardinal)ですので
WinExec(pansichar(kfile), SW_SHOW);
ShellExecuteの場合は本来ならそのままコンパイルが通るはずなので分かりません。
mona様 ありがとうございます。
WinExecのところはPAnsiCharで通りました。
ShellExecuteは確かにそのままでOKでした。(関連付けが知らない間に切れていました)
一難去ってまた一難で苦戦しています。 ありがとうございました。
ファイルサイズの問題は目をつぶるのが一番な気がしますが、どうしても気になる場合は、下記のコンパイラ指令をソースに記述することでRTTIを無効にしたら結構小さくなると見た記憶があります。
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
au様 アドバイスいただいたアイデアを試しましたらサイズは若干縮小されました。 ありがとうございます。最初はUnit1に書いてみたのですが縮小効果がありませんでしたので調べてみたらどうやら*.dprに書くようでした。http://ht-deko.minim.ne.jp/tech040.html
これによる効果は D6=679KB → XE3(オリジナル)=2650KB XE3(RTTI無効?)=2034KB となりました。
写真のフォルダーに毎回添付して交換するものですのでサイズは極力小さくしたいと思いますがXE3ではこれが限界なのでしょうか?
牡蠣ソースはHalbowさんが昔書かれたものですが、
XE2では22,528 バイト(22.0 KB)です。
コンパイラと言うよりVCLの肥大化が原因だと思われます。
VCLと決別するか、サイズを気にしないかのどちらかだと思います。
また不要な機能はどんどん削るのも手です。
と言いつつ私は全く気にしてませんが。
program Project1;
uses windows;
const
WM_DESTROY = $0002;
procedure MainDestroy(hWindow: HWND);
begin
UnregisterHotKey(hWindow, 1);
PostQuitMessage(0);
end;
//------------------------------------------------------------
// Main Window Procedure
//------------------------------------------------------------
function MainWndProc(hWindow: HWND; Msg: UINT; WParam: WPARAM;
LParam: LPARAM): LRESULT; stdcall; export;
begin
Result := 0;
case Msg of
WM_DESTROY: MainDestroy(hWindow);
else
begin
result := DefWindowProc( hWindow, Msg, wParam, lParam );
exit;
end;
end;
end;
//------------------------------------------------------------
// Main Procedure
//------------------------------------------------------------
var
wc: tagWNDCLASS;
hWindow: HWND;
Msg: TMsg;
begin
wc.lpszClassName := 'AppClass';
wc.lpfnWndProc := @MainWndProc;
wc.style := CS_VREDRAW or CS_HREDRAW;
wc.hInstance := hInstance;
wc.hIcon := LoadIcon(0,IDI_APPLICATION);
wc.hCursor := LoadCursor(0,IDC_ARROW);
wc.hbrBackground := (COLOR_WINDOW+1);
wc.lpszMenuName := nil;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
RegisterClass(wc);
hWindow := CreateWindowEx(0,'AppClass','',WS_OVERLAPPEDWINDOW,0,0,200,200,0,0,hInstance,nil);
RegisterHotKey(hWindow, 1, 0, VK_F1);
ShowWindow(hWindow,CmdShow);
UpDateWindow(hWindow);
//---- Message Loop ---------------------
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.
余談ですが、Delphi XE 以降のデフォルトアイコンは Vista アイコンに対応しており、256x256 アイコンが含まれています。
...ここまではいいのですが、アイコンには以下のリソースが含まれています。
256x256 Bitmap ARGB
48x48 Bitmap ARGB
32x32 Bitmap ARGB
24x24 Bitmap ARGB
16x16 Bitmap ARGB
48x48 Bitmap 256 Color
32x32 Bitmap 256 Color
24x24 Bitmap 256 Color
16x16 Bitmap 256 Color
アフォな事に 256x256 アイコンが PNG 形式ではありません。
このため、アイコンだけで 290KB もあります (XE2 以降)。
256x256 アイコンを PNG 形式にすれば、Vista / 7 /8 で特大アイコンが使える上に、サイズが 90KB 程度になります。
つまり、EXE のサイズも 200KB 程小さくなります。
なお、2005〜2010 の デフォルトアイコンは 33KB、Delphi 7 より前のデフォルトアイコンは 4KB を超える事はありません。
UPXで実行ファイルを圧縮するとういう手もあります。
http://upx.sourceforge.net/
作り直すなら、サイズが10分の1になるという噂のKOL/MCKとか。
(XE2まで対応。気合いが必要?)
"KOL/MCKを使ってDelphiで小さな実行ファイルを作ろう"
http://www.geocities.jp/sunnyvale3282/
本家に対応してほしいけど...
monaa様 DEKO様 UPX様 いろいろとありがとうございます。
XE3は単純に従来のDelphiの目先を少し変えたものかと思っていましたがいろいろと見聞きしていくうちに大変大きな機能の発展があったようであることが分かってきた気がします。exeのサイズが巨大化するのもやむなしと納得しました。
サイズを減らす手段をお教えいただきましたものは
1.VCLからの決別。(これは当方の腕では歯が立ちそうにありません)
2.アイコンサイズの減少
3.UPXによるexeファイルの圧縮
に要約されるものと思います。XE3の機能はかなり広がっているようですのでWindows8発売のニュースを見ているとXE3はこれから活躍できるものと思いますので本を買って勉強したいと思います。
現在やっているのはD6(パーソナル)で十分満足していますのでサイズが気になるものとそうでないものを用途によって使い分けるようにしていきたいと思います。しかしD6もこの先ビジネスにも使っていきたいと思いますのでパーソナルに代わる有償のものがあるかどうか探してみます。
XE3を使い始めたばかりで不勉強のまま質問させていただきましたがまたよろしくお願いします。ありがとうございました。
ツイート | ![]() |