Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Căn chỉnh chữ vừa với textbox
#1
Em muốn chỉnh cho dữ liệu khi xuất ra báo cáo thì dữ liệu sẽ tự thu nhỏ cho vừa texbox nếu văn bản dài hơn textbox giiongs như thuộc tính Shink trong excell ý ah ( không phải là textbox tự dãn theo chữ nhé) vì muốn cố định hàng và cột. mong các bác chỉ giáo
Reply
Những người đã cảm ơn
#2
(13-08-17, 02:42 AM)phanthang Đã viết: Em muốn chỉnh cho dữ liệu khi xuất ra báo cáo thì dữ liệu sẽ tự thu nhỏ cho vừa texbox nếu văn bản dài hơn textbox giiongs như thuộc tính Shink trong excell ý ah ( không phải là textbox tự dãn theo chữ nhé) vì muốn cố định hàng và cột. mong các bác chỉ giáo

Chào Bạn,
Chắc ý Bạn muốn rằng khi Report được in ra, nếu nội dung dữ liệu của 1 ô vượt quá chiều rộng của ô đó thì cho tự động xuống dòng và được kẻ ô cho đúng với chiều cao nhất của các ô dữ liệu.
Nếu ý của Bạn đúng như vậy, Bạn cần phải viết code VBA cho sự kiện in từng dòng trong vùng Detail của Report (Detail Print Event). MS Access không có sẵn định dạng cho nhu cầu này.
 
Có thể tóm tắt giải pháp như sau:
1. Phải tắt hết việc in đường kẻ ô của các ô dữ liệu trong vùng Detail (Border Style = Transparent)
Việc kẻ ô này ta sẽ cho thực hiện bằng code VBA tự viết.
 
2. Khai báo 2 thuộc tính “Can Grow” và “Can Shink” là Yes, nghĩa là cho tự động co dãn nội dung của từng ô dữ liệu (Trên Report của Access thì chỉ co dãn theo chiều cao của textbox thôi, còn chiều rộng thì không)
 
3. Viết code VBA cho sự kiện in vùng Detail (Detail Print Event), trong code ấy:
- Mỗi khi in 1 dòng, ta sẽ cho duyệt qua chiều cao của từng ô trong vùng Detail để lấy ra chiều cao nhất.
- Sau đó, vẽ khung chữ nhật cho từng ô với các tọa độ và kích thước như sau:
+ Đỉnh trái của khung chữ nhật = chỉ số lề trái (Left) của ô
+ Chiều rộng của khung chữ nhật = chiều rộng của ô
+ Chiều cao của khung chữ nhật = chiều cao nhất mà ta đã xác định được ở trên.
 
4. Code VBA mẫu:
Mã:
Private Sub Detail2_Print(Cancel As Integer, PrintCount As Integer)
Dim ctl As Control, ctlName As String
Dim lngMaxHeight As Long
Dim intCtrl As Long, k As Long
Dim ArrayCtl(50) As String
If GetValue("TatKhuyenmai") = True Then
    If Me.Dongia = 0 Then
        Cancel = True
        Exit Sub
    End If
End If

intCtrl = 0

For Each ctl In Me.Controls
    
    ctlName = ctl.Name
    If Me.Controls(ctlName).Section = 0 And Me.Controls(ctlName).ControlType = acTextBox Then
        If Me.Controls(ctlName).Height > lngMaxHeight Then
            lngMaxHeight = Me.Controls(ctlName).Height
        End If
        intCtrl = intCtrl + 1
        ArrayCtl(intCtrl) = ctlName
    End If
Next ctl

For k = 1 To intCtrl
    ctlName = ArrayCtl(k)
    Set ctl = Me.Controls(ctlName)

    Me.Line (ctl.Left, ctl.Top)-Step(ctl.Width, lngMaxHeight), , B
Next

Set ctl = Nothing
End Sub

Và đây là kết quả bản in:
[Hình: ama16bb6h391gbd4g.jpg]

Trong code VBA trên có sử dụng Line method của Report. 
[Hình: 6fhb8pfa22e8kvm4g.jpg]

Các Bạn tham khảo tài liệu giải thích và hướng dẫn của Microsoft tại link sau nhé: https://msdn.microsoft.com/VBA/Access-VB...hod-access
Chữ ký của lehongduc Lê Hồng Đức
Số ĐT: 0913.941.144
Email: lhongduc@gmail.com, lehongduc@quantribanhang.vn
Website: http://quantribanhang.vn
Reply
Những người đã cảm ơn phanthang
#3
cái này có đấy, nó co nhỏ chữ lại cho vừa textbox, còn có xuống dòng không thì chưa thử, mình áp dụng để làm thẻ tên nhân viên (hiện đang onl bằng mobile lên ko có demo)
Chữ ký của cpucloi Tôi chỉ biết mỗi một điều là những điều tôi biết được còn quá ít 021


