มีปัญหากับ Modal และ Popup
กระทู้เก่าบอร์ด อ.Yeadram

 1,958   8
URL.หัวข้อ / URL
มีปัญหากับ Modal และ Popup

คือใน Form Porperty ผมไปกำหนด Modal และ Popup ให้เป็น Yes
...ทีนี้ผมสร้างปุ่มขึ้นมาเพื่อให้มันทำการเปิด Table ที่เราเลือกจาก form คำสั่งแบบนี้
DoCmd.OpenTable txtTableName, acViewNorma

ปัญหาคือเมื่อ table ถูกเปิดขึ้นมา แต่มันไม่แสดง
เพราะถูก Form บังอยู่
ผมต้องทำอย่างไรดี ไม่อยาก Popup ออกหนะครับ

โดยปกติถ้าผมสั่งเปิดฟอร์มอื่นแล้วฟอร์มอื่นมีคุณสมบัติ popup เหมือนกัน
form ที่เปิดใหม่จะอยู่บนสุด ก็ไม่ได้มีปัญหาอะไร
แต่นี้ผมต้องการเปิด table ตรงๆ แล้วคุณสมบัติ popup ของ table ก็ดันไม่มี
พอมีวิธีแนะนำเปล่า

8 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R19468
ลองสร้าง Datasheet Form จากเทเบิลนี้ แล้วกำหนด Popup ให้ Datasheet นี้แทน
2 @R19469
ขอบคุณครับ
แต่ table ที่ต้องการเปิด หลากหลายมากครับ
3 @R19471
ย่อมันลงไปก่อนไม่ได้เหรอครับ

    DoCmd.Minimize
    DoCmd.OpenTable "ตาราง"

ปล. Modal = Yes มันจะทำให้ไม่สามารถ Active ตารางได้นะครับ จริงๆแล้วลักษณะของคุณควรเอาออก หรือใส่ไว้ที่โค๊ดแบบนี้ก็ได้ครับ

    DoCmd.Minimize
    DoCmd.OpenTable "person"
    Me.Modal = False

อะไรประมาณนี้ ไม่รู้ความต้องการ ลองปรับใช้เองนะครับ
4 @R19472
คืองี้ครับผมดันไปใช้
DoCmd.RunCommand acCmdAppMinimize 'ตอนเปิด Form
เพื่อให้ Form มันดูเป็น application ที่ไม่มีกรอบของ access

พอสั่ง Docmd.Mininze มันก็เลยย่อหมดเลย ไม่เห็นอะไรเลย

...และต่อให้ทำได้นะครับ พอตอนเปิด table เสร็จแล้ว
และ user ปิด table ...ตัว form ที่เราต้องการมันก็ไม่กลับมา

5 @R19475
ในที่สุดผมก็ต้องใช้วิธี สร้างฟอร์ม data sheet
...โดยผมสร้าง control textbox ไว้รอประมาณ 30 ตัว
แล้วค่อย assign table กับ field จาก table ลงไปใน control

ผมเขียนประมาณนี้ครับ
Private Sub Form_Open(Cancel As Integer)
Dim tbName As String

tbName = Forms!frmA!TableName
Me.RecordSource = tbName

Nm = CurrentDb.TableDefs(tbName).Fields.Count
For i = 1 To Nm '
    'Me("TEX" & Format(i, "00")).Enabled = True
    'Me("TEX" & Format(i, "00")).Visible = True
    
    Me("LAB" & Format(i, "00")).Caption = CurrentDb.TableDefs(tbName).Fields(i - 1).Name
    Me("TEX" & Format(i, "00")).ControlSource = CurrentDb.TableDefs(tbName).Fields(i - 1).Name
    'Debug.Print i & " - " & Me("LAB" & Format(i, "00")).Caption
Next
End Sub

ใช้งานได้โอเคอยู่นะครับ
แต่ปัญหาก็มีอีกคือ control textbox ที่ผมสร้างไว้รอมันดันยงคงโชว์อยู่
อยากให้มันหายไป ไม่รู้ต้องทำไง
6 @R19477
ผมสงสัยอยู่ว่าควรออกแบบใหม่หรือเปล่า

ถ้าออกแบบให้ทุก Form เป็นแบบ เปิดทำงานได้ทีละ Form
อาจจะเปลี่ยนเป็นว่า เปิด Form ใหม่เมื่อไร ให้ ซ่อน Form เก่าไปก่อน (ถ้าไม่ต้องการปิด) โดยใช้ Form.Visible = False
พร้อมกับส่ง ชื่อ Form เป็นตัวแปร ให้ Form ใหม่จำไว้
เมื่อปิด Form ใหม่ก็ให้ Form เก่า Visible = True

