Đường dẫn khít Label không dùng API

Các thủ thuật liên quan đến việc xử lý ứng dụng, biểu mẫu và control
Đăng trả lời
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 531 times

Đường dẫn khít Label không dùng API

Gửi bài by truongphu »

Thủ thuật: Đường dẫn khít Label không dùng API
Tác giả: truongphu
Mô tả: Đường dẫn khít Label không dùng API. Nhờ Admin test thử, nếu tốt xin move vào bài cùng tên

Mã: Chọn tất cả

Dim str$, i& 'Code by Truong Phú   str = "C:\BinhPhuong\goldsoft\Download\web_wiz_forums_access2000_v7.01\forum\index.asp"         Do While Me.TextWidth(Label2.Caption) < Label2.Width - 60               Label2.Caption = Left$(str, i) & "..." & Right$(str, Len(str) - InStrRev(str, "\", , 1) + 1)               i = i + 1         Loop
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

truongphu xem lại nhé. Label để Autosize = True, F5 phát đơ luôn :D
I'm in the mood for love
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 531 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by truongphu »

Cảm ơn QuanGL đã Test
Tuy vòng lặp lớn nhưng máy chưa đơ, Label không thể hiện được caption mà thôi, vẫn tắt được Form đang chạy!
Sau đây là code v1.1 bản chính thức

Mã: Chọn tất cả

