フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: 1 2 [3] 4
トピック: [Software] ChangeCreateOrder
DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.10
on: 2014/08/02 12:53 Sat

[変更点 (2014/08/02)]

  • バイナリ形式フォームの読み込みに対応した

[バイナリ形式フォーム]
読み込んだフォームがバイナリ形式であれば、保存時のフォームファイルもバイナリ形式となります。
バイナリ形式フォームを読み込んだ際にはバックアップもバイナリ…つまりオリジナルの状態で保存されます。

但し、Delphi 5 以前のバイナリ形式フォームを ChangeCreateOrder でバイナリ形式で保存した場合には Delphi 5 以前で読み込めない場合があります。何故そのような事になるのかは、以下のリンク先で確認してください。

[今更聞けない Delphi のコト (フォームファイル編) (VCL Tips)]
http://ht-deko.minim.ne.jp/tech032.html#tech061

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.20
on: 2014/08/02 14:04 Sat

[変更点 (2014/08/02)]

  • UTF-8 テキスト形式フォームの読み込みに対応した

バイナリ形式フォーム同様、UTF-8 テキスト形式を読み込んだら保存も UTF-8 テキスト形式となります。

[UTF-8 テキスト形式フォーム]
普通は見かけません。
フォームを保存すると日本語等がコントロール文字列に置換されてしまうのはご存知の通りですが、メモ帳等のテキストエディタでフォームファイルを開いて直接日本語を記述した場合、UTF-8 (with BOM) 形式で保存すれば IDE はちゃんと読み込んでくれます。
しかしながら、IDE で [エディタで表示] するとやはりコントロール文字列で表示されます。加えて、フォームを IDE で保存してしまうと日本語部分がコントロール文字列に置換された ANSI (ASCII) になってしまいます…つまり、普通の状態では存在しないフォーマットという事ですね。

想定される用途としては、

  • プログラムからフォームファイルを自動生成する
  • IDE を使わず (コマンドラインコンパイラを使用)、フォームファイルの編集もテキストエディタのみで行う

くらいのものでしょうか?

何故 IDE は UTF-8 形式フォームをそのまま保存できないのかという疑問は尽きません。なお、[エディタで表示] して [ファイルフォーマット | UTF-8] を選択すると [フォームとして表示] 出来なくなります(*1)のでご注意ください。

*1 テキストフォーム / バイナリフォームを選び直せば [フォームとして表示] できます。

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.30
on: 2014/08/02 16:22 Sat

[変更点 (2014/08/02)]

  • ツリービューのコンテキストメニューに [クリップボードにコピー] を追加
  • メモ (プロパティ) フィールドのコンテキストメニューに [選択テキストをバイナリファイルとして保存] を追加

[クリップボードにコピー]
フォームエディタ上でコンポーネントをコピーすると、テキスト形式でコピーされる事はご存知かと思います。なので、メモ (プロパティ) フィールドにあるプロパティをちょっと細工して(*1) [フォームエディタ] へ貼り付けるとコンポーネントのコピーが貼り付けられます…ですが、子コントロールまでは貼り付けられません。
ツリービューにあるコンテキストメニュー [クリップボードにコピー] を使うと、子コントロールまで含めたものがクリップボードに格納されます。

[選択テキストをバイナリファイルとして保存]
例えば、ImageList をテキスト形式で見てみると以下のような形式になっていますよね?

ColorDepth = cd32Bit
Left = 96
Top = 48
Bitmap = {
494C010103000800700010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
(中略)
000000000000}

 
これの {49~00} 内の 16進数値列を選択して(*2) [選択テキストをバイナリファイルとして保存] すると 16進値を解釈し、バイナリファイルとして保存する事ができます。

ImageList だと先頭にヘッダが付いていますから、ファイルをバイナリエディタで開き、BM を目印にしてヘッダを削除してやると BMP 画像を得る事ができます。

*1 objectend ブロックを手動で付ける必要があります。
*2 選択はアバウトにやっても大丈夫です。正規表現で切り出しているので {} や空白、タブ、改行が含まれていても問題ありません。

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.40
on: 2014/08/03 14:48 Sun

[変更点 (2014/08/03)]

  • バイナリ形式フォームまたは UTF-8 テキスト形式ファイルを読み込んだ場合には、自動デコードの初期値をオフにするようにした。

[自動デコードの初期値]
バイナリ形式フォームは古い Delphi のものが多く、自動デコードしない方が都合がいい事が多いです (日本語環境だと Shift_JIS ベタ保存されているものが多い)。UTF-8 テキスト形式も同様で、コントロール文字形式になっている UTF-8 テキストフォームはほぼ ASCII であるため意味がありません…よってこの 2 つは初期値を自動デコードオフにしました。

自動デコードを行うかどうかの正確な判定は 0×80 以降の文字が存在するかどうかで判断できない事もありません。ただ、普通の文章が含まれるテキストであれば、先頭からそこそこスキャンすれば判定できますが、フォームファイルの場合にはファイルの最後近くまで "バイト単位で" スキャンしないと判定できません。コントロール文字列が出てきたら [自動デコードを行う] のボタンを押せばいいだけの話なので正確な判定は行わない事にしました。

  • 読み込みパフォーマンスとのトレードオフとなる
  • 自動デコードしてはいけない Delphi のバージョンの方が少ない

自動デコードしてはいけないのは Delphi 5 以前と通常では存在しない UTF-8 テキスト形式フォームファイルですが、

  • UTF-8 テキスト形式は 100% 自動判定される
  • バイナリ形式フォームがデフォルトだったのは Delphi 4 以前 (Delphi 4 以前のフォームファイルは 100% 自動デコードしてはいけない)

