終了時にエラーが出るのを止めるためには

解決


AS  2012-08-06 20:49:12  No: 42699

こんにちは。

また、よろしくお願いします。

自作のプログラムに、別の自作プログラムを組み込んだら、windowの「閉じる」を使って終了するときに、「モジュール*****のアドレス0000000*****でアドレスに*******000000に対する読み取り違反がおきました。」というエラー表示が出ました。

組み込んだプログラムを「プロジェクトから削除」するとこのエラーはでなくなります。
結果としては、組み込まれたままコンパイルできますので、問題はないのですが。

長年delphi使ってますが、このようなことは初めてのような気がします。

どうしたら、「プロジェクトに追加」したままで、エラーをなくすことができるでしょうか?


多分・・・  2012-08-07 02:53:37  No: 42700

この手のエラーは処理中も含め、プログラムを終了した場合等に遭遇する事
があります。
(本来あってはならないことですが)
上記のケース記述自体にミスが原因でした。
動的配列などで参照がずれている(範囲外の参照)場合なども発生します。
オブジェクトの参照ミス(生成していないのに参照する)かもしれません。
この手のエラーはデバックでは見つけにくいです。
地道に見るしかありません。

いずれにしても、管理外!?のアドレスにデータを書き込んでしまったり
すると、いずれこの手のエラーが遅かれ早かれ、どこかの時点で発生する
と思います。

ただ個人的にはWindowsの終了時点でこれに遭遇したことはありません。
参考にならないかもしれませんが・・・


HOta  2012-08-07 18:35:51  No: 42701

このエラーは、存在しないObjectにアクセスしようとして起こしているエラーです。
終了時にコンポーネントなどにアクセスしようとしてエラーを起こしています。


AS  2012-08-12 17:36:28  No: 42702

具体的に、どうしたらいいでしょうか?

プログラムを変更したら、直るものなんでしょうか?

まだ、他にすることがあって、手をつけていませんが。


igy  2012-08-12 23:52:57  No: 42703

>自作のプログラムに、別の自作プログラムを組み込んだら

関係ないかもしれませんが・・・

自作プログラム上から“別の自作プログラム”のメインフォームの生成はコード上で生成してますか?
また、プロジェクトオプションの「自動生成フォーム」欄には、
この“別の自作プログラム”のフォームも「自動生成フォーム」欄にありますか?


便乗  2012-08-14 02:25:05  No: 42704

便乗で申し訳ありませんが、もしかしたら原因は同じかと思いお願いします。
Delphiから、プロジェcトを起動した状態ではエラーが出ずに実行できますが、ファイル->閉じる  とすると、Delphiまで落ちてしまいます。これは、ファイル->プロジェクトを開く->すべて閉じる  としても(実行せずに)、Delphiが落ちてしまいます。
原因が分かりませんのでどなたかこのような経験はありませんでしょうか。
Win X-P    Delphi7  です。


AS  2012-08-14 07:00:24  No: 42705

こんばんは。

igyさんへ

>メインフォームの生成はコード上でしていますか?
すみませんが、意味がよくわかりません。
別のプログラムのformをコピーして、メインのプログラムのディレクトリに保存して、メインのプログラムから参照する形でコンパイルさせています。
実は、この別のプログラム以外にも、後で2つのプログラムを入れたのですが、それらは問題ありません。
今までにも入れてきましたが、問題はありませんでした。

>プロジェクトオプションの自動生成フォーム欄には
プロジェクトのオプションには見当たりませんが??
長年使用していますが、詳しくなくてすみません。


KHE00221  2012-08-14 07:15:09  No: 42706

たぶんこんな感じ?

自動組み込みで Form2Create  が実行され StringList 作成

procedure TForm1.Button1Click(Sender: TObject);
begin
    Form2 := TForm2.Create(Self); FormCreate で StringList 作成
    Form2.ShowModal;
    Form2.Free;  <--- Form2Destroy 実行で StringList 消え
end;

自動組み込みで Form2Destory 実行

StringList.SaveToFile で例外

Free では例外発生しないので何か触ってない?

var
  Form2: TForm2;
  StringList: TStringList;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
    StringList := TStringList.Create;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
    StringList.SaveToFile('C:\A.TXT');
    StringList.Free;
end;


igy  2012-08-14 07:35:07  No: 42707

