EAccessViolationエラーの生成

このQ&Aのポイント
  • C++Builder 5.0でプログラムを作成し、Form1~Form3を作成し、Form1を自動生成の対象及びメインフォームとしました。Form1にはボタン1、Form2にはボタン2を用意し、ボタン1からはForm2を、ボタン2からはForm3を開くことが出来るようにしました。Form1のボタン1にはTForm2 *Form2 = new TForm2(Application); Form2->Show(); Form1->Hide();と記述し、Form2のボタン2にはTForm3 *Form3 = new TForm3(Application); Form3->ShowModal(); ← Form3はモーダルフォームと記述しました。Form1とForm2のPublic部にint型の変数iとjを用意し、Form3からForm1->i = 5; Form2->j = 5; という様に値を代入するとForm1の時はうまく代入できるのですが、Form2の変数に代入すると「Project1.exeがEAccessViolationクラスの例外を生成しました …」というエラーメッセージが表示されてしまいます。
  • この原因は何でしょうか。
  • なお、各フォームのヘッダファイルのインクルードはきちんと行っています。OSはWindows98です。
回答を見る
  • ベストアンサー

EAccessViolationエラーの生成

C++Builder 5.0でプログラムを作成しています。 Form1~Form3を作成し、Form1を自動生成の対象及びメインフォームとしました。Form1にはボタン1、Form2にはボタン2を用意し、ボタン1からはForm2を、ボタン2からはForm3を開くことが出来るようにしました。 Form1のボタン1には TForm2 *Form2 = new TForm2(Application); Form2->Show(); Form1->Hide();と記述し、 Form2のボタン2には TForm3 *Form3 = new TForm3(Application); Form3->ShowModal(); ← Form3はモーダルフォーム と記述しました。Form1とForm2のPublic部にint型の変数iとjを用意し、 Form3から Form1->i = 5; Form2->j = 5; という様に値を代入すると Form1の時はうまく代入できるのですが、Form2の変数に代入すると「Project1.exeがEAccessViolationクラスの例外を生成しました …」というエラーメッセージが表示されてしまいます。この原因は何でしょうか。なお、各フォームのヘッダファイルのインクルード はきちんと行っています。OSはWindows98です。御回答をどうかよろしくお願いします。

  • Richi
  • お礼率67% (39/58)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Form3を表示したときForm2がどういう挙動を取るのか説明がないので 何とも言えないですが、もしClose();とかdelete Form2; されてたりするのであればForm2のインスタンスは破棄されている 可能性が高いので例外はスローされますよね? というわけで補足を求めます。Form2はForm3がShowModal時は 画面に表示されているのでしょうか。

Richi
質問者

補足

御返事ありがとうございました。 Form2はそのまま表示しています。 しかしながら、色々と試してみたのですが、 Close()してdelete()したときと、 表示したままの時での違いはありませんでした。