Private Sub Form_Load() 'thêm môt Label1Label1.AutoSize = FalseDim str$, i& 'Code by Truong Phú, QuanGL hiêu Ðính   str = "C:\BinhPhuong\goldsoft\Download\web_wiz_forums_access2000_v7.01\forum\index.asp"         Do While Me.TextWidth(Label1.Caption) < Label1.Width - 60               Label1.Caption = Left$(str, i) & "..." & Right$(str, Len(str) - InStrRev(str, "\", , 1) + 1)               i = i + 1         LoopEnd Sub
ghi chú: Hàm Function PathCompactPath có gọi hàm API khi khai Label1.AutoSize = True cũng mất tác dụng. Hiện đã chỉnh sửa rồi
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

Hôm trước tính chuyển Chủ đề này vào bên trong nhưng khi test thì phát sinh lỗi. Do hôm trước vội vàng quên nói luôn với bác là: khi chỉnh font chữ khác (lớn hơn) thì hiểu quả sẽ không còn. Bác xem lại nhé!
I'm in the mood for love
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 531 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by truongphu »

:P
Sửa lần cuối bởi 1 vào ngày truongphu với 0 lần sửa trong tổng số.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

Lỗi hay không lỗi là do người dùng đánh giá, tôi cũng không muốn nhiều lời làm gì. Có thể nói code trên đã hoạt động tốt. Nhưng hoạt động tốt với ai? Với truongphu, người viết ra code, thì có thể nói là không gặp trở ngại gì. Còn đối với những người mới bắt đầu học VB thì sao? Load code lên thấy màn hình Vb6 cứng đơ vì vòng lặp vô hạn? Họ sẽ giải quyết ra sao? Lên diễn đàn và hỏi? Mất thời gian của cả đôi bên. Mà truongphu đã thử với 1 Label có chiều rộng khá dài chưa? => Vòng lặp vô hạn, phải Ctrl + Break thì mới trở về IDE của VB6 được. Như đã được học và tự học ở một số ngôn ngữ lập trình khác thì vòng lặp vô hạn người ta gọi là gì? Code không sai nhưng khi chạy bạn phải kiểm tra nhiều trường hợp chứ? Test thì không thể nói là test chơi được, nếu là test chơi thì một quy trình sản xuất ra phần mềm người ta đã không chú trọng khâu testing rồi.
Vài dòng thế, truongphu xem lại, được chứ?
P.S: không phải vì chức danh điều hành của tôi mà truongphu mới edit source lại, mà với ai cũng thế, mọi người đều bình đẳng, tôn trọng nhau trên 4rum. Đúng thì nghe, không đúng thì bỏ ngoài tai, không ảnh hưởng gì tới nhau.
I'm in the mood for love
giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: Thứ 5 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Tiếp xúc:

Re: Đường dẫn khít Label không dùng API

Gửi bài by giongto35 »

em thấy 2 hàm đó cũng chẳng khác gì nhau , như bác truongphu đã phân tích . Vậy nếu cả 2 cái đều giống nhau như vậy thì hoặc move cả 2 bài ra hoặc move cả 2 bài zô . mà bài được move zô là bài sử dụng win32 (Chuẩn) thì sao bài bác truongphu ko được move .
Thật ra bắt bí tìm lỗi cũng ko nên , vì như bác truongphu đã nói : Test chơi thì được nhưng ý nghĩa thì thiếu LOGIC . <= cái này đúng .
Kính lão đắc thọ mà anh :D
________________________________________________________________________________________________
. . . . . . . . . . . . .. .
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

Khi dùng PathCompactPath thì label để kiểu nào chạy vẫn được (có thể hiển thị đúng/sai) nhưng không rơi vào tình trạng vòng lặp vô hạn như vậy. Tôi chỉ có ý nói bác truongphu chú thích thêm trong code/bài viết để người dùng khác tránh được tình trạng ấy thôi. Tôi cũng không dư thời gian đâu mà ngồi kiểm tra theo kiểu bắt bí từng chủ đề một. Nhiều khi ý tốt lại bị hiểu nhầm thế đấy.
Tập tin đính kèm
PathCompactPath
PathCompactPath
I'm in the mood for love
Hình đại diện của thành viên
NoBi
Quản trị
Quản trị
Bài viết: 972
Ngày tham gia: Thứ 3 18/03/2008 1:22 pm
Đến từ: Sài Gòn
Has thanked: 57 times
Been thanked: 67 times
Tiếp xúc:

Re: Đường dẫn khít Label không dùng API

Gửi bài by NoBi »

Việc QuanGL test thủ thuật này mà để Autosize = True là sai với ý nghĩa của thủ thuật này rồi. Thủ thuật này đòi hỏi label phải có kích thước cố định, chử mới có thể co dản nằm trong label được chứ :) .
Mình nghĩ bác truongphu nên vui vì ng ta có thích thú thì mới theo dõi và chạy thử code của mình và sẽ không có việc người này "kê" người nọ như vậy trong forum này (đây cũng là lý do để nó tồn tại tới ngày hôm nay). Tất cả coder như anh em chúng ta ai mà hổng muốn hoàn thiện code đến mức tối đa, do đó việc phát hiện ra 1 kỷ thuật hay thì mọi người cùng nhào vào góp ý để nó tốt nhất là đương nhiên.
Trở lại với thủ thuật này, theo mình thì cái hàm TextWidth kia là của Form, do đó nó phụ thuộc vào font chử, đơn vị tính của Form nữa.
:>
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 531 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by truongphu »

Cảm ơn NoBi đã giảng hòa
Đúng như NoBi nhận xét, có lệ thộc Form.font
Cầu toàn thì cố định luôn Form.font và label.font
:D :D
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

:D Theo như anh Nobi đã nói, em làm theo cách như sau (không phụ thuộc chủ yếu vào TextWidth, phụ thuộc vào chính thuộc tính Width của Label nên code dài quá :-S )

Mã: Chọn tất cả

Sub fit_label()Dim a&, b&, c&, f&, g&, str$, i&Me.Font = Label1.Fontstr = "C:\BinhPhuong\goldsoft\Download\web_wiz_forums_access2000_v7.01\forum\index.asp"f = Label1.WidthLabel1.Caption = strLabel1.AutoSize = Trueg = Label1.WidthLabel1.AutoSize = FalseLabel1.Width = fLabel1.Caption = ""c = TextWidth("W")If g < f Then    Label1.Caption = strElse    For i = 1 To Len(str)        Label1.AutoSize = True        a = Label1.Width        If a > f - c Then Label1.AutoSize = False: Label1.Width = f: Exit For        Label1.Caption = Left$(str, i) & "..." & Right$(str, Len(str) - InStrRev(str, "\", , 1) + 1)    Next iEnd IfEnd SubPrivate Sub Form_Load()Me.ScaleMode = 3End Sub Private Sub Form_Resize()Label1.Move 10, 0, ScaleWidth - 15fit_labelEnd Sub
Bác truongphu xem rồi chỉnh code ngắn gọn lại dùm mình luôn hen ;)
I'm in the mood for love
Hình đại diện của thành viên
NoBi
Quản trị
Quản trị
Bài viết: 972
Ngày tham gia: Thứ 3 18/03/2008 1:22 pm
Đến từ: Sài Gòn
Has thanked: 57 times
Been thanked: 67 times
Tiếp xúc:

Re: Đường dẫn khít Label không dùng API

Gửi bài by NoBi »

Còn đây là đoạn code của anh nè, dựa theo ý tưởng của bác truongphu :P :

Mã: Chọn tất cả

Private Sub Form_Load() 'thêm môt Label1    Dim str$, lastStr$, i& 'Code by Truong Phú, QuanGL hiêu Ðính     Label1.AutoSize = False    Me.FontName = Label1.FontName    Me.FontSize = Label1.FontSize    'Me.FontBold = Label1.FontBold    'Me.FontItalic = Label1.FontItalic     str = "C:\BinhPhuong\goldsoft\Download\web_wiz_forums_access2000_v7.01\forum\index.asp"    lastStr = "..." & Right$(str, Len(str) - InStrRev(str, "\", , 1) + 1)    Label1.Caption = lastStr     Do While Me.TextWidth(Label1.Caption) < Label1.Width - Me.TextWidth("A")          Label1.Caption = Left$(str, i) & lastStr          i = i + 1    LoopEnd Sub
:>
Hình đại diện của thành viên
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 times

Re: Đường dẫn khít Label không dùng API

Gửi bài by QuanGL »

Code của anh Nobi và em giống nhau phần Me.TextWidth("A") ( "W" ý tưởng đụng nhau :D).
Cách giải quyết của anh Nobi ngắn gọn và tốt nữa. Cám ơn bác truongphu đã đưa ra ý tưởng hay giúp mọi người có thể thông suốt được vấn đề :P
I'm in the mood for love
Đăng trả lời

Quay về