แทรกข้อมูลเข้าใน textbox ที่ตำแหน่ง cursor
กระทู้เก่าบอร์ด อ.Yeadram

 3,863   15
URL.หัวข้อ / URL
แทรกข้อมูลเข้าใน textbox ที่ตำแหน่ง cursor

รบกวนสอบถาม อ.yeadram และผู้รู้ทุกท่านครับ

ผมทำฟอร์ม โดยมี textbox1 , textbox2 คอยรับค่าจากปุ่มที่กด

โดยปุ่มในฟอร์มผมทำคล้ายกับคีย์บอร์ดคือมีปุ่ม
0-9 และ A-Z , Space bar

เช่นเวลาเรากดปุ่ม A ก็ให้มันเอาตัว A ไปใส่ใน textbox และตำแหน่ง ที่ cursor อยู่ ถ้า cursor อยู่ตรงไหนก็ให้มันแทรกข้อความ หรือ ตัวเลขลงไป หรือกด
ปุ่ม Space bar ก็ให้มันเว้นช่องไฟไว้ให้เรา

ขอบคุณมากครับ

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

1 @R05223
โอ หนอ ความต้องการมนุษย์
นี่ไม่คิดจะใช้คีย์บอร์ดกันเลยเน๊าะ
จะใช้แต่เม้าส์อย่างเดียวเลยเหรอครับ
เอ๊ะ หรือว?าเขาจะเอาไปประยุกต์ใช้กับ ระบบ touch screen ฮึ!

ถามหน่อยซิครับ หลังจากป้อนค่าลงใน textbox แล้วจะให้ pointer มันไปโฟกัสที่ไหนต่อละครับ อิอิ


เอาเป็นว่า คุณลองสร้างฟอร์มเปล่า 1 ตัว
มี textbox ชื่อ text0
มีปุ่ม command button สัก 2ปุ่ม ชื่ออะไรก็ได้
ในพร็อพเพอร์ตี้ ของ command button ให้เขียนลงไปในเหตุการณ์ "เมื่อคลิ๊ก" ว่า
=prss("a")
=prss("b")
(ปุ่มละอย่าง)

ในโมดูลของฟอร์มนี้ ลอง คัดลอกโค้ดนี้ลงไปวาง
Option Compare Database
Dim tStart
Dim tLength

Function prss(ByVal st As String)
Text0 = Left(Text0, tStart) & st & Mid(Text0, tStart + tLength + Len(st))
Text0.SetFocus
Text0.SelStart = tStart + Len(st)
Text0.SelLength = 0
End Function

Private Sub Text0_LostFocus()
tStart = Me.Text0.SelStart
tLength = Me.Text0.SelLength
End Sub


คิดว่าตรงความต้องการหรือเปล่า หรือพอจะนำไปประยุกต์ต่อยอดได้หรือเปล่าครับ
2 @R05229
ขอบคุณมากครับ อ.yeadram

ว่าจะลองทำแบบ touch screen ดูนะครับ
ที่ อ. แนะนำก็ใช้ได้ครับ แต่ถ้ามีอีก textbox อีกอันคือ
Text1 ผมต้องการ เมื่อ cursor มาอยู่ที่ Text1 ก็ให้ค่าเอามาใส่ใน text1
ถ้า cursor มาอยู่ที่ text0 ก็ให้เอาค่ามาใส่ที่ text0

ขอบคุณมากครับ
3 @R05230
เอาของเก่าปรับปรุงเพิ่มนิดหน่อย

Option Compare Database
Dim tStart
Dim tLength
Dim tControl

Function prss(ByVal st As String)
with me(tControl)
.value = Left(Text0, tStart) & st & Mid(Text0, tStart + tLength + Len(st))
.SetFocus
.SelStart = tStart + Len(st)
.SelLength = 0
end with
End Function

Private Sub Text0_LostFocus()
tStart = Me.Text0.SelStart
tLength = Me.Text0.SelLength
tControl="Text0"
End Sub

