フォーラム


ゲスト  

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

ページ: 1 [2] 3
トピック: LightReport2 Unicode 版を 64bit 対応にしてみる
DEKO
管理者
投稿数: 2645
9.プロジェクトグループを保存する
on: 2013/06/23 06:56 Sun

一旦ここで保存します。

1.ProjectGroup1 となっている所を右クリックし、"プロジェクトグループに名前を付けて保存…" を選択します。

2.先に "rtlLR_xxx に名前を付けて保存" のダイアログが出ると思いますので、C:\LR2\Packages\(バージョン) フォルダへ名前はそのままで保存します。

3.次に "ProjectGroup1 に名前を付けて保存" のダイアログが出ますので、名前を "LR2_xxx.groupproj" として保存します。

正しく保存されていれば上の画像のようになります。

DEKO
管理者
投稿数: 2645
10.実行時パッケージにファイルを追加する
on: 2013/06/23 07:15 Sun

1.プロジェクトマネージャで rtlLR_170.bpl をダブルクリックしてカレントプロジェクトにします (ボールドになります)。

2.[プロジェクト | プロジェクトに追加] を選択します。

3.以下の 12 個のファイルをプロジェクト (実行時パッケージ) に追加します。

  • LightRep.pas
  • LightRepEx.pas
  • LightRepEx2.pas
  • LightRepPost.pas
  • LRBarImg.pas
  • LRConsts.pas
  • LRDBSpl.pas
  • LRPrvSpl.pas
  • LRSuppl.pas
  • NkDIB.pas
  • NkDIBUtils.pas
  • NkGraph.pas

コンポーネント登録用ユニットとコンポーネントエディタは除外します。

4.比較的新しい Delphi だとフレームワークの追加ダイアログが出ますので、VCL フレームワークを選択します。

プロジェクトマネージャのツリーは以下のようになっていると思います。

DEKO
管理者
投稿数: 2645
11.実行時パッケージの設定を行う
on: 2013/06/23 07:27 Sun

設計時パッケージの時と同様に設定を行います。

1.[プロジェクト | オプション] を開きます。

2."ユニットの出力ディレクトリ" に ".\$(Platform)" を指定します (XE 以降の場合)。
"ターゲット" を "すべての構成 – すべてのプラットフォーム" に変更してから "ユニットの出力ディレクトリ" を設定してください (XE2 以降の場合)。

ここの設定は Delphi のバージョンによって異なります。

・Delphi 2010 以前の場合
ビルド構成: Base
ユニットの出力ディレクトリ: .\$(Config)

・Delphi XE の場合
ビルド構成: Base
ユニットの出力ディレクトリ: .\$(Platform) または .\$(Config)

・Delphi XE2 以降の場合
ターゲット: すべての構成 – すべてのプラットフォーム
ユニットの出力ディレクトリ: .\$(Platform)

 
この設定を行わないと、コンパイル済みユニットが各バージョン共通で Source フォルダに生成されてしまいます。2010 以前では $(Platform) が定義されていませんので、$(Config) を使います。XE またはそれ以前の Delphi には64bit コンパイラが存在しないので、.\$(Config) でいいと思います。面倒くさければこの設定はスキップしても構いませんが、設計時パッケージの設定に合わせておくといいでしょう

3.説明とパッケージの種類を指定します。

説明: LightReport2 Components Runtime Package
用途に関するオプション: 実行時のみ使用可能
ビルド制御: 要求があれば再構築を行う

 

XE またはそれ以前だと、ツリーの "説明" ではなく "情報" の所です。

4.Ctrl+Shift+S で "すべて保存" しておきます。

DEKO
管理者
投稿数: 2645
12.実行時パッケージをビルドする
on: 2013/06/23 07:39 Sun

1.プロジェクトマネージャで実行時パッケージ (rtlLR_170.bpl) をダブルクリックしてカレントプロジェクトにしておきます。

2.[プロジェクト | ビルド (再構築)] か、rtlLR_170.bpl を右クリックして "ビルド" を選択します。

3.パッケージの依存関係解決ダイアログが表示されたら素直に OK ボタンを押します。

コンパイルが成功すれば "実行時パッケージは" とりあえず完成です。

