กระทู้เก่าบอร์ด อ.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 ก็ดันไม่มี
พอมีวิธีแนะนำเปล่า
...ทีนี้ผมสร้างปุ่มขึ้นมาเพื่อให้มันทำการเปิด 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 ที่ต้องการเปิด หลากหลายมากครับ
แต่ table ที่ต้องการเปิด หลากหลายมากครับ
3 @R19471
ย่อมันลงไปก่อนไม่ได้เหรอครับ
DoCmd.Minimize
DoCmd.OpenTable "ตาราง"
ปล. Modal = Yes มันจะทำให้ไม่สามารถ Active ตารางได้นะครับ จริงๆแล้วลักษณะของคุณควรเอาออก หรือใส่ไว้ที่โค๊ดแบบนี้ก็ได้ครับ
DoCmd.Minimize
DoCmd.OpenTable "person"
Me.Modal = False
อะไรประมาณนี้ ไม่รู้ความต้องการ ลองปรับใช้เองนะครับ
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 ที่เราต้องการมันก็ไม่กลับมา
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 ที่ผมสร้างไว้รอมันดันยงคงโชว์อยู่
อยากให้มันหายไป ไม่รู้ต้องทำไง
...โดยผมสร้าง 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 ไปเลยครับ
ถ้าออกแบบให้ทุก 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_ชื่อตาราง
ลองปรับใช้ดูครับ ผมเขียนแล้วทดสอบคร่าวๆยังไงลองทดสอบดูอีกทีนะครับ
คุณไม่จำเป็นต้องสร้างฟอร์มก่อนครับ ใช้คำสั่งสร้างฟอร์มได้เลย ตัวอย่างนะครับ
สมมุติผมต้องการเปิดตารางชื่อ 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 ที่อุตสาห์เขียนมาให้
ขอเก็บไว้นะครับ เผื่อคราวหน้าจะเขียนแบบสร้างใหม่เต็ม
เมื่อวานผมลองแล้ว แนวคิดประมาณเดียวกันครับ
แต่ผมขี้เกียจเขียนเยอะ
ก็เลยใช้ Form เดิมที่สร้างไว้อยู่แล้ว
กับ 30 Control Textbox ที่สร้างไว้อยู่แล้วเหมือนกัน
โดยการทำการ delete control แทน
วิธีการคือ มี Master Form เก็บไว้
เวลาสั่งเปิด Form ก็ใช้วิธีการสั่งให้มัน copy มา
จากนั้นก็เปิดแบบ design เสร็จแล้วสั่งลบ Control ตัวที่เกินจาก Field ใน Table ออก แล้วก็ assign table ,assign field
...ประมาณนี้ครับ ใช้งานได้ละ ^.^
ส่วนของคุณ TTT ที่อุตสาห์เขียนมาให้
ขอเก็บไว้นะครับ เผื่อคราวหน้าจะเขียนแบบสร้างใหม่เต็ม
Time: 0.3372s