2

最近作成したファイルのすべてのハンドルを閉じています。しかし、「opendialog.execute;」を呼び出すと、ダイアログはいつものようにポップアップしますが、最近作成されたファイルのヒントの上にマウスを置くと、範囲外のエラーで全体がクラッシュします。

(onhint) イベントを発生させずにファイルを開いたとしても問題はなく、テスト用にファイル名のリストをハードコーディングすると、ファイルを開いたり保存したりすることに問題がないことがわかりました。それは純粋に開いているダイアログのヒントイベントにあります。私が言ったように、私が素早いか、矢印キーを使用している場合、プログラムに問題はありません。

さらに興味深いのは、約 70% の確率で 100% も発生しないということです。これにより、短時間だけでなく、何度か修正したと考えるようになりました。何が起こっているのか知っている人はいますか?そうでない場合、どうすればonhintイベントを無効にできますか?

コードを求められているので、まったく役に立ちません

OpenDialog.execute;    // crashes here
if fileexists(form1.OpenDialog.FileName) then    
  form1.Address.Text:=form1.OpenDialog.FileName;

およびエラー リンク テキスト

編集:わかりました、いくつかの新しい情報があります。opendialog の新しいインスタンスにはまだ同じ問題があります。さらに興味深いことに、「test.jpg.enc」などの二重タグを持つファイルのヒントで30%の問題を解決したようです。これは、最初に実行したときに問題なく、ヒントでのみクラッシュしますこれらのエンコードされたファイルのうち、そのファイルを白くエンコードした場合にのみ、アプリケーションは開かれています。たとえば、エンコードすると、デコードしようとするとクラッシュします..再度実行して正常にデコードできますが、アプリケーションの1つのインスタンスでデコードしてからエンコードすることに問題はありません。

4

6 に答える 6

3

form1のインスタンスが作成されてもよろしいですか?

そうであれば:

なぜあなたはこのように使用しないのですか?

OpenDialog.Options:=  OpenDialog.Options + [ofFileMustExist];

if OpenDialog.Execute then
  Address.Text:= OpenDialog.FileName

また、FastMM4を使用し、FastMM4.incでFullDebugModeを定義します。これはあなたが本当の問題を見つけるのを助けるかもしれません

于 2009-01-24T20:01:11.860 に答える
3

まず、コードで "form1.xxx" を参照する必要はほとんどありません。/特に、Form1 のメソッドでコードを記述している場合はそうです。それらの参照を削除します。

次に、できるだけ単純なアプリケーション (フォーム、TOpenDialog、およびボタン) を作成し、問題のファイルを開くためのコードをできるだけ書かないようにします。それが機能する場合は、単純なアプリと実際のアプリの違いを把握してみてください。失敗した場合は、上記の質問を /all/ で編集して、失敗した単純なプログラムのコードを記述してください。

于 2009-01-24T21:51:51.060 に答える
2

これに対する解決策は、activeX を使用することでした。SP2 以降に導入されたバグがあったようです。

ActiveX を使用します。

初期化 OleInitialize(nil);

ファイナライズ OleUninitialize 終了。

キツネがここに投稿した元の投稿

于 2009-02-26T14:49:21.883 に答える
1

2つのこと:

Debug DCUを使用してアプリケーションをコンパイルし( Project / Options / Use Debug DCU 's - then do a full build )、例外が発生している場所を確認します。これにより、vcl/rtl コードで例外が発生している場合の詳細情報が得られます。完全なエラー メッセージと、どのユニットのどこでエラーが発生したかを投稿してください。

2 つ目は、おそらくもっと重要なことですが、アプリケーションの外部でファイルがどのように動作するかです。約 30% の確率で失敗することが示唆されているため、ファイルを保存した後は毎回、通常のエクスプローラー ウィンドウで参照し、そこにマウスを置いて、ヒントが正常に表示されるかどうかを確認します。次に、メモ帳で開きます。これらの両方が機能し、アプリケーションで失敗する場合は興味深いでしょう。

また、前の質問にフォローアップの質問を投稿する場合は、前の質問にリンクすると、以前に試したことを確認できるようになります。

がんばれ!

于 2009-01-24T23:06:55.307 に答える
1

エラー メッセージは範囲外ではなく、アクセス違反です。これは、自分がアクセスできないメモリにアクセスしていることを意味します。これは主に、クラス変数 (クラスへのポインター) が初期化されていないか、既に解放されている場合に発生します。

form1 のメソッドであると思われるコードは、いくつかの変更を使用できます (既に言及されています)。

OpenDialog.execute;    // crashes here
if fileexists(OpenDialog.FileName) then    
  Address.Text := OpenDialog.FileName;

しかし、OpenDialog とは何ですか? form1 にドラッグされたコンポーネントですか? その場合、form1 はおそらく初期化されていません。しかし、最も可能性が高いのは、OpenDialog がローカル変数であることです。その場合、初期化できます:

OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;
于 2009-01-25T10:49:49.787 に答える