yTakeです。
再び、お尋ねします。
起動時のフォーム作成時にエラーが発生しています。
ステップ実行で追って行くと、"TApplication.CreateForm"の"Instance.Create"でエラーが発生している様です。ここはDELPHIが生成している箇所と思います。
"TCustomForm.Create"を終了するところの"End"をステップ実行すると、”プロジェクト Project6.exe は例外クラス $C0000005(メッセージ'access violation at 0x00408187:read of address 0x00000000')を創出しました。”となります。
特別なコンポーネントは使っていません。
と言うか、これから肉付けをするのですが、、、
なお、エラーメッセージではアクセスバイオレーションでアドレス00000000を参照している事になっていますが、
ここまででコーディングした中でポインターは使っていますが、その部分まで到達する前なので、ポインターの参照ミスではないと思っています。
環境:
Windous7 Ultimate
搭載メモリー4GB
DELPHI XE3
です。
今まで、新規でプロジェクトを作成しても、この様な事は経験なく、何か基本的な設定の誤りの様な気もします。
ご教示もらえる様に、よろしくお願い致します。
外しているかもしれませんが・・・
そのプロジェクトでは、
・フォーム(またはモジュール)は複数ありますか?
・複数ある場合、フォームの「自動作成の対象」の順番は、どのようになってますか?
それぞれのフォームのOnCreateイベントで、(順番によって)まだ生成されていないフォームやモジュールを
アクセスしているとかの可能性はありませんか?
igyさん
ありがとうございます。
フォームやモジュールは複数あるわけではありませんでしたが、良い示唆になりました。
新たにクラスを作成していたのですが、そのクラスオブジェクトの"Create"をフォームの作成時に実行していました。この"Create"をコメントアウトしたら、エラーはなくなりました。
但し、これまで、クラスを作成したら、その利用には変数として宣言した後で、"Create"しないと使用出来ないと認識しています。
このままでは、このクラス変数は利用できません。
このクラスではポインターを用いていますが、変数の"Create"とそのポインターの初期化は別だと思うので、何故、"Create"でエラーになっているのか、分かりません。
なお予断ですが、フォームは何故か"2"からはじまります。また、プロジェクトは自動的にファイル名に"6"が付加されています。何故、1から始らないのか、不思議に思っています。
訂正
誤:予断 −> 正:余談
すみません。
yTakeです。
クラス変数の"Create"の実行のタイミングを変えました。取りあえず、フォームは表示されるようになりました。
しかし、
”プロジェクト Project6.exe は例外クラス $C0000005(メッセージ'access violation at 0x00407a97:read of address 0x00000000')を創出しました。”
となってしまいます。
再度、ステップ実行で追ってみました。
function _AfterConstruction(const Instance: TObject): TObject;
の、
try
Instance.AfterConstruction;
を、実行したら、エラーになります。
これでは、どの変数が引っかかっているのか分かりません。
ポインター変数の使用を止めても改善されません。
そういう問題ではない様に思えてきます。
ご教示願えるでしょうか?
ソースコードが挙げられていないので断言できませんが、
そのクラスのコンストラクタCraeteでのコードに問題があるか、
“クラス変数の"Create"の実行のタイミング”の部分のコードに問題があるかもしれません。
igyさん、ありがとうございます。
ソースが未提示ですみません。
ソースは、クラス定義部分などで良いでしょうか?
type
Tdcm_data = class
TAG_name : String;
group : Word;
element : Word;
VR : Array[ 0 .. 1 ] of AnsiChar;
size : LongWord;
b_data : PAnsiChar;
s_data : String;
procedure read_dcm_file( fname : String );
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
このクラス変数を
var
Form2 : TForm2;
dcm_data_1 : Tdcm_data;
f_endian : Word = 1;
で、宣言しています。
便宜上、Button1をクリックすると、"Create"する様にしています。
本来は、フォームの作成時に済ませておきたい。
procedure TForm2.Button1Click(Sender: TObject);
var
i, j : Word;
n : Word;
fname : String;
begin
dcm_data_1.Create();
if OpenDialog1.Execute() then
begin
n := OpenDialog1.Files.Count;
for i := 0 to n - 1 do
begin
fname := OpenDialog1.Files[ i ];
dcm_data_1.read_dcm_file( fname );
end;
end
else
begin
end;
end;
となっています。
クラス内で手続き(procedure read_dcm_file( fname : String ))を定義して、使用もしていますが、そのソースも必要でしょうか?少々長くなるもので、、、
また、このクラス内手続きを呼び出してのエラーではない(この手続きの使用前のエラー)ので関係ないと思っていますが、違うでしょうか?
よろしくお願いします。
igyさん、
yTakeです。
分かりました。
クラスの初期化が間違っていました。
dcm_data1 := Tdcm_data.Create();
とすべきでした。
上述の通り修正したら無事エラーは生じなくなりました。
ありがとうございました。
ツイート | ![]() |