Private Sub Text1_LostFocus()
tStart = Me.Text1.SelStart
tLength = Me.Text1.SelLength
tControl="Text1"
End Sub
4 @R05231
ขอบคุณมากครับ อ.yeadram
สงสัยผมจะอธิบายความต้องการผมไม่ดี

คือผมไม่ได้ต้องการค่าใน text0 มาใส่ใน text1
แต่ต้องการทำทุกอย่างเหมือนกันกับที่ทำใน text0
เมื่อ cursor มาอยู่ที่ text1 และเมื่อกด command button
ก็ให้เอาค่าใน command button มาใส่ครับ เช่นกดปุ่มแรก a, ปุ่ม2 b
ก็ให้เอา a และ b มาแสดงใน text1 โดยไม่ต้องเกี่ยวข้องกันกับ text0

ขอบคุณมากครับ
5 @R05233
อ้อ ผมแก้โค้ดไม่ครบ อิอิ
จริงๆ ผมก็ไม่ได้เอา text0 มาใส่ text1 นะครับ แต่ผมปรับโค้ดไม่ครบทุกจุดมั้ง มันเลยออกมาทำให้เข้าใจผิดอย่างนั้น (พอดีคิดๆ แล้วเขียนเลยไม่ได้ทดสอบครับ)

บรรทัดนี้
.value = Left(Text0, tStart) & st & Mid(Text0, tStart + tLength + Len(st))
แก้เป็น
.value = Left(me(tcontrol), tStart) & st & Mid(me(tcontrol), tStart + tLength + Len(st))
6 @R05244
ขอบคุณมากครับ อ.yeadram
7 @R06234
รบกวน อ.yeadram อีกครั้งครับ
1. กดปุ่ม Caps Lock แล้วเปลี่ยนให้เป็นตัวพิมพ์ใหญ่
2. กดปุ่มลบข้อมูล Backspace and Delete ให้มันลบข้อมูล

ไม่ทราบว่าต้องทำเช่นไรได้บ้างครับ
8 @R06240
รบกวนด้วยครับ
ไม่ทราบว่าต้องทำเช่นไรได้บ้างครับ
9 @R06241
กำลังหาทางอยู่ครับ
ผมลองเอาแบบง่ายๆ ด้วยการ
- ปุ่ม ลบ ใช้ sendkeys แต่มันยังติดๆ ขัดๆ อยู่ ดูเหมือนไม่สมบูรณ์นัก
Private Sub cmdBSP_Click()
Me(tControl).SetFocus
If tStart = 0 Then tStart = Len(Me(tControl))
Me(tControl).SelStart = tStart
Me(tControl).SelLength = tLength
SendKeys "{BACKSPACE}"
End Sub

Private Sub cmdDEL_Click()
Me(tControl).SetFocus
If tStart = 0 And tLength = 0 Then tLength = Len(Me(tControl))
Me(tControl).SelStart = tStart
Me(tControl).SelLength = tLength
SendKeys "{DELETE}"
End Sub

- ปุ่ม Caps เองอาจต้องรื้อโค้ดใช้วิธีใหม่จะง่ายกว่า
เดี๋ยวรอว่าง แบบยาวๆ แล้วจะลองร่างดูใหม่ครับ
10 @R06244
ขอบคุณมากครับ อ.yeadram
11 @R06245
- ลองทำดูตัว backspace มันจะลบตัวท้ายสุดไล่ไปข้างหน้า ถึงแม้เราเอา cursor ไปวางไว้ในตำแหน่งใด ก็ตาม

- ส่วนตัว delete มันก็จะลบทั้งหมดเลยครับ ไม่ได้ลบทีละตัว

ขอบคุณมากครับ
12 @R06250
Option Compare Database
Dim tStart As Long
Dim tLength As Long
Dim tControl As String

