起動時のフォーム作成でエラー?

解決


yTake  2014-02-03 21:01:18  No: 45988

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

です。

今まで、新規でプロジェクトを作成しても、この様な事は経験なく、何か基本的な設定の誤りの様な気もします。

ご教示もらえる様に、よろしくお願い致します。


igy  2014-02-03 22:24:57  No: 45989

外しているかもしれませんが・・・

そのプロジェクトでは、
・フォーム(またはモジュール)は複数ありますか?
・複数ある場合、フォームの「自動作成の対象」の順番は、どのようになってますか?
  それぞれのフォームのOnCreateイベントで、(順番によって)まだ生成されていないフォームやモジュールを
  アクセスしているとかの可能性はありませんか?


yTake  2014-02-04 08:39:12  No: 45990

igyさん
ありがとうございます。

フォームやモジュールは複数あるわけではありませんでしたが、良い示唆になりました。

新たにクラスを作成していたのですが、そのクラスオブジェクトの"Create"をフォームの作成時に実行していました。この"Create"をコメントアウトしたら、エラーはなくなりました。
但し、これまで、クラスを作成したら、その利用には変数として宣言した後で、"Create"しないと使用出来ないと認識しています。
このままでは、このクラス変数は利用できません。
このクラスではポインターを用いていますが、変数の"Create"とそのポインターの初期化は別だと思うので、何故、"Create"でエラーになっているのか、分かりません。

なお予断ですが、フォームは何故か"2"からはじまります。また、プロジェクトは自動的にファイル名に"6"が付加されています。何故、1から始らないのか、不思議に思っています。


yTake  2014-02-04 09:16:59  No: 45991

訂正

誤:予断  −>  正:余談

すみません。


yTake  2014-02-04 09:48:41  No: 45992

yTakeです。

クラス変数の"Create"の実行のタイミングを変えました。取りあえず、フォームは表示されるようになりました。
しかし、
”プロジェクト Project6.exe は例外クラス $C0000005(メッセージ'access violation at 0x00407a97:read of address 0x00000000')を創出しました。”
となってしまいます。

再度、ステップ実行で追ってみました。
function _AfterConstruction(const Instance: TObject): TObject;
の、
  try
    Instance.AfterConstruction;
を、実行したら、エラーになります。 

これでは、どの変数が引っかかっているのか分かりません。

ポインター変数の使用を止めても改善されません。
そういう問題ではない様に思えてきます。

ご教示願えるでしょうか?


igy  2014-02-04 17:25:58  No: 45993

ソースコードが挙げられていないので断言できませんが、
そのクラスのコンストラクタCraeteでのコードに問題があるか、
“クラス変数の"Create"の実行のタイミング”の部分のコードに問題があるかもしれません。


yTake  2014-02-04 20:42:00  No: 45994

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 ))を定義して、使用もしていますが、そのソースも必要でしょうか?少々長くなるもので、、、

また、このクラス内手続きを呼び出してのエラーではない(この手続きの使用前のエラー)ので関係ないと思っていますが、違うでしょうか?

よろしくお願いします。


yTake  2014-02-04 20:54:18  No: 45995

igyさん、
yTakeです。

分かりました。

クラスの初期化が間違っていました。

dcm_data1 := Tdcm_data.Create();

とすべきでした。

上述の通り修正したら無事エラーは生じなくなりました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加