Hiện chữ trên thanh tiêu đề của Form?

  • Thread starter Thread starter NH_DK
  • Ngày gửi Ngày gửi
Liên hệ QC

NH_DK

Let's patience
Tham gia
29/7/10
Bài viết
865
Được thích
1,203
Nghề nghiệp
Kế toán
Em có ví dụ nhỏ, nhờ mọi người xem có thể cho hiện chữ trên thanh tiêu đề của Form không?
 

File đính kèm

Upvote 0
Bạn chuyển sang tab Theme, bấm mũi tên xổ xuống, chọn Windows XP xem thế nào
---------------------------

Tiếp tục test trên máy khác xem!

Vâng em vừa Test trên máy thứ 2 xài Win7, X2007, core i5, vẫn tình trạng trên, không tiêu đề ạ.
 
Upvote 0
Trên máy của em Win7, Excel 2007 :

16-09-2011 4-36-29 PM.jpg
 
Upvote 0
Mình thích nguyên tắc này. Nếu dungf nhiều phần mềm tiếng Việt, mà anh nào cũng chỉnh font hệ thống mới đọc được tiêu đề, mỗi anh mỗi loại font, khi thoát chương trình lại không chịu trả về như cũ, nếu đưa chương trình cho người khác dùng, đâu phải ai cũng biết chỉnh.Vậy thà chấp nhận tiêu đề không dấu còn hơn chỉnh font hệ thống (mất rin)...

Anh nói hoàn toàn không sai, từ trước đến nay tôi vẫn hoàn toàn nhất trí về tính tổng quát, nhưng hình như bài của Thầy NDU cũng chưa có tính tổng quát, vì lý do sau:

Mã:
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  WindowProc = CallWindowProc(ProcOld, hWnd, iMsg, wParam, lParam)
  [COLOR=#ff0000][B]SetUnicodeTitlebar Evaluate("frmCap")[/B][/COLOR]
End Function

Tôi nghĩ Cái Function này không phải là hàm vì nó không có tính tổng quát, nó chỉ thực hiện đúng 1 tiêu đề cho 1 Form mà thôi, nếu tôi có nhiều Form, vậy tôi phải làm nhiều hàm như vậy sao?

Ngược lại, với bài của tôi, cho dù phải chỉnh font hệ thống đối với WinXP, nhưng cũng là font Unicode, và xa hơn là Win7 trở về sau thì khỏi cần chỉnh gì cả, trong khi đó chỉ cần thay cái đuôi SetUnicodeCaption Me, Label1.Caption bằng cái gì đó có giá trị là text cũng được.

Tôi hoàn toàn thích thú với sự tổng quát, còn việc thảo luận là test lẫn nhau để đưa ra cái tối ưu nhất để chọn lựa cho riêng mình.
 
Upvote 0
Vài người test file trên Win7 đều không ra kết quả, trong khi code của tôi hoàn toàn chẳng liên quan gì đến HĐH, chỉ yêu cầu duy nhất: Máy có font Tahoma
Quả thật tôi cảm thấy không phục, sáng nay tôi nhờ thằng bạn mang cái laptop dùng Win7 của nó vào đây để Test... Ẹc... Ẹc... tất cả bình thường

Untitled.jpg
Chỉ khác 1 cái duy nhất so với khi test trên Windows XP là MÀU SẮC
 
Upvote 0
Vài người test file trên Win7 đều không ra kết quả, trong khi code của tôi hoàn toàn chẳng liên quan gì đến HĐH, chỉ yêu cầu duy nhất: Máy có font Tahoma
Quả thật tôi cảm thấy không phục, sáng nay tôi nhờ thằng bạn mang cái laptop dùng Win7 của nó vào đây để Test... Ẹc... Ẹc... tất cả bình thường

Chỉ khác 1 cái duy nhất so với khi test trên Windows XP là MÀU SẮC

Em test lại rồi. Kết luận : Nguyên nhân là do Themes của Win7

1. Basic anh High Constract Themes

18-09-2011 7-33-59 AM.jpg

2. Aero Themes

18-09-2011 7-35-15 AM.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Hiển thị tiếng Việt Unicode trên thanh tiêu đề UserForm chẳng dễ ăn đâu nha
Đầu tiên bạn đặt chuổi tiếng Việt Unicode vào trong 1 Define name rồi dùng code dưới đây
1> Trong module
PHP:
Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Declare Function SetBkMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Declare Function SetTextColor Lib "gdi32.dll" (ByVal hdc As Long, ByVal crColor As Long) As Long
Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long
Declare Function TextOut Lib "gdi32.dll" Alias "TextOutW" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpString As Any, ByVal nCount As Long) As Long
Declare Function CreateFontIndirect Lib "gdi32.dll" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
PHP:
Public hFont As Long, Old_hFont As Long, ProcOld As Long, hWnd As Long
Public Type LOGFONT
  lfHeight As Long: lfWidth As Long: lfEscapement As Long:  lfOrientation As Long: lfWeight As Long: lfItalic As Byte: lfUnderline As Byte
  lfStrikeOut As Byte: lfCharSet As Byte: lfOutPrecision As Byte: lfClipPrecision As Byte: lfQuality As Byte: lfPitchAndFamily As Byte: lfFaceName(32) As Byte
