2

これは、ESRI MapControls を Access データベース フォームに埋め込むことに関連しています。

フロントエンドとバックエンドに分割された 2 つのアクセス ファイルがあります。私のバックエンドは、ArcGIS が埋め込み ESRI マップ コントロールからの表示用のフィーチャクラスを格納するために使用する PersonalGeoDatabase でもあります。

フィーチャ クラスには、特定の ProjectID に関連付けられたポリライン、ポイント、およびポリゴンが格納されます。

フロントエンドからは、バックエンドに関連付けられた MXD ファイルをロードする埋め込み mapControl があります。

私は CenterPoint という VB 関数を持っています。これは偶然にも、プロジェクトに関連付けられたフィーチャクラス (存在する場合) を中心にマップ エンベロープを配置し、目的の表示範囲を設定します。プロジェクトのフィーチャクラスがまだ存在しない場合は、すべてのプロジェクトが含まれる地域全体をマップの中心にして、全体像を示します。

それで、それがすべて理にかなっていて、私があなたを失っていないなら...

Form_Current イベントで最初に CenterPoint サブルーチンを呼び出しました。これは、必要なすべての機能を実行するという点で機能しました。ただし、CenterPoint 関数の実行中はフォームが応答せず、再描画が完了するまで別のレコードに変更できませんでした。つまり、10 レコードをジャンプしたい場合は、1 レコードをジャンプし、再描画を待ち、別のレコードをジャンプし、再描画を待つ必要があります。MXD 画像を最適化し、再描画を大幅に高速化しました。レイヤーがありましたが、それでも受け入れられませんでした。

次に、次のコマンドを実行して、CenterPoint サブルーチンを呼び出す前に、数秒の遅延を確立しようとしました。

Private Sub Form_Current()
    Dim s_Start As single
    Dim s_Delay As single
    s_Start = Timer
    Do While Timer < s_Start + s_Delay
        DoEvents
    Loop

CenterPoint

End Sub

つまり、最初に再描画を試みる前に複数のレコードをクリックできます。

残念ながら、すべての Form_Current 呼び出しがキャッシュされているようです。たとえば、3 つのレコードをスキップし、遅延が終了するのを待って画面を見ると、再描画 (つまり、CenterPoint の実行) が 3 回連続して行われます。

さらに奇妙なことに、散発的に行のゼロ除算エラーが発生します。

Do While Timer < s_Start + s_Delay

ラインに分割がないにもかかわらず。

だから、私の質問は次のとおりだと思います:

  1. form_current 呼び出しを 1 回だけ実行する方法はありますか?
    • そうでない場合、CenterPoint 関数を呼び出す前に、特定の時間、ユーザーが現在のレコードにとどまっていることを確認する方法はありますか?
  2. ゼロ未満の比較をゼロ除算エラーから隔離する方法はありますか?少なくとも、複数回再描画されても、ユーザーはレコードをすばやく連続してクリックできますか?

現在、私の回避策は、CenterPoint サブをフォーム上のボタンのクリック イベントとして配置することでした。これは機能しますが、理想的ではありません。

意味が分からない場合や、さらに情報が必要な場合は、お知らせください。

ありがとう、スペンサー

4

2 に答える 2