ღღღღღTài sản của cpucloi (View All Items) ღღღღღ
Reply
Những người đã cảm ơn phanthang
#4
(13-08-17, 02:42 AM)phanthang Đã viết: Em muốn chỉnh cho dữ liệu khi xuất ra báo cáo thì dữ liệu sẽ tự thu nhỏ cho vừa texbox nếu văn bản dài hơn textbox giiongs như thuộc tính Shink trong excell ý ah ( không phải là textbox tự dãn theo chữ nhé) vì muốn cố định hàng và cột. mong các bác chỉ giáo

Cảm ơn bác. ý em là text co nhỏ lại cho vừa textbox ah
Reply
Những người đã cảm ơn
#5
(13-08-17, 08:45 AM)lehongduc Đã viết:
(13-08-17, 02:42 AM)phanthang Đã viết: Em muốn chỉnh cho dữ liệu khi xuất ra báo cáo thì dữ liệu sẽ tự thu nhỏ cho vừa texbox nếu văn bản dài hơn textbox giiongs như thuộc tính Shink trong excell ý ah ( không phải là textbox tự dãn theo chữ nhé) vì muốn cố định hàng và cột. mong các bác chỉ giáo

Chào Bạn,
Chắc ý Bạn muốn rằng khi Report được in ra, nếu nội dung dữ liệu của 1 ô vượt quá chiều rộng của ô đó thì cho tự động xuống dòng và được kẻ ô cho đúng với chiều cao nhất của các ô dữ liệu.
Nếu ý của Bạn đúng như vậy, Bạn cần phải viết code VBA cho sự kiện in từng dòng trong vùng Detail của Report (Detail Print Event). MS Access không có sẵn định dạng cho nhu cầu này.
 
Có thể tóm tắt giải pháp như sau:
1. Phải tắt hết việc in đường kẻ ô của các ô dữ liệu trong vùng Detail (Border Style = Transparent)
Việc kẻ ô này ta sẽ cho thực hiện bằng code VBA tự viết.
 
2. Khai báo 2 thuộc tính “Can Grow” và “Can Shink” là Yes, nghĩa là cho tự động co dãn nội dung của từng ô dữ liệu (Trên Report của Access thì chỉ co dãn theo chiều cao của textbox thôi, còn chiều rộng thì không)
 
3. Viết code VBA cho sự kiện in vùng Detail (Detail Print Event), trong code ấy:
- Mỗi khi in 1 dòng, ta sẽ cho duyệt qua chiều cao của từng ô trong vùng Detail để lấy ra chiều cao nhất.
- Sau đó, vẽ khung chữ nhật cho từng ô với các tọa độ và kích thước như sau:
+ Đỉnh trái của khung chữ nhật = chỉ số lề trái (Left) của ô
+ Chiều rộng của khung chữ nhật = chiều rộng của ô
+ Chiều cao của khung chữ nhật = chiều cao nhất mà ta đã xác định được ở trên.
 
4. Code VBA mẫu:
Mã:
Private Sub Detail2_Print(Cancel As Integer, PrintCount As Integer)
Dim ctl As Control, ctlName As String
Dim lngMaxHeight As Long
Dim intCtrl As Long, k As Long
Dim ArrayCtl(50) As String
If GetValue("TatKhuyenmai") = True Then
    If Me.Dongia = 0 Then
        Cancel = True
        Exit Sub
    End If
End If

intCtrl = 0

For Each ctl In Me.Controls
    
    ctlName = ctl.Name
    If Me.Controls(ctlName).Section = 0 And Me.Controls(ctlName).ControlType = acTextBox Then
        If Me.Controls(ctlName).Height > lngMaxHeight Then
            lngMaxHeight = Me.Controls(ctlName).Height
        End If
        intCtrl = intCtrl + 1
        ArrayCtl(intCtrl) = ctlName
    End If
Next ctl

For k = 1 To intCtrl
    ctlName = ArrayCtl(k)
    Set ctl = Me.Controls(ctlName)

    Me.Line (ctl.Left, ctl.Top)-Step(ctl.Width, lngMaxHeight), , B
Next

Set ctl = Nothing
End Sub