>>プロジェクトオプションの自動生成フォーム欄には
>プロジェクトのオプションには見当たりませんが??

Delphi XE などの新しいIDEであれば、「プロジェクトオプション」の
画面左のツリーから「フォーム」を選択した状態です。

Delphi7 などの以前のIDEであれば、「プロジェクトオプション」の
「フォーム」タブです。

>組み込んだプログラムを「プロジェクトから削除」するとこのエラーはでなくなります。
>結果としては、組み込まれたままコンパイルできますので、問題はないのですが。

と書かれているので、「プロジェクトに追加している場合」と「プロジェクトから削除した場合」の違いは、
この自動生成フォームに入っていることぐらいでは?と思い、「自動生成フォーム」欄のことを書きました。

>>メインフォームの生成はコード上でしていますか?
>すみませんが、意味がよくわかりません。

「別の自作プログラムを組み込んだら」と書かれていたので、「別の自作プログラム」のメインフォーム以下すべてのフォームを追加したのか
と思っていたので、「自作プログラム上から“別の自作プログラム”のメインフォームの生成はコード上で生成してますか?」と書いたのですが、
聞きたかったのは、“コピーした別のプログラムのform”は、
上の「自動生成フォーム」欄に設定されプロジェクトが自動生成したのか?あるいは、コード上で生成したのか?
ということです。(「プロジェクトから削除」してもコンパイルできるということなので、コード上で生成していると思うのですが・・・)


AS  2012-08-14 08:08:12  No: 42708

早速の解説、ありがとうございます。

form2.update になっていましたが、
freeにしても、releaseにしても問題は発生しました。

もう一度確認しますが。

自作のメインプログラムに、別の自作プログラムを組み込んだら、メインのwindowの「閉じる」を使って終了するときに、「モジュール*****のアドレス0000000*****でアドレスに*******000000に対する読み取り違反がおきました。」というエラー表示が出ました。

組の込んだプログラムは無事に作動しますし、それを終了するときにも問題はありません。
メインプログラムを終了するときにエラー表示が出るんで何故?となっているんです。

組み込んだプログラムは簡単なワープロソフトです。

stringlistは数か所で使っていますが、全部freeで処理しています。

気になったのが、ポップアップを使って切り取りとかコピーなどをしている部分があって、正直わけも分からずに使っています。
これの処理に問題点とかありますか?

ついでに質問させてもらいたいんですが、このマウス右クリックでのポップアップで文字検索を入れたいんですが、やり方が分かりません。例を見せてもらえませんか?自作しなければなりませんかね。

よろしくお願いします。


AS  2012-08-14 08:19:56  No: 42709

igyさんへ

自動生成フォーム、分かりました。
ありがとうございました。

追加したら、入っています。

削除したら消えますね、当然ですが。
でもコンパイルはできて、作動します。

プログラムするだけですので、分からないことが多いですね。


igy  2012-08-14 08:27:33  No: 42710

> 追加したら、入っています。

“コピーした別のプログラムのform”の生成はコード上で行っているなら、
「>」ボタンで、「使用可能フォーム」欄に移動してみるとどうなりますか?


KHE00221  2012-08-14 12:43:09  No: 42711

StringList は  単なる例

別の自作プログラムの FormDestroy の内容はどうなってる?


KHE00221  2012-08-14 12:45:43  No: 42712

こうしたらどうなる?

Form2 <-- 別の自作プログラム

procedure TForm1.Button1Click(Sender: TObject);
var
    Form2: TForm2;
begin
    Form2 := TForm2.Create(Self); 
    Form2 := TForm2.Create(Self);
    Form2.Free;
    Form2.Free; 
end;


AS  2012-08-19 14:54:43  No: 42713

皆さん、ありがとうございました。

igyさんの「使用可能フォーム欄への移動」で解決しました。

多謝です。


AS  2012-08-19 15:09:11  No: 42714

KHE00221さんへ

applicationをselfに変えるということだとですね。

やってみましたが、エラーは出ます。

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


KHE00221  2012-08-19 16:47:37  No: 42715

>igyさんの「使用可能フォーム欄への移動」で解決しました。

これは

>組み込んだプログラムを「プロジェクトから削除」するとこのエラーはでなくなります。
>結果としては、組み込まれたままコンパイルできますので、問題はないのですが。

なだけだぞ・・・

>applicationをselfに変えるということだとですね。

そこじゃない・・・・


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

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






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