2010-12-29 16 views
6

Kullanıcının bir araç seçmesini gerektiren bir formum (FORM-A) var. Kullanıcı, FORM-A'da araç seçimini söyleyen bir düğmeye basmalıdır. Kullanıcının bir araç seçebileceği bir seçim formu (FORM-B) açılmalıdır. Seçilen değer FORM-A'ya iletilmelidir.MS Access: Formlar birbirleriyle nasıl iletişim kurar?

Bunu MS Access 2010'da nasıl gerçekleştirirsiniz?

FORM-B, aracın resmini ve diğer bilgileri içeren sürekli bir formdur.

+0

yardımcı

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

Umut Neden bir pop-up formu Bunu yapmak için doğru yol olduğunu önceden belirlenmiş mi? Neden ana formdaki bir açılır liste değil? –

+0

Bunu ilk başta yaptığım şeyden itiraf ediyorum ama daha sonra seçim sürecine aracın resmini eklemek istedim. Bunu yapabilecek bazı liste seçim denetimi olmadıkça, bir alt form veya bir açılır pencere ile sıkışmış durumdayım. Pop-up, kullanıcının seçimin kesin olduğu hissini verirken, alt form (sürekli form) seçimin gerçekten gerçekleşmesi durumunda kullanıcıyı şüpheye düşürür. – cmaduro

cevap

11

Sorunuzdan anladığım kadarıyla, bir tür açılır pencere açmak için formB'yi istiyorsunuz. Pop-up kapandığında, sonucu arama formunun bir bölümüne konur.
Çözüm önerisi:
a) docmd.openform "formB", windowmode:=acDialog sözdizimini kullanarak FormB'yi açın.
Bu, formB kapalı veya gizli olana kadar sonraki satırların yürütülmesini engeller.
b) FormB'nin Tamam düğmesine basın, formu gizleyin, kapatmayın.
c) kodu Forma ayında devam edecek, artık

  1. onay formB hala açıksa. Değilse,

Aksi gizli formB değeri (hala açık), sonra yakın formB okundu iptal edildi, ayrıca formB kapatmadan önce Forma bir denetimi güncelleştirmek için olabilir. Ama bu yaklaşımı sevmiyorum çünkü formB tekrar kullanılamaz ve formB ile formA arasında gereksiz bir bağımlılık yaratır.

+1

Ayrı diyaloğa sahip olmanız gerekiyorsa - o zaman bu bana giden yol gibi geliyor. –

+1

Bu tür bir şeyi, uygulama boyunca çağrılabilecek bir işleve dönüştürün. İşlev, döndürmek istediğiniz alanların her biri ile bir tür bildirerek karmaşık bir değer kümesi döndürmesini sağlayabilirsiniz. Çalışırsa veya – akc42

+1

dışında iptal edildiğini söyleyen bir boolean olarak adlandırılan "geçerli" yi bırakın. Bu, sınırlı bir sistem için harika bir çözümdür. Geçmişte (Me.OpenArgs kullanarak) çağrı formunun adı ve dönen formunu saklamak için çağrı formundaki gizli bir alan geçmiştir, ancak formun açık ve değiştirilme şekli yanlış olarak görünür durumdur. Ayrıca formun çağrı kodunun devam etmesini sağlar. iletişim kutusu kapatıldıysa, bu daha kolay! :) Teşekkürler +1 – GazB

0

Bunun için neden ayrı bir forma ihtiyaç duyacağından emin değilim - sadece ilk metin kutusunun, veritabanındaki tüm araç kayıtlarının bir listesi olmasını ve araç bilgilerinin geri kalanını girmesini sağlayın. Araç tablosundan otomatik olarak doldurulur, ancak üst tablonuza kopyalanmaz. Tabii ki, tablonuzun yapısından da emin değilim, bu yüzden bana göre olmayan bu yöntemin bir nedeni olabilir. Daha fazla kamyon eklerseniz

yöntemin faydaları

tam üstünde bulunan seçim kutusu otomatik olarak güncellenir olduğunu - ve size minimum (her zaman iyi bir performans hamle)

0

yapabilirsiniz için yüklemek zorunda formları tutmak formA içinde bir formB örneği oluşturun ve bunu denetleyin. FormA için VBA kodu aşağıdadır. FormA'da bir düğmeyi tıklattığınızda, formB'nin yeni bir örneğini oluşturup odağı oluşturursunuz. Aynı zamanda, kontrolleri için özellikleri ayarlayabilirsiniz. Bu yaklaşımı, B formundaki kontrolünüzde doğru resmi ayarlamak için kullanabilirsiniz.

Örnek:

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 

her iki form her zaman görünür olmasını istiyorsanız

, sadece tüm araçların listesini içeren bir alt form kullanılarak ya öneririz kullanıcının seçtiği biri için ayrıntıları.

0

Formları bu şekilde formlara başvurabilirsiniz form! FormName! ControlName. Bunun nasıl çalıştığını gördüğünüzde, varolan kurulumunuzla çalışmak için onu kandırabileceksiniz. Form-A'daki bir metin kutusunu, Form-B'deki bir resmi ve Form-B'deki bir metin kutusunu 3 kontrol kullanalım. Form-A'daki metin kutusu txtVehicle olarak adlandırılır, Form-B'deki görüntü imgVehicle olarak adlandırılır ve Form-B'deki metin kutusu txtVehicleName olarak adlandırılır. Bir denetimin ismini özellikler içinde ayarlayabilirsiniz. ImgVehicle 'i tıkladığınızda txtVehicleName' den txtVehicle 'a girecektir.

Biraz kodlama yapmak zorunda kalacaksınız - daha önce yapmadıysanız, bu kolay. Görüntünün özellikleri altında olayları göreceksiniz. "Tıkla" etkinliğine tıklarsanız, bir açılır liste alırsınız. Seçeneklerden biri [Etkinlik Prosedürü] olacaktır - bunu seçin. Üzerinde 3 nokta bulunan küçük bir düğme de satırın sonunda görünecektir. Tıklayın ve bunun gibi bir kod ile bir kod penceresine götürülmelidir. Kodunuzu koyduklarınızı burada bulabilirsiniz. Böyle bir şey işe yaramalı. Bu en basit biçimiyle.

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

Şimdi bu işe yarayacak olsa da, bu yöntemde yapmamamız gereken birkaç şey var. Form-B'yi, içinde bulunduğumuzdan beri referans göstermeliyiz, Form-A'nın aslında açık olduğunu doğrulamalıyız.

+0

Sadece odaklanmış elemanlar referans alınabileceğinden, bu işe yaramıyor. –

+0

Odak, bir öğeye veya bir forma başvurmak için gerekli değildir. Formlar açık olmalı, ancak görünür olmasına bile gerek yok. Alt formlar, yukarıda açıklandığı gibi açık bir şekilde referans alınmalıdır. Bir metin kutusundaki metin özelliği gibi yalnızca odakla kullanılabilen belirli özellikler vardır, ancak bunlar azınlıktadır. – Praesagus

+0

bu cevap neden reddedildi? – Praesagus

İlgili konular