Và đây là kết quả bản in:
[Hình: ama16bb6h391gbd4g.jpg]

Trong code VBA trên có sử dụng Line method của Report. 
[Hình: 6fhb8pfa22e8kvm4g.jpg]

Các Bạn tham khảo tài liệu giải thích và hướng dẫn của Microsoft tại link sau nhé: https://msdn.microsoft.com/VBA/Access-VB...hod-access

Cảm ơn bác. ý em là text co nhỏ lại cho vừa textbox ah
Reply
Những người đã cảm ơn
#6
(13-08-17, 06:18 PM)cpucloi Đã viết: cái này có đấy, nó co nhỏ chữ lại cho vừa textbox, còn có xuống dòng không thì chưa thử, mình áp dụng để làm thẻ tên nhân viên (hiện đang onl bằng mobile lên ko có demo)

Đúng ý em đấy ah, bác demo chi tiết giúp em, em tự mò thôi nên kiến thức hạn hẹp
Reply
Những người đã cảm ơn
#7
Cái này mình sưu tầm được trên Internet khá lâu, không rõ của ai, nếu của ai vui lòng cmt để mình bổ sung thông tin
1.       Tạo Module
 
Mã PHP:
Option Compare Database
[/font][/size][/color]Option Explicit
Private Type Size
       cx 
As Long
       cy 