End Type
Public Type Unicode
  H As Byte
  L As Byte
End Type
PHP:
Private Sub SetUnicodeTitlebar(Text As String)
  Dim NC_hDC As Long, Result As Long, Lf As LOGFONT, NewCaption() As Unicode
  Dim FontFace As String, NewFontFace() As Byte, Seed As Integer
  NC_hDC = GetWindowDC(hWnd)
  Lf.lfWeight = 700
  FontFace = "Tahoma"
  NewFontFace = StrConv(FontFace, vbFromUnicode)
  For Seed = 1 To Len(FontFace)
    Lf.lfFaceName(Seed - 1) = NewFontFace(Seed - 1)
  Next Seed
  hFont = CreateFontIndirect(Lf)
  Old_hFont = SelectObject(NC_hDC, hFont)
  Result = SetTextColor(NC_hDC, &HFFFFFF):    Result = SetBkMode(NC_hDC, 1)
  NewCaption = UniStr2BytesArray(Text)
  Result = TextOut(NC_hDC, 24, 6, NewCaption(0), UBound(NewCaption))
  Result = SelectObject(NC_hDC, Old_hFont):  Result = DeleteObject(hFont):  Result = ReleaseDC(hWnd, NC_hDC)
End Sub
PHP:
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  WindowProc = CallWindowProc(ProcOld, hWnd, iMsg, wParam, lParam)
  SetUnicodeTitlebar Evaluate("frmCap")
End Function
PHP:
Function UniStr2BytesArray(SrcStr As String) As Unicode()
  Dim SrcStrLength As Long, Seed As Long, TmpUnicode() As Unicode
  SrcStrLength = LenB(SrcStr)
  ReDim TmpUnicode(SrcStrLength / 2)
  Do Until Seed >= SrcStrLength / 2
    TmpUnicode(Seed).H = CByte(AscB(MidB(SrcStr, Seed * 2 + 1, 1)))
    TmpUnicode(Seed).L = CByte(AscB(MidB(SrcStr, Seed * 2 + 2, 1)))
    Seed = Seed + 1
  Loop
  UniStr2BytesArray = TmpUnicode
End Function
2> Trong UserForm
PHP:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowText hWnd, ""
  ProcOld = SetWindowLong(hWnd, -4, AddressOf WindowProc)
End Sub
PHP:
Private Sub UserForm_Terminate()
  SetWindowLong hWnd, -4, ProcOld
End Sub
Kết quả được như vầy:

View attachment 70190

Sư phụ em làm theo cách của sư phụ thì OK rùi. Nhưng có một lỗi nhỏ xảy ra: Khi file này em làm xong vào đóng lại thì khi mở lại click chuột trực tiếp vào nó thì không mở. Và em phải mở chương trình Excel trước thì mở qua đây mới đuợc ah. Tại sao lại như vậy? Xin sư phụ chỉ giáo thêm cho em nhé!
Download
Tên: 010020
Mật khẩu: 010020
 
Upvote 0
Sư phụ em làm theo cách của sư phụ thì OK rùi. Nhưng có một lỗi nhỏ xảy ra: Khi file này em làm xong vào đóng lại thì khi mở lại click chuột trực tiếp vào nó thì không mở. Và em phải mở chương trình Excel trước thì mở qua đây mới đuợc ah. Tại sao lại như vậy? Xin sư phụ chỉ giáo thêm cho em nhé!
Download
Tên: 010020
Mật khẩu: 010020
Vì khi bạn thoát Form nhưng chưa tắt Excel, thế thôi (xem Task Manager sẽ thấy)
Nếu bạn thích ẩn ứng dụng khi load Form thì phải tính cho kỹ ---> Thoát form thì nên làm điều gì? Hoặc mở hiện lại ứng dụng, hoặc là thoát luôn ứng dụng... tất cả hãy tính toán cho kỹ rồi ghi code vào trong sự kiện UserForm_Terminate nhé
Nếu bạn chỉ thoát form mà không nói gì thì đồng nghĩa là ứng dụng vẫn còn đang bị "treo" (vì bị ẩn trước đó chứ chưa tắt hẳn)
 