DEKO
管理者
投稿数: 2645
13.設計時パッケージをインストールする。
on: 2013/06/23 07:53 Sun

設計時パッケージはビルドできる事が既に確認できているのでインストールするだけです。

1.プロジェクトマネージャで dclLR170.bpl をダブルクリックしてカレントプロジェクトにしておく。

2.右クリックし、"インストール" を選択する。

3.正常にインストールされると、以下のようなダイアログが表示される。

4.Ctrl+Shift+S ですべて保存する。

これでとりあえずはコンポーネントとして使えるようになりました。しかし、コンポーネントツールバーに並んだアイコンにマウスカーソルを持っていくと…

まだ64bit 化は終わっていません。以降のトピックはパッケージのチューニング作業となります。

DEKO
管理者
投稿数: 2645
コーヒーブレイク 2
on: 2013/06/23 08:03 Sun

ちょっと休憩。ここまでで

  • 設計時パッケージと実行時パッケージの分離
  • コンポーネントエディタの分離

は完了して、Win32 プロジェクトであれば普通にコンポーネントとして使えるようになりました。

この段階で手順を繰り返してすべてのバージョンのパッケージを作ってもいいのですが、最後まで見てから他のバージョンのパッケージを作る事をオススメします。

DEKO
管理者
投稿数: 2645
14.設計時パッケージで実行時パッケージを使うように設定する
on: 2013/06/23 08:48 Sun

これまでの作業で (Win32 アプリケーション用) コンポーネントとして使えるようにはなりましたが、設計時パッケージと実行時パッケージで重複してユニットを登録しています。これでは双方に同一のユニットが含まれる事になり、パッケージが肥大化してしまいます。

そこで、実行時パッケージを設計時パッケージから参照するようにしてみます。こうすれば重複したユニットが含まれる事もなく、パッケージの肥大化を防ぐ事が出来ます。

1.Delphi で LR2_170.groupproj を開く。

2.設計時パッケージに含まれるユニットのうち、

  • LightRepReg.pas
  • LRSplReg.pas
  • LRVer.pas

上記 "コンポーネント登録ユニット" と "コンポーネントエディタユニット" を除いてすべて削除。

3.同様に Requires からコンポーネントが使っていたパッケージを削除。

具体的には "DesignIDE.dcp" だけ残す (コンポーネントエディタには DesignIDE が必要なため)。

4.Requires を右クリックして "参照の追加"

5.パッケージ名に "rtlLR2_170" と直接入力し、必須 (依存) パッケージとして実行時パッケージを指定する。

上記作業で、設計時パッケージのツリーは以下の画像のようになります。

6.Delphi 2010 以降なら dclLR2_170.bpl を右クリックし、

1.アンインストール
2.クリーンナップ
3.インストール

 
で、コンポーネントの再インストールを行う。

Delphi 2009 には "アンインストール" がないので、

1.[コンポーネント | パッケージのインストール] で LightReport2 のパッケージのチェックを外す。
2.クリーン
3.インストール

 
このような手順となる。

この "アンインストール->クリーンナップ->インストール" の手順のうち、クリーンナップ (或いはアンインストール) を省いても正しくインストールされる事が多いのですが、私はトラブルを避けるためにルーチンワークとしてこの3点を1セットにしてパッケージを再インストールしています。

64bit 化が必要ないのであれば、ここまでの作業を必要なすべてのバージョンのパッケージに対して行ってください。先に断っておきますが、これ以降の 64bit 化作業を Delphi 2009~XE のパッケージに対して行っても何ら問題はありません。

DEKO
管理者
投稿数: 2645
15.コンポーネントを 64bit 化する
on: 2013/06/23 09:41 Sun

64bit 化する方法には 2 通りあります。一つはパッケージに含まれるすべてのコンポーネントを 64bit で有効にするもの、そしてもう一つはパッケージに含まれるコンポーネント単位で 64bit の有効 / 無効を設定するものです。

後者は、コンポーネントクラスに属性を付けます。方法については以下を参照してください。

[64bit 対応コンポーネント]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=44

前者はリソースとして PLATFORMTARGETS (RCDATA) を埋め込むというものです。優先順位としては属性の方が PLATFORMTARGETS よりも先になります (属性で PLATFORMTARGETS をオーバーライドできるという事です)。LightReport2 では特定のコンポーネントのみ 32bit でしか動かない道理はありませんので、PLATFORMTARGETS をリソースに埋め込む方法で 64bit 化してみます。