関連するQ&A

  • フォームの生成と破棄

    C++Builder5.0の質問です。 フォーム(Form1)に複数のボタンを配置し、メニュー画面としました。 ボタンを押すと他の画面(Form2~5)に移れるようにしました。 ボタンには TForm2 *Form2 = new TForm2(this); Form2 -> Show(); Close(); ↑ Form2からForm5まであります。 と記述し、 Form2から5には「戻る」ボタンを設け、Form1(メニュー画面)に 戻れるようにしました。 Form2~5の「戻る」ボタンには TForm1 *Form1 = new TForm1(this); Form1 -> Show(); Close(); と記述しました。 また、全てのフォームのFormCloseイベントには自分のフォームを破棄するために delete Form2; 等と記述しました。 この状態でメニュー画面からForm2~5を開いたり閉じたりすることを 繰り返すと、不定期的に動作が固まってしまいます。 この原因はなんでしょうか。 Ver.はBCB5.0(Pro.)です。 御回答をよろしくお願いします。

  • 《 Delphi 》 動的なフォーム生成について

    プログラムをしていて疑問に思ったのですが、たとえば Form1 := Tform1.create(Application); として、Form1(設計済み)のインスタンスを作って表示させたとします。 ここで、更に Tform1.create を行った場合、Form1の参照先は新しく作ったほうになると思うのですが、古いほうのインスタンスはどうなるのでしょうか?Form1に属するメンバはやはりゴミとして残るのでしょうか。 また、Form1を消去して新たに作り直したい場合は、Form1.Releaseをしてから再度Createすれば問題はないのでしょうか。 実は、Releaseしてから再Createしたところ、Form自体はできたのですが、Form上のImageをCreateする段階でアクセス違反が起きて落ちてしまいまして・・・(Form1にはImageがひとつ乗っており、Form生成時にImageも生成されます)。 ソースを削って原因究明したところ、関係ない変数を代入すると発生したり収まったりして、もしやメモリを蝕んでいる!?とか思ったもので・・・。 思い当たる節がありましたら、ご教授いただければ嬉しいです。

  • vb2005 インスタンスの生成について

    vb2005で質問です Data.vbというグローバル変数を宣言しているモジュールファイルに以下の記述をします。   public x As SortedList(Of Integer, Integer)() = New SortedList(Of Integer, Integer)(1) {} 次にForm1.frmというファイルで、ある処理の中に以下の記述をします。  x(0) = New SortedList(Of Integer,Integer)  x(1) = New SortedList(Of Integer,Integer) ここで質問が2つあります。 1)なぜ2回もNEW句を使用しなければならないのでしょうか? 2)x(0)やx(1)について、宣言とインスタンスの生成を同時にする方法はありますか? ご回答よろしくお願い致します。

  • vb2005 インスタンスの生成について

    vb2005で質問です Data.vbというグローバル変数を宣言しているモジュールファイルに以下の記述をします。   public x As SortedList(Of Integer, Integer)() = New SortedList(Of Integer, Integer)(1) {} 次にForm1.frmというファイルに、あるイベントのたび、呼び出される処理の中に 以下の記述をします。  x(0) = New SortedList(Of Integer,Integer)  x(1) = New SortedList(Of Integer,Integer) この場合、何度も x(0) = New SortedList(Of Integer,Integer) が 生成されることになりますが、メモリエラーを引き起こす原因に なりえますか すいませんが、教えていただけないでしょうか

  • VBAのフォームについて

    今、悩んでいるというか、不思議に思っていることがあります。 ACCESS2003 VBAで、VBAコードでメインのフォームから、ある帳票フォームのインスタンスを作成しています。メインフォームのモジュールに以下のように記述し、 Dim 帳票1 as Form で、ボタンのクリックイベントで、 set 帳票1 = New Form_帳票の元フォーム とインスタンスを生成します。更に、この帳票フォームには、同様に子フォームを持っています。こちらも同様に帳票フォームモジュールに、 Dim 詳細1 as Form として、あるボタンのクリックイベントに、 set 詳細1 = New Form_詳細フォーム と、しています。ここで、帳票1の閉じるボタンを押しても、詳細1のフォームは、閉じません。 同様に、帳票の元フォームに Dim 帳票2 as form ボタンクリックで、 Set 帳票2 = New Form_帳票2の元フォーム とします。さらに帳票2の元フォームには、 Dim Child帳票 as Form ボタンクリックで、 Set Child帳票 = New Form_帳票2の元フォーム としています。 これで、Child帳票は、いくつもいくつもインスタンス化されます。そこで、今までの動作に準じて、たくさんあるChild帳票の大元を閉じると、こちらは子フォームが全部閉じます。例えば10個子フォームを作って、途中を閉じるとちゃんとその子だけが閉じます。最初の例の帳票1フォームを閉じても、詳細1フォームが閉じないのと、何が違うのか分かりません。私は、フォームが閉じるときには、そのメンバクラス(フォーム)は、破壊されるものだと思っていたのですが、そうでもないようです。どなたかわかりやすく、教えていただけないでしょうか?

  • JAVAのNEW配列生成とガベージコレクション解放

    ある本に、IF文内での、JAVAの配列生成で、IF文のブロックを内で生成した配列が、ブロックを抜けた際の挙動が異なると書いてありました。 NEWを使わないで生成した配列では、解放されるが(例 int[] k = {10 , 20 , 30}; ) NEWを使って生成した配列(例 int[] hoge = new int {3}; )は メモリー内に残ってしまうということでしたが、多分その後 ガベージコレクションで解放されると思いますので問題はないのですが 両者とも、メモリー内に作成(用意)された同じような変数の箱を利用しているのに どうして挙動が異なるのでしょうか? NEWを使わないで生成した配列kは、例えばk[0]の中にアドレス参照でなく 10という値がそのまま入るのでしょうか? 分かりやすく教えていただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ある変数の別のフォーム中での利用

    Visual Basicに関する質問です。 あるフォーム(Form1)中で変数を定義しました(Public変数として)。 このフォーム中で変数に「適当な文字」を代入します。 この文字を別のフォーム(Form2)中にあるフレーム(Frame1)のキャプション(Frame1.Caption)に表示させる(引用する)にはどうすればよいのでしょうか? 基本的な質問ですが,よろしくお願いします。

  • Access-VBAのPublic変数について =基本的な事です=

    フォームAのテキストボックスに入力された値をフォームBで使用したいのですが、調べるとPublic変数に値を代入しておけばフォームAを閉じても値を保持できるとの事でした。 そこで、 (1) 標準モジュール(My_Moduleという名前)を作成しそこに1行Public Hensu as Long と定義しました。 (2) フォームAにボタンを作成し、そのクリックイベントに、 Hensu=Text1.Value というコードを記述しました。 (3) フォームBにボタンを作成し、そのクリックイベントに、 Text1.Value=Hensu というコードを記述しました。 フォームBのボタンをクリックすると、Text1に値が代入されるかと思いましたが、意に反しHensuの中身はNullでした。 どのようにすればフォームBで変数の値を取得することが出来るのでしょうか? ちなみにフォームAからPublic Hensuには値が代入されているようで、イミディトウインドウで?Hensuとするとちゃんと代入された値が表示されます。

  • DLLサンプルプログラムが動きません

    Delphi XE5 starter で、 http://www39.atwiki.jp/kgh07155/pages/28.html を参考にして以下のようなプログラムを作りました。 コンパイルはできたのですが、Button1をクリックすると「TDllFormリソースが見つかりません」というエラーメッセージが出ます。 どういう風に修正すればいいのでしょうか? //***************************** //SamoleUnit2.pasの内容 unit Unit_Sample2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; external 'DLLSample.dll'; procedure ShowDLLForm2; external 'DLLSample.dll'; // ここまで、DLLを呼び出すための記述。 procedure TForm1.Button1Click(Sender: TObject); begin ShowDLLForm(Application.Handle); // DLL側でフォームを作成した後、 // 通常のフォームのShowModalメソッドと同じ動作をして // 作成したフォームを破棄。 end; procedure TForm1.Button2Click(Sender: TObject); begin ShowDLLForm2; // DLL側でフォームを作成した後、 // 作成したフォームを表示。 end; end. //******************************** //DllSample.dprの内容 library DLLSample; uses System.SysUtils, System.Classes, Windows, Forms, Controls, Unit_DLLForm in 'Unit_DLLForm.pas' {Form1}, Unit_Sample2 in 'Unit_Sample2.pas' {Form2}; type TDllForm = class(TForm) end; {$R *.res} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; var DllForm:TDllForm; begin Application.Handle := hOwner; // 呼び出し元の情報をDLL側が受け取る。 DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 // フォームに配置された各オブジェクトも、自動で作成される。 Result := DllForm.ShowModal; // 返し値を設定。 DllForm.Free; // DLL側で作成したフォームを破棄。 Application.Handle := 0; // 呼び出し元の情報を破棄。 end; procedure ShowDLLForm2; var DllForm:TDllForm; begin DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 DllForm.Show; // 作成したフォームを表示。 end; exports ShowDLLForm, ShowDLLForm2; begin end. //******************************** //unit_DLLForm.pasの内容 unit Unit_DLLForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} end.

  • hiddenフォームのvalueを自動生成したいのですが...

    JavaScriptで生成した値を、同じページの中にあるinput type=hiddenフォームのvalueの値として使用したいのですが、うまく行きません。 普通のinputタグであれば、 <SCRIPT Language="JavaScript"> <!-- function SetOrderId() { myDate = new Date(); Year = new String(myDate.getFullYear()); Month = new String(myDate.getMonth()+1); Day = new String(myDate.getDate()); if ( Day.length == 1 ) Day = "0" + Day; document.forms[0].OrderId.value = Year + "-" + Month + "-" + Day } //--> </SCRIPT> <BODY onLoad="SetOrderId()"> <INPUT NAME="OrderId" TYPE="TEXT" onClick="SetOrderId()"> で、ページを開いたときにOrderIdフォームに値が代入されているのですが、 <input type=hidden name="OrderId"> としたときには、上記のスクリプトで生成した値がinput type=hiddenのvalueに設定されず、困っています。 どうすればinput type=hiddenのvalueの値にJavaScriptで生成した値を代入できるのでしょうか?

専門家に質問してみよう