そのバージョンで新規作成されたフォームの場合、自動デコードを行うかどうかの正確な判定を行う必要があるのは Delphi 5 で作られ、Delphi 5 で開く必要のあるフォームファイルだけなのです。

  • Delphi 4 以前のバイナリ形式フォームを開いて編集し保存: Delphi 6 以降のバイナリ形式フォームに変換されるため、Delphi 4 以前で開くと問題が出る。
  • Delphi 5 のバイナリ形式フォームを開いて編集し保存: Delphi 6 以降のバイナリ形式フォームに変換されるため、Delphi 5 で開くと問題が出る。
  • Delphi 5 のテキスト形式フォームを開いて編集し保存: Delphi 6 以降のテキスト形式フォームに変換されるため、自動デコードをオフにしなくてはならない。自動デコードをオフにして保存したものは Delphi 5 で開く事ができる。
  • Delphi 6 以降のバイナリ形式フォームを開いて編集し保存: 問題なし。
  • Delphi 6 以降のテキスト形式フォームを開いて編集し保存: 問題なし。

Delphi 6 以降であれば常に自動デコードオンでよく、Delphi 5 以前のバイナリ形式フォームでも、Delphi 6 以降に持ってくる用途であれば常に自動デコードオンで構いません。つまりすべてのテキスト形式フォームで、自動デコードをオフにしなくてはならないのは Delphi 5 で作られ、Delphi 5 で開く必要のあるテキスト形式フォームファイルだけとなります…今となってはレアケースでしょ?

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.50
on: 2014/08/04 19:06 Mon

[変更点 (2014/08/04)]

  • 自動デコードの初期値をほぼ完璧に判定できるようになった。
  • Delphi 5 以前のバイナリ形式のフォームを元と同じフォーマットで書き出せるようになった。

[バイナリ形式フォームの闇]

  • Delphi 5 以前のバイナリ形式のフォームは文字列がベタな ANSI で格納されています。
  • Delphi 6 以降のバイナリ形式のフォームは文字列がベタな Unicode で格納されています (コントロール文字列ではありません)。

ですが、Delphi はどちらもちゃんと読めますよね?なおかつ前者を新しい Delphi で保存すると後者ににってしまい、戻せなくなってしまいます。

System.Classes にある ObjectResourceToText() と ObjectTextToResource() を使えばバイナリ形式フォームの読み書き (テキスト形式への変換) ができるのですが、比較的最近の Unicode 版 Delphi で実行しても Delphi の IDE が行っている変換と同じ挙動にはなりません。

  • Delphi 5 以前のバイナリ形式のフォームを ObjectResourceToText() で変換すると日本語部分は文字化けします。
  • Delphi 6 以前のバイナリ形式のフォームを ObjectResourceToText() で変換すると日本語部分はコントロール文字列に勝手に変換されます。
  • テキスト形式のフォームを ObjectTextToResource() でバイナリ形式のフォームに変換すると日本語部分は Unicode で格納されます。

"ベタ (バイナリ形式) → ベタ (テキスト形式)"、"コントロール文字列 (バイナリ形式) → コントロール文字列 (テキスト形式)" という風に変換されないのが厄介です…RTL と IDE の挙動が違うのも厄介ですけれど。

結論的には Delphi 6 以降のテキスト形式 DFM を使いましょう、という事ですかね。Delphi 5 以前のバイナリ形式対応についてはオマケ扱いだと思ったほうがいいでしょう。

DEKO
管理者
投稿数: 2691
Re: [Software] ChangeCreateOrder
on: 2014/08/06 14:52 Wed

要約すれば、「イロイロ書いた小難しい事を気にせずに使えるようになったよ!」という事です (^^;A

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.50 (再 UL)
on: 2014/08/07 16:47 Thu

[変更点 (2014/08/07)]

  • アーカイブ内のバイナリが古いものである可能性があったので差し替えた。

デバッグビルドでしかコンパイルしていないのに、アーカイブにはリリースビルドフォルダからコピーしたものを含めていました (多分)。改めてリリースビルドで再コンパイルしてアーカイブを作り直しました。機能的にはここでお伝えしている通りです。

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.60
on: 2014/08/09 11:44 Sat

[変更点 (2014/08/09)]

  • 自動デコードの場合、デコードされた文字列中に無駄なシングルクォーテーションが含まれる事がある問題を修正。
DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.70
on: 2014/08/16 00:34 Sat

[変更点 (2014/08/15)]

  • プロパティエディタ部を TEditor Unicode Edition に変更
  • 言語ファイルでエディタフォント名とサイズを変更できるようにした。

[プロパティエディタ部]
見ての通りです。色はトワイライト準拠です。フォントは言語ファイルで変更できます。例えば、

[ChangeCreateOrder.lng]
/* Language File Sample (Japanese)                              */
/* Please put into the same folder as the ChangeCreateOrder.exe */

[Editor]
FontName=IPAゴシック
FontSize=11

 
こんなのを EXE と同じ場所に置くとお好きなフォントとサイズに変更できます。

DEKO
管理者
投稿数: 2691
ChangeCreateOrder ver 2.80
on: 2014/08/16 01:37 Sat

[変更点 (2014/08/16)]

  • プロパティエディタ部でマウスホイールが効かなかったのを修正
  • プロパティエディタ部の調整

※ 続きは↓の [4] をクリック

ページ: 1 2 [3] 4
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.049 sec.