1.実行時パッケージ (rtlLR2_170.bpl) をダブルクリックしてカレントプロジェクトにしておく。

2.[ファイル | 新規作成 | その他]

3.テキストファイルを選択

4.テキストファイルの種類として "Resource Script (*.rc)" を選択する。

5.内容として 1 行のみ記述する。

PLATFORMTARGETS        RCDATA {3}

 
6.[ファイル | 名前を付けて保存]

7.C:\LR2\Source に x64res.rc という名前で保存。

8.プロジェクトマネージャから rtlLR2_170.bpl を右クリックし、"ソースの表示" 以下のように書き換える。

package rtlLR2_170;

{$R *.res}
{$R x64res.res x64res.rc} // <- これを追加
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
...

 
9.実行時パッケージを "クリーンナップ->ビルド"

10.設計時パッケージを "アンインストール->クリーンナップ->インストール"

11.[ツール | オプション] で "64ビット Windows" のライブラリパスにも "C:\LR2\Source" を追加しておく。

12.Delphi を再起動して確認 (恐らく再起動後でないと反映されません)。

これで 64bit 対応になります。

DEKO
管理者
投稿数: 2645
16.挙動不審な PLATFORMTARGETS
on: 2013/06/23 11:04 Sun

DocWiki の以下の情報によると、コンポーネントアイコンで 64bit 対応かどうかを判断しているのは実行時パッケージだとあります (普通に考えたら設計時パッケージな気がするのですが、英語版 DocWiki にも Run-Time とありました)。

[設計時および実行時に利用可能なコンポーネント (DocWiki)]
http://bit.ly/19fCpCz

そこで、プロジェクト (実行時パッケージ) に *.rc を追加しているのですが、パッケージファイルに自動でリソース読み込み指定が追加されないため、手動で追加しています。つまりはどうにかして実行時パッケージ (*.bpl) に PLATFORMTARGETS (3) を含めてやればいいのですが、DocWiki を読む限りこのフラグはコンパイラ (IDE) が自動で付け加えるようです。しかしながら、その設定場所については明言されておらず、プロジェクトオプションで設定できるのかどうかも不明です。

C:\Users\Public\Documents\RAD Studio\<n.n>\Bpl にある bpl (実行時パッケージ) をリソースエディタで開き、PLATFORMTARGETS が 1 になっていれば 3 に書き換える事で 64bit 化が確実にできるようです。ただ、どこかにこの設定のキャッシュがあるようで、一旦 64bit 対応だとみなされると、PLATFORMTARGETS を 1 に戻しても 64bit 対応のままになります (なる事があります)。正直ワケがわかりません。

# 症状的には "コンポーネントアイコンが正しく表示されない事がある件" に似ています。


※ 今回の方法で PLATFORMTARGETS を埋め込むと 2 つのリソースが登録されます。一つにする方法もありますが、それだと今度は Duplicate Resource のワーニングが出ます。

  • *.bpl を直接触った時
  • 属性で PLATFORMTARGETS をオーバーライドした時
  • *.dcr に PLATFORMTARGETS を含めた時 (なんで設計時パッケージ見てるん?)