ส่วนกรณีเปิด Table อาจปรับด้วยการ เปิด Table แล้วไม่ต้องซ่อน Form เพราะเราเขียน code On_Close ให้กับ Table ไม่ได้
ซึ่งTable เมื่อเปิดก็จะขึ้นมาทับ Form เดิม ตามปกติ
หากขณะที่ Table เปิดอยู่ไม่อาจให้แตะต้อง Form ได้ อาจใช้วิธี code ที่ On_Activate ของ Form ให้เด้งกลับไปหา Table
หรือ หาก Activate Form แล้วถือว่าไม่ต้องการทำอะไรกับ Table แล้ว ก็ code ให้ปิด table ไปเลยครับ
7 @R19478
อื่ม! เห็นถึงความพยายามเลยครับ ผมช่วยคิดให้นิดนึงแล้วกัน
คุณไม่จำเป็นต้องสร้างฟอร์มก่อนครับ ใช้คำสั่งสร้างฟอร์มได้เลย ตัวอย่างนะครับ

สมมุติผมต้องการเปิดตารางชื่อ Table1
1. ใส่ฟังก์ชั่นนี้ลงใน Module ดังนี้:
'-----------------------------------------------------------------------------
Public Function funcCreateForm(tbN As String)
    If Nz(DLookup("Name", "MsysObjects", "[Name] = '" & "frm_" & tbN & "'"), "") <> "" Then
        Exit Function
    End If
    Dim frm As Form, db As DAO.Database, tb As DAO.TableDef, fld As DAO.Field, i As Integer, frmN As String
    Dim ctlField()
    Set frm = CreateForm
    frm.Caption = tbN
    frm.RecordSource = tbN
    frm.DefaultView = 2
    frm.PopUp = True
    frm.Modal = True

    Set db = CurrentDb
    Set tb = db.TableDefs(tbN)
    For Each fld In tb.Fields
        ReDim Preserve ctlField(i)
        If fld.Type = 1 Then
            Set ctlField(i) = CreateControl(frm.Name, acCheckBox, , , fld.Name, 0, 0, 720, 200)
        ElseIf fld.Type = 11 Then
            Set ctlField(i) = CreateControl(frm.Name, acBoundObjectFrame, , , fld.Name, 0, 0, 720, 200)
        ElseIf fld.Type = 101 Then
            Set ctlField(i) = CreateControl(frm.Name, acAttachment, , , fld.Name, 0, 0, 720, 200)
        Else
            Set ctlField(i) = CreateControl(frm.Name, acTextBox, , , fld.Name, 0, 0, 720, 200)
        End If
        ctlField(i).Name = fld.Name
        i = i + 1
    Next

    frmN = frm.Name
    DoCmd.Close acForm, frm.Name, acSaveYes
    DoCmd.Rename "frm_" & tbN, acForm, frmN
End Function
'------------------------------------------------------------------------

2. ที่ปุ่มเปิดบนฟอร์ม Event > On Click:
    Dim TTT As String
    TTT = "Table1"
    funcCreateForm TTT
    DoCmd.OpenForm "frm_" & TTT, acFormDS
    DoCmd.Maximize

- การทำงานคือ หากตารางที่เรียกไม่เคยมีการสร้างฟอร์มด้วยคำสั่งนี้ มันจะสร้างฟอร์มเป็น Datasheet ขึ้นมาครบทุกฟิลด์ตามตาราง โดยให้ชือว่า frm_ชื่อตาราง

ลองปรับใช้ดูครับ ผมเขียนแล้วทดสอบคร่าวๆยังไงลองทดสอบดูอีกทีนะครับ
8 @R19480
ขอบคุณครับคุณ TTT
เมื่อวานผมลองแล้ว แนวคิดประมาณเดียวกันครับ
แต่ผมขี้เกียจเขียนเยอะ
ก็เลยใช้ Form เดิมที่สร้างไว้อยู่แล้ว
กับ 30 Control Textbox ที่สร้างไว้อยู่แล้วเหมือนกัน
โดยการทำการ delete control แทน

วิธีการคือ มี Master Form เก็บไว้
เวลาสั่งเปิด Form ก็ใช้วิธีการสั่งให้มัน copy มา
จากนั้นก็เปิดแบบ design เสร็จแล้วสั่งลบ Control ตัวที่เกินจาก Field ใน Table ออก แล้วก็ assign table ,assign field
...ประมาณนี้ครับ ใช้งานได้ละ ^.^

ส่วนของคุณ TTT ที่อุตสาห์เขียนมาให้
ขอเก็บไว้นะครับ เผื่อคราวหน้าจะเขียนแบบสร้างใหม่เต็ม
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3372s