Sub GetStation()
tStart = Me(tControl).SelStart
tLength = Me(tControl).SelLength
End Sub
Sub LetStation()
With Me(tControl)
.SetFocus
.SelStart = tStart
.SelLength = tLength
End With
End Sub
Function prss(ByVal Btt As String)
LetStation
If tStart > Len(Me(tControl)) Then
Me(tControl).Text = Trim(Me(tControl)) & Space(tStart - Len(Me(tControl))) & Right(Me(Btt).Caption, 1)
Else
Me(tControl).SelText = Right(Me(Btt).Caption, 1)
'SendKeys Right(Me(Btt).Caption, 1), True
End If
Me(tControl).SelStart = tStart + 1
GetStation
End Function

Private Sub bttCAP_Click()
bl_caps = IIf(Asc(Chra.Caption) = 65, True, False)
For Each ctl In Me.Controls
If Left(ctl.Name, 3) = "chr" Then ctl.Caption = IIf(bl_caps = True, LCase(ctl.Caption), UCase(ctl.Caption))
Next
LetStation
End Sub

Private Sub bttCLR_Click()
If Asc(Chra.Caption) = 65 Then bttCAP_Click
Dim FirstLoop As Integer
Dim ctl As Control
FirstLoop = 1
For Each ctl In Me.Controls
If TypeOf ctl Is TextBox Then
If FirstLoop = 1 Then
ctl.SetFocus
tControl = ctl.Name
End If
ctl = Null
FirstLoop = FirstLoop + 1
End If
Next
tStart = 0
tLength = 0
End Sub

Private Sub bttBCK_Click()
LetStation
SendKeys "{BACKSPACE}"
tStart = tStart - 1
End Sub

Private Sub bttDEL_Click()
LetStation
SendKeys "{DELETE}"
' ถ้าเคอเซอร์อยู่หลังสุด กดปุ่ม Delete ให้ลบทั้งหมด
If tStart = Len(Me(tControl)) Then
Me(tControl) = Null
tStart = 0
tLength = 0
End If
End Sub

Private Sub bttSPC_Click()
LetStation
SendKeys " ", True
GetStation
End Sub

Private Sub bttTAB_Click()
LetStation
SendKeys "{TAB}"
tControl = Me(Screen.ActiveControl.Name).Name
GetStation
End Sub

Private Sub Form_Open(Cancel As Integer)
bttCLR_Click
End Sub

***************** เขียนโค้ดให้กับ Textbox 1 ตัว **********************
Private Sub text0_Click()
tControl = "text0"
GetStation
End Sub
Private Sub text0_GotFocus()
tControl = "text0"
End Sub
' ****************** จบโค้ด สำหรับ textbox 1 ตัว ***********************


Private Sub text1_Click()
tControl = "text1"
GetStation
End Sub
Private Sub text1_GotFocus()
tControl = "text1"
End Sub



ยกเว้น textbox แล้ว คอนโทรลอื่นๆ ตั้งค่า Tabstop เป็น False ให้หมด
13 @R06253
ขอบคุณท่าน อ.yeadram มากครับ ที่สละเวลาทำมาให้

ขอบคุณมากครับ
14 @R06324
เข้าใจว่า คุณ weezaa จะนำโค้ดนี้ไปประยุกต์ใช้กับ ระบบ Touch screen ใช่หรือเปล่าครับ ผมอยากเล่นบ้าง
ไม่ทราบว่าคุณ weezaa พอจะให้ข้อมูลได้ไหมครับ ว่าใช้กับเครื่องอะไรรุ่นอะไร งบประมาณน้อยๆ อย่างผมพอจะหามาลองเล่นกับเขาได้บ้างหรือเปล่าครับ
15 @R06342
เรียน อ.yeadram
เครื่อง touch screen ผมก็ยังไม่เคยใช้
กะว่า ให้งานส่วนนี้เสร็จ ผมจึงจะลองหามาใช้งานดูครับ
ซึ่งคิดว่า ในปัจจุบันนี้ ราคาน่าจะไม่แพงนะครับ
ไว้ผมมีข้อมูล หรือได้ใช้งาน ผมจะมารายงานให้ทราบครับ

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