これらの方法を行った場合には、比較的意図した通りに反映される気がします。ただ、最後の方法は、パッケージ内に複数のコンポーネントアイコンファイルがあると "Duplicate Resource" の警告を拝む事になります。もちろん、一つだけに PLATFORMTARGETS を含めておけばいいのですが、どれに含めたのか忘れそうで怖いですね (^^;A

そんなこんながありまして、面倒でなければクラスに属性を付けて 64bit 対応を明示した方がいいような気がします。

# 自分の環境では 64bit 対応になっているのに、
# 配布先では 64bit 対応にならないとかありそうで本当に怖いです (^^;A

DEKO
管理者
投稿数: 2645
17.雑多な情報
on: 2013/06/23 17:06 Sun

XE2 以降で uses の所でユニットスコープを XE 以前のような省略形式にしている場合、正しいユニットなのにコンパイルできない事があります。
例えば uses に Jpeg が記述されていて、Ctrl+Enter でちゃんと開けるのにコンパイルできないというものです。

これを解決するには、プロジェクトオプションの "ユニットスコープ名 (または 名前空間プレフィクス)" にユニットスコープを追加します。例えば先程の Jpeg だと、Ctrl+Enter して得られるユニットファイル名は Vcl.Imaging.Jpeg ですから、"ユニットスコープ名" に Vcl.Imaging を追加します。

…なので、パッケージを作る際にはそのパッケージが対象とするコンパイラでパッケージを作って確認する作業が必要となります。横着して一つのコンパイラで他のバージョンのパッケージを作ってはいけません (^^;A

すべてのパッケージを整備すると、以下のようなツリーになると思います。

C:\LR2
├─Packages
│ ├─2009
│ │ dclLR2_120.dpk
│ │ dclLR2_120.dproj
│ │ dclLR2_120.res
│ │ LR2_120.groupproj
│ │ rtlLR2_120.dpk
│ │ rtlLR2_120.dproj
│ │ rtlLR2_120.res
│ │
│ ├─2010
│ │ dclLR2_140.dpk
│ │ dclLR2_140.dproj
│ │ dclLR2_140.res
│ │ LR2_140.groupproj
│ │ rtlLR2_140.dpk
│ │ rtlLR2_140.dproj
│ │ rtlLR2_140.res
│ │
│ ├─XE
│ │ dclLR2_150.dpk
│ │ dclLR2_150.dproj
│ │ dclLR2_150.res
│ │ LR2_150.groupproj
│ │ rtlLR2_150.dpk
│ │ rtlLR2_150.dproj
│ │ rtlLR2_150.res
│ │
│ ├─XE2
│ │ dclLR2_160.dpk
│ │ dclLR2_160.dproj
│ │ dclLR2_160.res
│ │ LR2_160.groupproj
│ │ rtlLR2_160.dpk
│ │ rtlLR2_160.dproj
│ │ rtlLR2_160.res
│ │ x64res.res
│ │
│ ├─XE3
│ │ dclLR2_170.dpk
│ │ dclLR2_170.dproj
│ │ dclLR2_170.res
│ │ LR2_170.groupproj
│ │ rtlLR2_170.dpk
│ │ rtlLR2_170.dproj
│ │ rtlLR2_170.res
│ │ x64res.res
│ │
│ └─XE4
│ dclLR2_180.dpk
│ dclLR2_180.dproj
│ dclLR2_180.res
│ LR2_180.groupproj
│ rtlLR2_180.dpk
│ rtlLR2_180.dproj
│ rtlLR2_180.res
│ x64res.res

└─Source
LightRep.pas
LightRepEx.pas
LightRepEx2.pas
LightRepPost.pas
LightRepReg.dcr
LightRepReg.dfm
LightRepReg.pas
LRBarImg.dcr
LRBarImg.pas
LRConsts.pas
LRDBSpl.pas
LRPrvSpl.pas
LRSplReg.dcr
LRSplReg.pas
LRSplRegp.dcr
LRSplRegp.pas
LRSuppl.pas
LRVer.dfm
LRVer.pas
Nkdib.inc
NkDIB.pas
NkDIBUtils.pas
NkGraph.pas
PostBarcode.res
x64res.rc

 
今回の修正で 64bit 化はできましたが、それはあくまでコンポーネントパッケージの話で、コンポーネント自体が 64bit アプリケーションで正しく動くかどうかはまた別の話になります…なので、コンポーネント自体が 64bit アプリケーションで動作するかどうかの検証を行ってから LightReport2 のアーカイブを更新する事にしたいと思っています。

また、現状のアーカイブ (lr251u_rel9.zip) はこの記事を後日読まれた方の勉強用としてどこかに残しておく事にします。

See Also:
[ユニット スコープ名]
http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88_%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%90%8D

[ユニット名とユニット スコープ名の対応(アルファベット順一覧)]
http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E5%90%8D%E3%81%A8%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88_%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%90%8D%E3%81%AE%E5%AF%BE%E5%BF%9C%EF%BC%88%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88%E9%A0%86%E4%B8%80%E8%A6%A7%EF%BC%89

※ 続きは↓の Page: 3 をクリック。

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