As Long
End Type
' Declare API functions.
Private Declare PtrSafe Function CreateFont Lib "gdi32" Alias "CreateFontA" _
(ByVal H As Long, ByVal w As Long, ByVal E As Long, ByVal O As Long, _
ByVal w As Long, ByVal i As Long, ByVal u As Long, ByVal S As Long, _
ByVal c As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long
Private Declare PtrSafe Function SelectObject Lib "gdi32" (ByVal hdc As Long, _
ByVal hObject As Long) As Long
Private Declare PtrSafe Function apiDeleteObject Lib "gdi32" _
Alias "DeleteObject" (ByVal hObject As Long) As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" _
(ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function MulDiv Lib "kernel32" (ByVal nNumber As Long, _
ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
Private Declare PtrSafe Function CreateIC Lib "gdi32" Alias "CreateICA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As String, lpInitData As Any) As Long
Private Declare PtrSafe Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare PtrSafe Function apiGetTextExtentPoint32 Lib "gdi32" _
 Alias "GetTextExtentPoint32A" _
 (ByVal hdc As Long, ByVal lpsz As String, _
 ByVal cbString As Long, lpSize As Size) As Long
Private Declare PtrSafe Function apiGetDC Lib "user32" _
 Alias "GetDC" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function apiReleaseDC Lib "user32" _
Alias "ReleaseDC" (ByVal hWnd As Long, _
ByVal hdc As Long) As Long
Private Declare PtrSafe Function apiDeleteDC Lib "gdi32" _
 Alias "DeleteDC" (ByVal hdc As Long) As Long
Private Declare PtrSafe Function RestoreDC Lib "gdi32" (ByVal hdc As Long, ByVal nSavedDC As Long) As Long
Private Declare PtrSafe Function SaveDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare PtrSafe Function GetTextAlign Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare PtrSafe Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long

'
Used to ask System for the Logical pixels/inch in Y axis
Const LOGPIXELSY 90
'Used to ask System for the Logical pixels/inch in X axis
Const LOGPIXELSX = 88
'
Stock Object System Font
Const SYSTEM_FONT 13
'**LEAVE THESE AS PUBLIC VARS

'
Handle to Report's window
Dim hWnd As Long
'
Reports Device Context
Dim hdc 
As Long
'Holds the current screen resolution
Dim lngYdpi As Long
Function fMakeFitSingle(ctl As Control, FontHeight As Integer) As Boolean

   '
Name                   fMakeFit
   
'Purpose:               Resize Font to make text fit into
   ' 
                      a fixed size Text Control
   
'Version:               1.0 RAW :-)
   '
Calls                  Text API stuff
   
'Created by:            Stephen Lebans
   '
Date                 Oct 231999
   
'Time:                  11:40:18pm
   '
Feedback             macarthu@nbnet.nb.ca
   
'My Web Page:           http://www.lebans.com
   '
Copyright            Lebans Holdings Ltd.
   '                       May not be resold in whole or part
   ' 
                      but may be used without restriction
   
'                       in any software you develop.
   '
   'Calculates the Font size required to force the current
   '
text to fit inside the fixed size Text Control
   
'WORKS WITH SINGLE LINE DATA ONLY!!!!!!!!!!!!!!!
   '
See modMakeFitMemo to handle multiple lines.
    'Bugs:
   '
Not tested enough to tellLet me know
   
'
   '
Enjoy
   
'Stephen Lebans
 
   '
***************Code Start***************
   Dim hFont As Long
   
'handle to font we created in MakeFont
   '
so that we can destroy it before exiting main function
   Dim hFontCtl
   
'font that was selected in DC first time through
   '
this function
     'Temporary holder for returns from API calls
   Dim lngret As Long
   '
Calculate screen Font height
   Dim fheight 
As Long
 
   
'Holder for what Font Size works
   Dim intFontHeight
   hWnd = ctl.Parent.hWnd
   '
retrieve a handle to a display device context (DC)
   'for the client area of the specified window
   hdc = apiGetDC(hWnd)
  
   '
Let's save the current state of the DC to restore after
   '
We will be changing the font size
   
'lngRet = SaveDC(hdc)
  
   '
Store this so we can reset the Font that was initially selected into
   
'the hdc when we entered this function
   '
Nevermindwe've picked it up upon entering this function instead
 
   hFontCtl = SelectObject(hdc, GetStockObject(SYSTEM_FONT))
   lngret = SelectObject(hdc, hFontCtl)
 
   '
Do we have to bother calling the
   
'main function?

   If Not IsNull(ctl.Value) Then
   If ctl.Value <> "" Then
 
   '
Clear our return value
   lngret 
0
  

   
'**************

   ' 
MakeFont uses FontHeight passed in Function call

 

   
' Lets make sure our Control's Fontsize is the same

   
' as the size passed to this function

   ctl.FontSize = FontHeight
  

 Do While lngret >= 0

   hFont = makefont(hdc, ctl)

   lngret = JustifyText(hdc, ctl)
 
  

   Select Case lngret

       Case -2

       '
Put your error handlers here

       hFont 
SelectObject(hdchFontCtl)

       lngret apiDeleteObject(hFont)

       lngret apiReleaseDC(hWndhdc)

       fMakeFitSingle False

       Exit 
Function

       

       

       Case 
-1

       
'Everything OK

       '
Cleanup!

       hFont SelectObject(hdchFontCtl)

       lngret apiDeleteObject(hFont)

       lngret apiReleaseDC(hWndhdc)

       fMakeFitSingle True

       Exit 
Function

   

       Case 0

       
'Everything OK

       '
Cleanup!

       hFont SelectObject(hdchFontCtl)

       lngret apiDeleteObject(hFont)

       lngret apiReleaseDC(hWndhdc)

       fMakeFitSingle True

       Exit 
Function

       

       Case 
Else

       'Here is the actual number of characters

       '
left that didn't fit in the box

       '
you could use this number to speed up

       
'the process. I don't here

       ctl
.FontSize ctl.FontSize 1

       
'Let's get real hereHow small

       
'can you go. This is for error handling

       '
as well so put something here.

       If ctl.FontSize 3 Then Exit Do

   

   End Select

 

 Loop

 

 
'Control's value is null

 End 
If

   'Control's value is a zero length string

   End 
If

   

   
'Cleanup!

   hFont = SelectObject(hdc, hFontCtl)

   lngret = apiDeleteObject(hFont)

   lngret = apiReleaseDC(hWnd, hdc)

   fMakeFitSingle = True

End Function

Private Function JustifyText(hdc As Long, ctl As Control) As Long

 

 '
This function is adapted from my Justification function.

 'IT IS FOR SINGLE LINE DATA ONLY!!!!!!!!!!!!!!!!!!!!!

 

 '
API's need UserControl.Width in Pixels not Twips

 Dim UserControlWidthPixels As Integer

 Dim UserControlHeightPixels As Integer

    

 '
Junk holder for Return values we don't use

 Dim lngReturn As Long

 

 '
UDT to hold Text Height and Width from API

 Dim lpSize 
As Size

   

'This is the actual Text string(Caption)

 Dim pText As String

 

 '
Length of the entire string to be output.

 Dim CaptionLength As Integer

 

 
'Grab the current string from the control

 

 pText = ctl.Value

 CaptionLength = Len(pText)

 On Error GoTo MYHandler

 

 '
Calculate Current UserControl.Width in Pixels

 UserControlWidthPixels 
= (ctl.Width \ (1440 lngYdpi))

 'UserControlHeightPixels = (ctl.Height \ (1440 \ lngYdpi))

 

 '
We have to leave space for the border

 
'Adjust as you see fit! :-)

 '
Must be a minimum of 10 pixels otherwise

 
'to allow for the border width Access uses to calculate

 '
what text will actaully fit in a control

UserControlWidthPixels 
UserControlWidthPixels 10

 
'UserControlHeightPixels = UserControlHeightPixels - 6

   

 ' 
See if current text in control FITS

   

  lngReturn 
apiGetTextExtentPoint32(hdcpTextLen(pText), lpSize)

  'Debug.Print "Ctl.FontSize:" & ctl.fontsize & "  | " & "lpsize.cx:" & lpSize.cx & " | " _

  '
"CtlWidth:" UserControlWidthPixels " | " ctl.Value

  

  
If lpSize.cx >= UserControlWidthPixels Then

  
' Keep reducing Font Size - still doesn't fit.

  JustifyText 1

  
Else

  ' OK it fits we'er all done

  JustifyText 
= -1

  

  End 
If

  Exit Function

    

  

  

MYHandler
:

'Add your own handlers here.

On Error Resume Next

JustifyText = -2

End



End Function

Private Function makefont(hdc As Long, ctl As Control) As Long

'
Returns handle to newfont so we can delete it when we exit amin function

 Dim newfont As Long

 Dim oldfont 
As Long

 Dim lngret 
As Boolean

 

 Dim fheight 
As Integer

 

 
'Temporary Information Context for Screen info.

 Dim lngIc As Long

   

 '
Modified to allow for different screen resolutions

 
'and printer output. Needed to Calculate Font size

 lngIc = CreateIC("DISPLAY", vbNullString, vbNullString, vbNullString)

 If lngIc <> 0 Then

   lngYdpi = GetDeviceCaps(lngIc, LOGPIXELSY)

   DeleteDC (lngIc)

 Else

   lngYdpi = 120 '
Default average value

 End 
If

  

 
'Calculate/Convert requested Font Height

 '
into Font's Device Coordinate space

 fheight = MulDiv(ctl.FontSize, lngYdpi, 72)

 

 '
We use a negative value to signify

 
'to the CreateFont function that we want a Glyph

 '
outline of this size not a bounding box.

 

 With ctl

 newfont 
CreateFont(-fheight0_

     0
0, .FontWeight_

     
.FontItalic, .FontUnderline_

     0
00_

      0
00, .FontName)

  End With

 
' Select the new font.

 oldfont = SelectObject(hdc, newfont)

 

 '
I was worried about trying to delete the

 
'font originally selected into the Control

 '
in Report Design view.

 'Doesn't seem to be causing any problems

 
'...running very fast away! :-)

 apiDeleteObject (oldfont)

 

 '
Return handle to font to be destroyed when we exit main function

 'actually I've decided to pick it up as we enter the main function

 makefont newfont

 End 
Function


[
color=#000000][size=small][font=Calibri] 

2.       Tại thuộc tính Onformat
Với số 14 là cỡ lớn nhất mà bạn muốn, txt_hovaten là textbox muốn căn chữ
 
Mã PHP:
   Dim lngret2 As Long 'For Last Name Control
[/font][/size][/color]
   lngret2 = fMakeFitSingle(txt_hovaten, 14)
[color=#000000][size=small][font=Calibri] 
 
View report của bạn để xem thành quả.
Lưu ý, cách này dòng chữ không tự động xuống dòng khi vượt qua chiều rộng textbox, cỡ chữ thu nhỏ đến khi dòng chữ bằng chiều rộng textbox.
Chữ ký của cpucloi Tôi chỉ biết mỗi một điều là những điều tôi biết được còn quá ít 021


ღღღღღTài sản của cpucloi (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Đổi tên hàng loạt textbox trong report NguyenDungAnh 4 259 05-09-18, 07:56 PM
Bài mới nhất: ongke0711
  Hỏi cách điều chỉnh report ledangvan 3 381 27-05-18, 07:13 PM
Bài mới nhất: ledangvan
  [Hỏi] Chỉnh report gói gọn trong 1 trang pvhung76 3 693 01-12-17, 11:29 PM
Bài mới nhất: DooHoaangPhuuc
  Khi Textbox trống thì texbox và Label cũng ẫn theo. thanhtruong 5 1,367 18-02-17, 08:24 PM
Bài mới nhất: tranthanhan1962
  [Hỏi] Điều chỉnh tỷ lệ in report như trong Excel trangdv.pchg 1 623 18-02-17, 04:16 PM
Bài mới nhất: cpucloi

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line