2010-12-29 15 views
6

私は、ユーザーが車両を選択する必要があるフォーム(FORM-A)を持っています。 ユーザーはFORM-Aの車を選択するボタンをクリックする必要があります。 選択フォーム(FORM-B)は、ユーザーが車両を選択できる場所で開く必要があります。 選択した値をFORM-Aに返信する必要があります。MS Access:フォームはどのように値を互いに通信しますか?

MS Access 2010でこれをどのように達成しますか?

FORM-Bは、車両の画像とその他の情報を含む連続形式です。

+0

を助け

Private Sub imgVehicle_Click() If currentproject.allforms(“Form-A”).isloaded then Forms!Form-A!txtVehicle=me!txtVehicleName End if End Sub 

希望はなぜあなたは、ポップアップフォームがこれを行うための正しい方法であることを所定のか?なぜ、メインフォームのドロップダウンリストはありませんか? –

+0

私はこれが私が最初にしたことだと認めますが、その後は選択プロセスに車両の写真を含めることにしました。これを行うリスト選択コントロールがない限り、サブフォームまたはポップアップのいずれかが表示されます。ポップアップは、選択が確実であるようにユーザに感じさせますが、サブフォーム(連続形式)は、選択が実際に発生したかどうかをユーザに疑わせるものです。 – cmaduro

答えて

11

私はあなたの質問から理解したところで、formBが一種のポップアップを開くことを望みます。ポップアップが閉じられると、その結果は呼び出し元のフォームのどこかに置かれます。
ソリューション提案:
a)構文docmd.openform "formB", windowmode:=acDialogを使用してFormBを開きます。
これは、formBが閉じられるか隠されるまで、次の行の実行を防ぎます。
b)FormBの[OK]ボタンで、フォームを非表示にして閉じないでください。
C)コードをフォーマに再開したときに、あなたができるようになりまし

  1. チェックformBがまだ開いている場合。そうでない場合は、

そうでなければ隠されたformBの値(まだ開いて)、そして近いformBを読んでキャンセルされています、あなたはまた、formBが閉じる前にFORMAでコントロールを更新する可能性があります。しかし、私はその方法が嫌いです。なぜなら、formBは再利用できず、formBとformAの間に不必要な依存関係を作り出してしまうからです。

+1

あなたは別のダイアログを持っていなければならない - これは私に行く方法のように聞こえる。 –

+1

この種のものを、アプリケーション全体を通して呼び出すことのできる関数に変換します。返すフィールドのそれぞれを持つ型を宣言することによって、関数が複雑な値のセットを返すようにすることができます。 "有効"と呼ばれるものをブール値として残しておいてください。有効かどうかは、 – akc42

+1

から取り消されました。これは限られたシステムにとって最適な解決策です。私は過去に(Me.OpenArgsを使用して)呼び出し元のフォームの名前と戻り値を格納するための呼び出し元のフォームの非表示フィールドを開いたままにして、falseを可視状態に変更すると、フォームの呼び出しコードがダイアログボックスが閉じられていれば、これはもっと簡単です! :)ありがとう+1 – GazB

0

なぜ別のフォームが必要なのか分かりません。最初のテキストボックスは、データベース内の車両のすべてのレコードのリストで、1つを選択し、残りの車両情報は車両テーブルから自動入力されますが、親テーブルにはコピーされません。もちろん、あなたのテーブル構造もわからないので、私には明らかではないこの方法の理由があるかもしれません。

上記の方法の利点あなたがより多くの車を追加する場合は、あなたの選択ボックスが自動的に更新されていることである - そしてあなたは(常に良いパフォーマンスの動き)を最小限にロードする必要がありますフォームを保つ

0

あなたはすることができますformA内にformBのインスタンスを作成し、それを制御します。以下はformAのVBAコードです。 formAのボタンをクリックすると、formBの新しいインスタンスが作成され、フォーカスが移ります。同時に、コントロールのプロパティを設定することができます。このアプローチを使用して、フォームBのコントロールで正しい画像を設定することができます。これが役に立ちます。

例:

Option Compare Database 

Dim fB As Form_FormB 

Private Sub btnA_Click() 
    Set fB = New Form_FormB 
    fB.SetFocus 
    fB.tbxB.Text = "Some text sent from A to B!" 
End Sub 

あなたは両方のフォームは、すべての時間表示されるようにしたい場合は、私は、ユーザーが選択したいずれかのすべての車両または単に詳細のリストとサブフォームを使用してお勧めします。

0

このようにフォームを参照するには、form!formName!controlNameを使用します。 これがどのように動作するかを知ると、既存のセットアップで動作させるためには、それを騙すことができます。 3つのコントロールをForm-Aのテキストボックス、Form-Bの画像、Form-Bのテキストボックスを使用してみましょう。フォームAのテキストボックスの名前はtxtVehicle、フォームBのイメージの名前はimgVehicle、フォームBのテキストボックスの名前はtxtVehicleNameとなります。 プロパティ内でコントロールの名前を設定できます。 imgVehicleをクリックすると、txtVehicleNameの値がtxtVehicleに格納されます。

少しコーディングする必要があります。以前はやっていないのは簡単ですが、画像のプロパティでは、イベントが表示されます。 "On Click"イベントをクリックすると、ドロップダウンリストが表示されます。選択肢の1つは[Event Procedure]です。これを選択します。その上に3ドットの小さなボタンも行の最後に表示されます。これをクリックすると、このようなコードを含むコードウィンドウが表示されます。

Private Sub imgVehicle_Click() 

End Sub 

ここにコードを記載します。このようなものはうまくいくはずです。これはもっとも単純な形です。

Private Sub imgVehicle_Click() 
    Forms!Form-A!txtVehicle=forms!Form-B!txtVehicleName 
End Sub 

これでうまくいくはずですが、私たちがこの方法でやっていなければならないことがいくつかあります。私たちはForm-Bを参照する必要があります。Form-Aが実際に公開されていることを確認する必要があります。

+0

フォーカスされた要素だけが参照できるので、これは機能しません。 –

+0

要素またはフォームの参照にフォーカスは必要ありません。フォームは開いている必要がありますが、表示する必要はありません。サブフォームは、上記のように明示的に参照する必要があります。テキストボックスのテキストプロパティのように、フォーカスのみで利用可能な特定のプロパティがありますが、それらは少数です。 – Praesagus

+0

この回答はなぜ控えめになっていますか? – Praesagus

関連する問題