Lần chỉnh sửa cuối:
Upvote 0
Vì khi bạn thoát Form nhưng chưa tắt Excel, thế thôi (xem Task Manager sẽ thấy)
Nếu bạn thích ẩn ứng dụng khi load Form thì phải tính cho kỹ ---> Thoát form thì nên làm điều gì? Hoặc mở hiện lại ứng dụng, hoặc là thoát luôn ứng dụng... tất cả hãy tính toán cho kỹ rồi ghi code vào trong sự kiện UserForm_Terminate nhé
Nếu bạn chỉ thoát form mà không nói gì thì đồng nghĩa là ứng dụng vẫn còn đang bị "treo" (vì bị ẩn trước đó chứ chưa tắt hẳn)

Cám ơn sư phụ nhiều! Nhưng em đã dùng:
PHP:
Application.Quit
rùi mà?
Quả thực em không hiểu lắm! Xin sư phụ chỉ giáo cho em học hỏi thêm ah!
 
Upvote 0
Thầy ơi, em muốn hỏi tại sao file của em khi thoát nó vẫn chưa thoát hết hẳn? Thầy xem mục #29 nhé!
#29:
Khi file này em làm xong vào đóng lại thì khi mở lại click chuột trực tiếp vào nó thì không mở.
#31:
Nhưng em đã dùng:
PHP:
Application.Quit
rùi mà?
Click trực tiếp vào file không mở được là vì khi đóng file làm sai quy trình. Để vào nhà phải mở cửa nhà, vào trong nhà rồi mới mở cửa phòng, đúng không? Còn khi trở ra phải làm ngược lại: đóng cửa phòng rồi mới đóng cửa nhà, đúng không?

Nghĩa là:
Khi mở ứng dụng:
- Mở Excel
- Dấu sheet để chỉ hiện form

Khi tắt ứng dụng:
- Không cho hiện sheet lên lại
- Tắt Excel
Có nghĩa là khi đi ra chỉ đóng cửa nhà mà không đóng cửa phòng. Lần sau vào sẽ thấy nó mở toang hoang sẵn.

Việc này tôi và các cao thủ khác đã nói rất nhiều:
1. Khi đã can thiệp vào mặc định thì khi thoát ra phải trả về như cũ. Dấu sheet thì phải cho hiện sheet ra lại. Chỉnh Window title của Excel bằng tên mình thì sau đó phải trả lại mặc định. Vào thì phải mở từ ngoài mở vào, ra thì phải đóng từ trong đóng ra. Mở bao nhiêu cái thì phải đóng lại bấy nhiêu.
2. Không bao giờ dùng Quit Application vì có chắc là không có file Excel nào đang mở? Quit là đóng lại hết của người ta sao? Chỉ nên dùng Workbook. Close.

Chính vì lẽ này mà không bao giờ tôi mở file của NHDK từ dạo đó đến giờ. Chưa nói đến file có pass.
 
Lần chỉnh sửa cuối:
Upvote 0
Click trực tiếp vào file không mở được là vì làm sai quy trình. Để vào nhà phải mở cửa cổng, vào trong cổng rồi mở mới cửa nhà, đúng không?

Nghĩa là:
Khi mở ứng dụng:
- Mở Excel
- Dấu sheet để chỉ hiện form

Khi tắt ứng dụng:
- Không cho hiện sheet lên lại
- Tắt Excel
Có nghĩa là khi đi ra chỉ đóng cửa cổng mà không đóng cửa nhà.

Việc này tôi và các cao thủ khác đã nói rất nhiều:
1. Khi đã can thiệp vào mặc định thì khi thoát ra phải trả về như cũ. Dấu sheet thì phải cho hiện sheet ra lại. Chỉnh Window title của Excel bằng tên mình thì sau đó phải trả lại mặc định.
2. Không bao giờ dùng Quit Application vì có chắc là không có file Excel nào đang mở? Quit là đóng lại hết của người ta sao? Chỉ nên dùng Workbook. Close.

Chính vì lẽ này mà không bao giờ tôi mở file của NHDK từ dạo đó đến giờ. Chưa nói đến file có pass.

Mục 2 mà Sư phụ nói em cũng có nghĩ giống như Sư phụ. Song, đôi khi em cũng dùng Quit và đôi khi em cũng dùng Close, nhưng nếu dùng Quit thì em phải xác định rõ là phải chắc chắn chỉ 1 mình file đó đang mở thì mới dùng Quit:

PHP:
  With Application
    If .Workbooks.Count > 1 Then
      .ThisWorkbook.Close False
    Else
      .DisplayAlerts = False
      .Quit
    End If
  End With

Khi tắt ứng dụng:
- Không cho hiện sheet lên lại
- Tắt Excel
Có nghĩa là khi đi ra chỉ đóng cửa cổng mà không đóng cửa nhà.

Với cái này, nếu giấu sheet thì đương nhiên khi Close nếu không Save thì cũng chẳng sao. Nhưng nếu giấu Application thì cho dù có Save hay không Save thì sau khi thoát, mở file excel khác nó vẫn hiển thị bình thường như chưa có vấn đề gì xảy ra.

(giấu chứ nhỉ)
 
Upvote 0
Với cái này, nếu giấu sheet thì đương nhiên khi Close nếu không Save thì cũng chẳng sao. Nhưng nếu giấu Application thì cho dù có Save hay không Save thì sau khi thoát, mở file excel khác nó vẫn hiển thị bình thường như chưa có vấn đề gì xảy ra.

(giấu chứ nhỉ)
Ừ thì giấu, không phải dấu.
Với lại ý tôi nói giấu sheet = không hiển thị sheet tức là giấu Application
Xem cái chữ đỏ.
Mở file excel khác, tức là nói đến căn nhà khác. Nhà đó khi đi ra đã đóng đúng quy trình rồi. Vậy khi đi vào bình thường không có vấn đề nhà cửa toang hoang.
Còn NHDK mở lại file cũ, mà cái nhà đó khi đi ra đã để ngỏ cửa.
 
Lần chỉnh sửa cuối:
Upvote 0
Ừ thì giấu, không phải dấu.
Với lại ý tôi nói giấu sheet = không hiển thị sheet tức là giấu Application
Xem cái chữ đỏ.
Mở file excel khác, tức là nói đến căn nhà khác. Nhà đó khi đi ra đã đóng đúng quy trình rồi. Vậy khi đi vào bình thường không có vấn đề nhà cửa toang hoang.
Còn NHDK mở lại file cũ, mà cái nhà đó khi đi ra đã để ngỏ cửa.
Tức là nói ngắn gọn thế này: Lúc trước đã làm gì thì khi "đi" hãy trả mọi thứ về như cũ, đừng có "phủi đít" như khi ngồi ghế đá công viên là được rồi
(Xin lỗi về cái ví von này...)
Với NH_DK: Bây giờ bạn đã thấy "tai nạn nghề nghiệp" khi dùng Application.Visible chưa? Không phải cứ thích là có thể xài tùy tiện đâu (cái này hình như sư phụ ptm0412 đã nhắc bạn nhiều lần rồi)
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy điểm thắc mắc

Em vẫn thấy chưa thông lắm, xin lấy ví dụ trong file đính kèm như sau :

Module1 :

PHP:
Public Sub ShowForm()
    Application.Visible = False ' Mở cửa phòng (sau khi đã mở cửa nhà)
    Application.DisplayAlerts = False ' Tắt chuông báo động
    UserForm1.Show
End Sub

UserForm1 (chứa CommandButton1)

PHP:
Private Sub CommandButton1_Click()
    Unload Me
    Application.Quit ' Đóng cửa nhà mà không khóa phòng + không bật lại chuông báo
End Sub

Click đôi trở lại File cũ thì vẫn chạy bình thường (không hề bị như trường hợp của bạn NH_DK), mặc dù đã đóng file không đúng quy trình như anh ptm0412 nói. Như vậy có phải là chỉ cần đóng cửa nhà thì cửa phòng cũng tự đóng theo và chuông báo động tự bật trở lại? Có vẻ như Application.Quit đã xoá hết mọi dấu vết. Xin mọi người giải đáp hộ mấy điểm này.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code "thoat" của NHDK thậm chí không có cả dòng lệnh UnLoad form Main. Mà cái form của NHDK khi load lên không đơn giản chút nào, nó liên quan đến đủ thứ khác, không như cái form bạn test thử đâu.
Nếu Unload form thì cái này sẽ chạy:
PHP:
Private Sub UserForm_Terminate()
  SetWindowLong hWnd, -4, ProcOld
End Sub
Câu lệnh đó trả cái gì đó về tình trạng ban đầu. Nhưng đã không trả. Do đó, Application không quit thực sự, và phải vào Task manager để tắt.

Nếu không tắt Application đó thì tình trạng để ngỏ cửa vẫn còn, và không thể mở lại bằng double click. Mở bằng cách open từ Excel, tức là đã mở từ Application thứ hai.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom