Delphi4で作成されたプログラムで
「.DB」「.PX」というデータベースファイル?を扱っていますが、これは何のデータベースのファイルなのかご存知の方はいないでしょうか。
また、ソース内を見るとエリアス指定で接続しているのですが
エリアス指定をしているテキストファイルはデフォルトではどこに存在するのでしょうか?(FireBirdならFirebirdインストールフォルダのaliases.confに記述してあるといったような)
最後に、Delphi4で作成されたこのプログラムをWindows7,64bitに対応させることは可能でしょうか?インストーラーが16bitのようで、Windows7,64bitにはインストールすらできませんでした。
よろしくお願いします。
.dbファイルはsqliteで使用していますね
*.DB、*.PXはPARADOX、つまりBDEだと思います。
BDEについては色々な方々がこの掲示板でも述べられていますので、お探しいただければよろしいかと思います。
> 「.DB」「.PX」というデータベースファイル?
Paradox 形式のテーブルです。
Paradox は 1 ファイルが 1 テーブルなので、*.DB がテーブルとなります。
*.PX はそのテーブルのインデックスファイルです。
> エリアス指定をしているテキストファイル
環境設定ファイルはテキストファイルではありません。
BDE のエリアスはコントロールパネルにある "BDE Administrator" で設定します。
> Delphi4で作成されたこのプログラムをWindows7,64bitに対応させることは可能でしょうか?
BDE そのものにイロイロと問題があります。
[今更ながら BDE (Borland Database Engine)]
http://ht-deko.minim.ne.jp/tech024.html
ADO 接続 (ODBC) で書き換えればまだマシですが...
[ADO (dbGo) で ODBC ドライバを使って dBASE / Paradox ファイルを開く]
http://ht-deko.minim.ne.jp/tech075.html
残念ながら、dbGo (ADO Express) は Delphi 5 以降にしか存在しません。
# Paradox ファイルをそのまま使うのであれば、
# 個人的には Delphi 2007 の dbGo で書き換えた方がいいとは思います。
こちらにも書いておきますが、
BDE を Vista 以降の OS で動作させるのは非推奨となっています。
[BDE の再構成(非推奨)- XE3 のリリースノート]
http://docwiki.embarcadero.com/RADStudio/XE3/ja/XE3_%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9_%E3%83%8E%E3%83%BC%E3%83%88#BDE_.E3.81.AE.E5.86.8D.E6.A7.8B.E6.88.90.EF.BC.88.E9.9D.9E.E6.8E.A8.E5.A5.A8.EF.BC.89
>初心者さん、GT-BASSさん、DEKOさん
ありがとうございます。
確認しますと
・データベース名:Paradox
・接続方法:BDE
・エリアス設定:BDE Administratorで行う(設定できました)
という認識で大丈夫でしょうか。
Paradoxデータベースについてなのですが、このテーブルの中身を確認したい場合なんというソフトで中身を見ればよいのでしょうか?
(FirebirdならIBConsole、PervasiveならPervasive Control Centerで見られるといったような)
また、使用できる環境としてDelphi4,5,6,7,2009があるですが
このプログラムをWindows7,64bitに対応させようと考えた場合
・Delphiの5,6,7,2009で修正する
・データベースは現在使用しているParadoxをそのまま使える
・ソース内のBDE接続部分をADO接続に書き換える
を行う必要があるという認識でよいでしょうか?
試しにDelphi6でコンパイルを行ってみたのですが、プロパティ,dcuファイル,pasファイルが見つかりませんというエラーが大量に出てしまいました。
プロパティは恐らくDelphi4から6でなくなったものだと考えられます。
表示されたdcu,pasファイル名を検索したところ*.dcuはプログラムのOBJフォルダ、*.pasはDelphi4のLibフォルダ内に存在するものでした。
これらのパスをDelphi6のライブラリパスに追加してみましたが、「*.pasユニットはコンパイルできませんでした」と致命的エラーが出てしまいました。
このことから考えると、現在あるDelphi4で作成されたソースを参考程度に、Delphi5,6,2009で作り直す(ほぼ新規作成のような状態)しかないということでしょうか?
Delphi4で作成されたソースをそのまま流用しようとしても、最低でも見つからないプロパティが何でそれがDelphi2009でどれに対応しているかを調べ修正する。上記のでコンパイルできないユニットについて原因を調べる。などの作業(他にもまだ問題が出てくる可能性が高い)でかなりの時間が必要だと考えられるのですが。
> Paradoxデータベースについてなのですが、
> このテーブルの中身を確認したい場合なんというソフトで中身を見ればよいのでしょうか?
%ProgramFiles%\Program Files\Common Files\Borland Shared\Database Desktop
あるいは、
%ProgramFiles%\Program Files\Common Files\Codegear Shared\Database Desktop
にある "データベースデスクトップ (dbd32.exe)" で見れます。
# ODBC 経由なら Access とかでも見れます。
> このプログラムをWindows7,64bitに対応させようと考えた場合
> ・Delphiの5,6,7,2009で修正する
> ・データベースは現在使用しているParadoxをそのまま使える
> ・ソース内のBDE接続部分をADO接続に書き換える
> を行う必要があるという認識でよいでしょうか?
64bit アプリケーションだと XE2 以降が必要ですが、
64bit OS で 32bit アプリケーションを動作させるのであれば、そのようになります。
# 64bit アプリの場合、そもそも BDE が使えません。
ただ、DB を Paradox のままにするのであれば、
Unicode 版 Delphi は使わない方がいいように思います。
Paradox は Unicode 固有の文字を格納できないからです。
"ADO 接続 (ODBC) で書き換えればまだマシ" というのは、
BDE を排除できるという観点からであって、本格的にやろうと思ったら、
DB の変更も視野に入れなくてはなりません。
> このことから考えると、現在あるDelphi4で作成されたソースを参考程度に、
> Delphi5,6,2009で作り直す(ほぼ新規作成のような状態)
> しかないということでしょうか?
現物を見たわけではないのでハッキリとは言えませんが、
コンパイルするのに必要なファイルが揃ってないようにも思えます。
以下を試して検証して下さい。
1.Delphi 4 でコンパイルできる事を確認する。
2.プロジェクト一式を Delphi 7 用の別フォルダにコピーする。
3.足りないと言われたファイルが Borland 製でないのなら、
Delphi 4 の lib フォルダからプロジェクトフォルダへコピー。
(テキストエディタで開いて見ればヘッダコメントで Borland 製かどうか判ります)
4.Delphi 7 で再構築 (コンパイルではない) してみる。
Delphi 7 でコンパイルできれば、その後の作業は比較的楽だと思います。
何らかの外部コンポーネントが Delphi 4 専用で、
バイナリ (*.dcu) でしか提供されていないのなら厄介ですね。
> かなりの時間が必要だと考えられるのですが。
...必要ですね。誰のせいでもないでですけれど。
お客さんが改修費用を捻出できないのであれば、
不具合があっても現状のまま使って貰うしかないです。
(プログラムのバグとかは別として)
私んトコも幾つか BDE のままのアプリがありますよ (元は 3.1 〜 5 で作られた)。
自衛策として Delphi 7 / Delphi 2007 へすべてマイグレーションしてありますけどね。
(Vista 対応と BDE の不具合回避込みで)
>DEKOさん
返答ありがとうございます。
なかなか取り掛かれず返答遅れて申し訳ありません。
データベースの中身は指定のプログラムで見ることができました。
>64bit OS で 32bit アプリケーションを動作させるのであれば、そのようになります。
その通りで、64bit OS で 32bit アプリケーションを動作させる予定です。
現在教えていただいた手順通り
>1.Delphi 4 でコンパイルできる事を確認する。
>2.プロジェクト一式を Delphi 7 用の別フォルダにコピーする。
>3.足りないと言われたファイルが Borland 製でないのなら、
> Delphi 4 の lib フォルダからプロジェクトフォルダへコピー。
> (テキストエディタで開いて見ればヘッダコメントで Borland 製かどうか判ります)
>4.Delphi 7 で再構築 (コンパイルではない) してみる。
のようにWindows7 64bi OS 上で確認を行っています。
Delphi4上でコンパイルは可能で、コンパイルしたexeを起動してもエラーが出ずに動作するのですが、Delphi4上で実行、ステップ実行を行うとエラーが出てしまいました。エラー内容は以下の通りです。
>プロジェクト *.exeが*クラスの例外を生成しました。""は数値ではありません。'プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
エラーについて調査しつつ、現在の段階でDelphi7で再構築可能かどうかを試してみたいと思います。
.PDデータベースが何か、操作方法はどうするか、については分かりましたので、一応解決チェックを入れておきます。
> Delphi4上で実行、ステップ実行を行うとエラーが出てしまいました。エラー内容は以下の通りです。
これは元からあった問題のようですね。
StrToInt() か何かに空文字列を渡しているように思います。
ステップ実行を続行して、仕様上の問題がなければこのままでもいいと思います。
# try〜finally で括ってあるとか。
>DEKOさん
ご指摘の通りStrToInt()で日付に空文字列を渡していました。
Delphi4でコンパイルは通ったのでDelphi7用のフォルダにコピーして再構築を行ったところ。
"[致命的エラー] *.pas:'OrgDB.pas'ユニットはコンパイルできませんでした"
と出たので、OrgDB.pasとOrgDB.dcrをDelphi4用LibフォルダからDelphi7用Libフォルダへコピーしました。
OrgDB.dcuはプロジェクトフォルダのオブジェクトをまとめているフォルダ内に最初から存在していました。
上記を作業後再構築を行ったところ。
"[エラー] OrgDB.pas: プロパティ'*'は基本クラスに存在しません"
というエラーが7個出た後に
"[致命的エラー] *.pas:'OrgDB.pas'ユニットはコンパイルできませんでした"
と表示され再構築が行えませんでした。
OrgDB.pasを見たところBorland製ではありませんでした。
これはつまりOrgDB.pasがDelphi4にしかないプロパティを変更しているのでコンパイルエラーが起きているという認識でよいでしょうか?
そしてこのエラーを解決するにはOrgDB.pasで変更を行っている内容を理解し、Delphi7上で作成しなおすしかないでしょうか?
よろしくお願いします。
OrgDB.pas内を確認したところ
見つからないプロパティのエラーが出る部分で参照していたものが
・DateEdit.pas
・NumEdit.pas
の2つでした。(両ファイル共Borland製ではありませんでした。)
それぞれのdcu,pas,dcrファイルはDelphi4とDelphi7の開発用フォルダ両方にありましたが、ファイルサイズが違い中身が違うものでした。
なのでDelphi4のものをDelphi7の開発用フォルダへコピーしました。
上記作業後Delphi7上で再構築を行ったところ、再構築は行えたのですが
アプリ起動時にアドレスの読み込み違反が起き、起動後一部フォームでは「'システムエラー。コード:1400.ウィンドウハンドルが無効です。'」というエラーが出て正常に動作しませんでした。
これは何が原因と考えられるでしょうか?
見当がつかないので何を調べればいいかというようなヒントでもいいので教えていただけるとありがたいのですが。
よろしくお願いします。
こちらには現物がないので、
> 'システムエラー。コード:1400.ウィンドウハンドルが無効です。'
だけでは判断できかねます。
地道にステップ実行してエラーが出ている箇所を突き止めるしかないと思います。
それと、すべてのフォームをフォームデザイナで開いていないのであれば、
一旦すべてのフォームをフォームデザイナで開いてみてください。
フォーム絡みの問題が解決することがあります。
(ついでにテキスト形式 DFM に変換する事をオススメします)
>それと、すべてのフォームをフォームデザイナで開いていないのであれば、
>一旦すべてのフォームをフォームデザイナで開いてみてください。
>フォーム絡みの問題が解決することがあります。
>(ついでにテキスト形式 DFM に変換する事をオススメします)
一度Delphi7上で全てのフォームをフォームエディタで開いてみたところ
一部フォームで'プロパティColorPlusは存在しません'
と出てしまいました。
この見つからないプロパティは2012/11/26(月) 09:51:27に書き込んだ時のものの1つと同じでした。
Delphi4上で同じフォームを開いたときにエラーは出ませんでした。
フォームは全て元からdfm形式でした。
>こちらには現物がないので、
>> 'システムエラー。コード:1400.ウィンドウハンドルが無効です。'
>だけでは判断できかねます。
そうですね…当たり前の話でした。申し訳ありません。
順に追ってみたところ起動時に起きるメモリ読み込みエラーはDelphi4からコピーしたDateEdit.pas内でStrToInt()に空文字列を入れ、その後の和暦→西暦変換する際の
>try
> iYear := StrToInt(Copy(sText, 2, 2))
でsTextが空文字列のためエラーが起き、exceptに飛んでExit;が実行されたときに起こっていました。
※iYearには本来'H24/11/24'という形式でデータが入っています。
これに関しては空文字列を渡さないようにしたところメモリ読み込みエラーは起きなくなりました。
一部フォーム起動時に起きるエラーは、Orders.pas、Nyukin.pas内のフォームのボタンのサイズと位置を調整する手続きをend;で終わるときにエラーが出ていました。
Order.pas、Nyukin.pas共にフォームエディタで開いたときに'プロパティColorPlusは存在しません'と出ていました。
実際に行っている内容は以下の通りです。省略していますが実際にはボタン12まで同様の操作を行っています。
>begin
> nWidth := Trunc((FunctionBar.Width-8)/12);
> nSpace := Trunc((FunctionBar.Width-nWidth*12-8)/2);
> FncBtn1.Width := nWidth;
> FncBtn2.Width := nWidth;
> …
> FncBtn1.Left := nSpace;
> FncBtn2.Left := nWidth+nSpace;
> …
>end; //ここでエラーが起きます。
このend;で抜けた際に
Orders.pasだと'システムエラー。コード:1400.ウィンドウハンドルが無効です。'
Nyukin.pas'モジュール '*.exe' のアドレス 0045CD03 でアドレス BA89C602 に対する読み込み違反がおきました。'
と出てフォームが表示されず、その後はボタンをクリックするとエラーが起きずにフォームは表示されないという状況でした。
※DateEdit、NumEdit共にDelphi7ではdclorg70.dpk、Delphi4ではdclorg40.dpk内に存在し、コンポーネントとして追加されているものです。
> フォームは全て元からdfm形式でした。
これは有り得ません。
Delphi 4 の DFM は "バイナリ形式 DFM" だからです。
http://ht-deko.minim.ne.jp/tech032.html#tech061
エラーが出たフォームはキャンセルせずに、無視で続行して下さい。
この結果プロパティが失われますが、そうしないと実行時に問題が起きます。
DateEdit、NumEdit は Delphi 4 のコンポーネントではなく、
どなたかが作られたコンポーネントです。
そして、プロパティが存在しないと言われてしまう事から、
コンポーネントのバージョンが一致していないような気がします。
>これは有り得ません。
>Delphi 4 の DFM は "バイナリ形式 DFM" だからです。
>http://ht-deko.minim.ne.jp/tech032.html#tech061
dfmファイルにも種類があるのですね、参考になりました。ありがとうございます。
>エラーが出たフォームはキャンセルせずに、無視で続行して下さい。
>この結果プロパティが失われますが、そうしないと実行時に問題が起きます。
>そして、プロパティが存在しないと言われてしまう事から、
>コンポーネントのバージョンが一致していないような気がします。
以下に行った作業順位を書き出してみます。
1.Delphi7上でdclorg40.dpkを開く
→このパッケージは古い形式で記述されています。新しい形式に変換してもよろしいですか?→はいを押す。
2.インストールボタンを押す。
→「パッケージ 'dclorg70' にもユニット 'NumEdit' が含まれるためパッケージ 'dclorg40' は読み込めません。」とエラーが出る。
3.コンポーネント>パッケージのインストールからdclorg70.bplのOriginal Componentsを削除
4.再度1.を実行後、インストールボタンを押す。
→パッケージ c:\program files (x86)\borland\delphi7\Projects\Bpl\dclorg40.bpl がインストールされました。
以下のコンポーネントが登録されました : DateEdit.TDateEdit, NumEdit.TNumEdit, OrgDB.TDBDateEdit, OrgDB.TDBNumEdit
5.Delphi7で再構築を行う
→[致命的エラー] Nyukin2.pas(8): ファイル 'OrgDB.dcu' が見つかりません
6.Delphi4のLibフォルダからOrgDB.pasをDelphi7のLibフォルダへコピー
7.Delphi7で再構築を行う
→
[エラー] OrgDB.pas(104): プロパティ 'ColorPlus' は基本クラスに存在しません
[エラー] OrgDB.pas(204): プロパティ 'Format' は基本クラスに存在しません
[エラー] OrgDB.pas(215): プロパティ 'Separator' は基本クラスに存在しません
[エラー] OrgDB.pas(220): プロパティ 'YearLong' は基本クラスに存在しません
[エラー] OrgDB.pas(549): 未定義の識別子 : 'EditText'
[エラー] OrgDB.pas(612): 未定義の識別子 : 'EditText'
[エラー] OrgDB.pas(635): 未定義の識別子 : 'EditText'
[致命的エラー] Nyukin2.pas(8): 'OrgDB.pas' ユニットはコンパイルできませんでした
8.上でプロパティエラーが出るものはNumEdit.pas、DateEdit.pasを参照している部分だったので、Delphi4のLibフォルダからDelphi7のLibフォルダへコピー
9.Delphi7で再構築を行う
→コンパイルエラーは起きなくなった
10.Delphi7上でフォームエディタで全てのフォームを順に開いていく
→クラスTNumEditが見つかりません。エラーを無視して続けますか?
クラスTDateEditが見つかりません。エラーを無視して続けますか?
というエラーが多くのフォームで出たため、全て無視
11.Delphi7錠で再構築を行う
→フィールド*.*に対応するコンポーネントがありません。宣言を削除してよいですか?
というメッセージが大量に出たため全てはいを押すと、コンパイルエラーがかなりの数出てしまいました。
全ていいえを押すと、コンパイルは行えました。
行った作業は以上です。
確認のためDelphi4上でコンポーネント>パッケージのインストールからdclorg40.bplのOriginal Componentsを削除。
Delphi4を再起動後dclorg40.dpkを開いてインストールを押したところ4.のようなメッセージでコンポーネントが登録されたと出ました。
この後Delphi4上で再構築を行ったところコンパイルエラーは出ませんでした。
フォームを順に開いていったところ、バックアップ、リストアを行っているフォームで
'クラスTFileOperationが見つかりません。エラーを無視して続けますか?'
と表示され全てを無視を押した後は11.と同じでした。
Delphi4でコンパイルを行ったexeはエラーが出ませんが
Delphi7でコンパイルを行ったexeは2012/11/28(水) 14:04:49に書いたようなエラーが起こってしまします。
同じdclorg40.dpkをインストールしているのですが、これ以外に何か確認する点があるということでしょうか?
無茶な事をされている印象が否めません。
1.現存するコンポーネント/ユニットと、ソースコード中で使われている
コンポーネント/ユニットのバージョンが異なっているように思える。
(4->7 への移行でプロパティがないと言われているので)
2.(4) で TNumEdit が登録されているのに、(10) で存在しないと言われているので、
パッケージが外れてるように思える。
1.はひょっとしたらどうしようもない (作者不明なため) かもしれませんが、
2.を解決しないまま (10) を行うと "フォームに貼ったコンポーネントのプロパティ" ではなく、
"コンポーネントそのもの" が失われてしまうので、マトモに動作しなくなると思います。
まずは Mr.XRAY さんの "コンポーネントの登録方法等 概要" をご一読ください。
http://mrxray.on.coocan.jp/Delphi/CompoInstall/index.htm
それと、直接 Lib フォルダへコピーするのではなく、"任意で作ったフォルダ" にコンポーネントをコピーすると、
そのプロジェクトに足りないファイルだけが抽出できるので問題の解決に役立つと思います。
(もちろん、ライブラリパスは通してくださいね)
ありがとうございます。
一度作成されていたLibフォルダ(C:\Program Files (x86)\Borland\Delphi7\Libフォルダではなく、以前から存在していた別の場所にあるコンポーネント用.pasなどが入っているLibフォルダ)をライブラリパスからはずし、任意のフォルダ「testLib」を作り、ライブラリパスを通して作業を行いました。
コンポーネントに関してはMr.XRAYさんのコンポーネント登録方法を読みながらdclorg40.dpkの登録を行ったところ(10)の現象は起きなくなりました。
コンポーネントインストール後に上書き保存を行っていなかったことが原因のようでした。申し訳ありません…
>http://ht-deko.minim.ne.jp/tech032.html#tech061
を参考にバリナリ形式dfmファイルをテキスト形式dfmに変換して作業を行ったところ出てくるエラーが変わってしまったのでまたテストを行ってみます。
最悪Delphi7への移行が困難な場合
>http://ht-deko.minim.ne.jp/tech024.html
にあるように
・1つのプロセッサだけで動くよう設定をする
・PDOXUSRS.NET がドライブルートに生成されないようにする
以上をソース内に追記、Delphi4でコンパイルし、BDEを含めた32bitのインストーラーを作成すれば64bitOSへインストールし動作させることは可能でしょうか?
> 最悪Delphi7への移行が困難な場合
> >http://ht-deko.minim.ne.jp/tech024.html
> にあるように
> ・1つのプロセッサだけで動くよう設定をする
> ・PDOXUSRS.NET がドライブルートに生成されないようにする
加えて、
・エラー $2503: Insufficient disk space.
対策も行う必要があります。
> 64bit OS へインストールし動作させることは可能でしょうか?
可能か不可能かと言われれば可能だとは思いますが、
アプリケーション内部でどういった処理をしているのかを
詳細に把握できていない (当方は現物を見た訳ではない) ため、保証はできかねます。
[Windows 7 Enterprise 評価版 ダウンロード]
http://technet.microsoft.com/ja-jp/evalcenter/cc442495.aspx
Windows 7 64bit の評価版で実際に試してみる事をオススメします。
ありがとうございます。
Delphi4→Delphi7の移行作業を行いつつ、
VMWareにWindows 7 64bit評価版を入れてテストを行ってみようと思います。
ツイート | ![]() |