Bạn đang dùng VB.Net (1 người xem)

Bạn đã từng dùng VB.Net?


  • Total voters
    22

Người dùng đang xem chủ đề này

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,312
Được thích
15,879
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Mình cũng mới bắt đầu "vọc" VB.Net nên muốn "Tìm bạn đồng hành" nên xin mở chủ đề này. Nếu bạn nào đã, đang, sẽ dùng nó xin vui lòng điểm danh nhé.

Xin chân thành cảm ơn,
HLMT
 
Chưa dùng bao giờ, nhưng vừa rồi thấy file của HLMT đã mắt quá, sẽ nghiên cứu học hỏi về VB.Net!
 
VB.6 thì anh có thử qua lâu rồi, nhưng VB. NET thì chưa sử dụng bao giờ.
 
VB.6 thì anh có thử qua lâu rồi, nhưng VB. NET thì chưa sử dụng bao giờ.
vb6 và vbnet nói chung về code cơ bản giống nhau, chẳng qua vb net mới hơn thêm 1 ít mắn muối, 2 cái này điều có mục đích sử dụng là sử lý và hiển thị dữ liệu từ các nguồn data thông qua ado là chính
 
vb6 và vbnet nói chung về code cơ bản giống nhau, chẳng qua vb net mới hơn thêm 1 ít mắn muối, 2 cái này điều có mục đích sử dụng là sử lý và hiển thị dữ liệu từ các nguồn data thông qua ado là chính

Theo ý kiến của mình thì ngày xưa cũng chuyên dùng VB6.0, tuy nhiên để thật sự dùng thì bắt đầu từ bài #4. Theo nhận xét thì VB.Net có nhiều ưu điểm hơn mà VB6.0 không có được. Mà có được cũng "trầy da tróc bàn phím" Ví dụ để hiển thị tiếng Việt Unicode trong của sổ code, trên thanh tiêu đề, msgbox, imputbox... thì VB.Net hỗ trợ luôn, gõ trong code như thế nào hay viết trên form thế nào thì hiện kết quả thế ấy...
 
Lúc trước tôi là tín đồ của nhà VB nên cũng từng có để ý tớiVB.Net khi NetframeWork ra đời. Quả thật là khá tương đồng nên dễ chuyển qua nhấtlà các chương trình nho nhỏ. Tiếc là tôi không có điều kiện để sử dụng nó.

Tuy nhiên sau này tìm hiểu thì tôi thấy C# được đánh giá caohơn nhất là về tốc độ và sự phổ biến. Bạn có thể xem các so sánh về tốc độ thựcthi C# vs VB Net trên mạng. Về sự phổ biến, cú pháp C# hiện này còn được dùngcho nhiều script phát triển web điển hình là MVC.

Cũng như VB.NET, C# thật sự không khó. Tôi đã từng chuyển một project viết bằng VB.NET về C# trong khi hiểu biết và tài liệu về VB.NET lẫn C#chỉ gói gọn trong vài trang giấy diễn giải về từ các khóa chứ không có nổi 1 cuốn sách.

Ngoài môi trường Visual Studio của Microsoft, thì bạn có thểdùng Sharpdevelope dùng chung cho nhiều ngôn ngữ .NET. Dù ít phổ biến nhưng IDEnày cực nhẹ (chỉ vài chục mb cài đặt và khi load) và tương đầy đủ các tính năngcần thiết nhất trong khi VS rất nặng nhất là xài laptop. Bản Sharpdevelope 4.4.1 là bản ổn định nhất mà tôi hiện đangdùng.
 
Là chưowng trình gì mà nhìn đã mắt vậy bạn?
Tại thấy nội dung hay quá mà chưa kịp hỏi tên, khả năng là một chương trình sản xuất kinh doanh gì đó, đại loại là một cơ sở dữ liệu cỡ bự với các công cụ truy xuất, tính toán, phân tích, biểu đồ, gridline, giao diện, v.v... Nhìn mà sướng cả mắt!
 
Tại thấy nội dung hay quá mà chưa kịp hỏi tên, khả năng là một chương trình sản xuất kinh doanh gì đó, đại loại là một cơ sở dữ liệu cỡ bự với các công cụ truy xuất, tính toán, phân tích, biểu đồ, gridline, giao diện, v.v... Nhìn mà sướng cả mắt!

Nếu anh chịu nghiên cứu thì không phải mất thời gian đến tận 2 năm như em đâu. Hy vọng thời gian ngắn anh sẽ đạt được hơn những gì mà anh đang mong đợi.
 
Em cũng đang thử viết một chương trình nhỏ bằng VB.Net 2008 nhưng thấy có nhiều điểm khác VB, VBA quá.
Anh HLMT và các bạn cho dhn46 hỏi: trong VB.Net dhn46 dùng
Mã:
 FileOpen(1, MFDLink, OpenMode.Binary, OpenAccess.Read)

thì các khoảng trống trong chuỗi nhị phân biến mất tiêu, trong khi VB6 dùng

Mã:
Open MFDLink For Binary Access Read As #1
thì không bị
Dùng debug.Print hay dùng len để kiểm tra là thấy ngay sự khác biệt này.

Vậy tại sao lại như thế? Cách khắc phục VB.Net để cho ra kết quả như VB6?

dhn46 xin cảm ơn!
 
Lần chỉnh sửa cuối:
Em cũng đang thử viết một chương trình nhỏ bằng VB.Net 2008 nhưng thấy có nhiều điểm khác VB, VBA quá.
Anh HLMT và các bạn cho dhn46 hỏi: trong VB.Net dhn46 dùng
Mã:
 FileOpen(1, MFDLink, OpenMode.Binary, OpenAccess.Read)

thì các khoảng trống trong chuỗi nhị phân biến mất tiêu, trong khi VB6 dùng

Mã:
Open MFDLink For Binary Access Read As #1
thì không bị
Dùng debug.Print hay dùng len để kiểm tra là thấy ngay sự khác biệt này.

Vậy tại sao lại như thế? Cách khắc phục VB.Net để cho ra kết quả như VB6?

dhn46 xin cảm ơn!

Vậy mục đích cuối cùng của bạn là gì vậy?
 
Anh HLMT,

Em đang viết 1 chương trình để Edit File *.Mfd => Music Finder DataBase (dành cho đàn Yamaha), cái này nó dựa trên số byte của file *.Mfd để đọc ra các thông số.

Em đã sử dụng Excel, VB6 thì đều ra kết quả là có những khoảng trống trong file Binary, tương ứng với đọc file Text nhưng dùng VB.Net thì những khoảng trống đó không còn. Hiện em chưa biết cách xử lý, anh có thể tư vấn cho em trường hợp này?

Cảm ơn anh nhiều!
 
Anh HLMT,

........

Em đã sử dụng Excel, VB6 thì đều ra kết quả là có những khoảng trống trong file Binary, tương ứng với đọc file Text nhưng dùng VB.Net thì những khoảng trống đó không còn. Hiện em chưa biết cách xử lý, anh có thể tư vấn cho em trường hợp này?

Cảm ơn anh nhiều!

Anh HLMT và các bạn,

Không biết vấn đề dhn46 hỏi sẽ có hướng giải quyết như thể nào ạ? Mong phản hồi của mọi người

dhn46.
 
vb6 và vbnet nói chung về code cơ bản giống nhau, chẳng qua vb net mới hơn thêm 1 ít mắn muối, 2 cái này điều có mục đích sử dụng là sử lý và hiển thị dữ liệu từ các nguồn data thông qua ado là chính

VB6 chỉ là ngôn ngữ Hướng Đối Tượng bán phần. Trong khi VB.NET hướng đối tượng coi như toàn phần. cach sử dụng gần như khác biệt nhau. Nếu bạn không thấy khác biệt là do bạn không viết code hướng đối tuợng nhiều.

Nói VB.NET thêm mắm muối là hoàn toàn sai. Các lớp (class) cung cấp bởi .NET framework được Microsoft viết theo nguyên tắc hướng đối tượng có khả năng khai triển rộng, và rất hiệu quả (xem cuối bài, tôi trả lời cho dhn46). Điển hình là các loại căn bản như integer, float, string,... đều dựa trên lớp của chúng.

Trong .NET, đừng nói chuyện ADO. Các lớp (class) của .NET làm việc với Data hiệu quả hơn nhiều, điển hình là lớp thuộc nhóm System.IO. Nếu có thì giờ thì học LINQ sẽ thấy nó rất ngon lành. Lưu ý: tôi nói "có thì giờ", nếu không có thì giờ thì đừng học mất công, vì địa bàn dùng không rộng rãi; LINQ là công cụ của Microsoft, không phải tiêu chuẩn như SQL.

Lúc trước tôi là tín đồ của nhà VB nên cũng từng có để ý tớiVB.Net khi NetframeWork ra đời. Quả thật là khá tương đồng nên dễ chuyển qua nhấtlà các chương trình nho nhỏ. Tiếc là tôi không có điều kiện để sử dụng nó.

Tuy nhiên sau này tìm hiểu thì tôi thấy C# được đánh giá caohơn nhất là về tốc độ và sự phổ biến. Bạn có thể xem các so sánh về tốc độ thựcthi C# vs VB Net trên mạng. Về sự phổ biến, cú pháp C# hiện này còn được dùngcho nhiều script phát triển web điển hình là MVC.

Cũng như VB.NET, C# thật sự không khó. Tôi đã từng chuyển một project viết bằng VB.NET về C# trong khi hiểu biết và tài liệu về VB.NET lẫn C#chỉ gói gọn trong vài trang giấy diễn giải về từ các khóa chứ không có nổi 1 cuốn sách.

Ngoài môi trường Visual Studio của Microsoft, thì bạn có thểdùng Sharpdevelope dùng chung cho nhiều ngôn ngữ .NET. Dù ít phổ biến nhưng IDEnày cực nhẹ (chỉ vài chục mb cài đặt và khi load) và tương đầy đủ các tính năngcần thiết nhất trong khi VS rất nặng nhất là xài laptop. Bản Sharpdevelope 4.4.1 là bản ổn định nhất mà tôi hiện đangdùng.

Chuyển từ VB.NET sang C# thì không khó. Nhưng chuyển ngược lại (C# sang VB.NET) là chuyện khác.

Sẵn ở đây, tôi có thể cho lời khuêyn các bạn muốn học VB.NET:

Muốn vào .NET thì phải dùng .NET Framework. Đã vào nời này thì học luôn C# cho tiện, đừng vướng víu với VB chi nữa. Vì C# là ngôn ngữ dòng họ C cho nên hầu hết các nguyên tắc về cú pháp nó gần gũi với Java. Biết C#, bạn sẽ biết gần hết JavaScript (trừ lệnh function của JavaScript, lệnh này khó bỏ bố, tôi học mấy năm rồi chưa thông).
Trừ phi bạn đã khá giỏi về VB6 rồi thì chuyển sang VB.NET nhanh hơn.

Em cũng đang thử viết một chương trình nhỏ bằng VB.Net 2008 nhưng thấy có nhiều điểm khác VB, VBA quá.
Anh HLMT và các bạn cho dhn46 hỏi: trong VB.Net dhn46 dùng
Mã:
 FileOpen(1, MFDLink, OpenMode.Binary, OpenAccess.Read)

thì các khoảng trống trong chuỗi nhị phân biến mất tiêu, trong khi VB6 dùng

Mã:
Open MFDLink For Binary Access Read As #1
thì không bị
Dùng debug.Print hay dùng len để kiểm tra là thấy ngay sự khác biệt này.

Vậy tại sao lại như thế? Cách khắc phục VB.Net để cho ra kết quả như VB6?

dhn46 xin cảm ơn!

Anh HLMT và các bạn,

Không biết vấn đề dhn46 hỏi sẽ có hướng giải quyết như thể nào ạ? Mong phản hồi của mọi người

dhn46.

Tôi không có cấu trả lời trực tiếp cho bạn. Nhưng gián tiếp thì là:

FileOpen là hàm VB.NET đưa ra để "miễn cưỡng" hổ trợ lùi (backward compatible) với VB6.

Nguyên tắc hổ trợ lùi là bạn chỉ dùng khi nào bạn bê nguyên cái module cũ sang nơi mới, chỉnh sửa 1 chút. Nếu viết code mới thì đừng bao giờ, nhấn mạnh: đừng bao giờ, dùng các công cụ hở trợ lùi.

Trong .NET, dùng System.IO.File.Open với class BinaryReader/BinaryWriter hoặc ReadAllBytes (cũng có thể dùng FileStream,...).
 
Chuyển từ VB.NET sang C# thì không khó. Nhưng chuyển ngược lại (C# sang VB.NET) là chuyện khác.
Chuyển từ VB.NET sang C# thì không khó. Nhưng chuyển ngược lại (C# sang VB.NET)... thì vô cùng dễ. Tích hợp trong Sharpdevelop công cụ chuyển đổi qua lại giữa các ngôn ngữ C#, VB.NET và cả thêm Ruby, Python, Boo. Không quá 5s để bạn có thể chuyển đổi qua lại..
 
...
Trong .NET, đừng nói chuyện ADO. Các lớp (class) của .NET làm việc với Data hiệu quả hơn nhiều, điển hình là lớp thuộc nhóm System.IO. Nếu có thì giờ thì học LINQ sẽ thấy nó rất ngon lành. Lưu ý: tôi nói "có thì giờ", nếu không có thì giờ thì đừng học mất công, vì địa bàn dùng không rộng rãi; LINQ là công cụ của Microsoft, không phải tiêu chuẩn như SQL.
...

Cũng cần nói rõ thêm về điểm này: thực ra trong .NET thì công cụ kết nối là ADO.NET. Công cụ này có mô hình lớp bao quát (và trừu tuợng) hơn ADO nhiều.

Chuyển từ VB.NET sang C# thì không khó. Nhưng chuyển ngược lại (C# sang VB.NET)... thì vô cùng dễ. Tích hợp trong Sharpdevelop công cụ chuyển đổi qua lại giữa các ngôn ngữ C#, VB.NET và cả thêm Ruby, Python, Boo. Không quá 5s để bạn có thể chuyển đổi qua lại..

Chắc là vậy. Có lẽ tôi cổ hủ quá rồi.
Đối với tôi 5 s hay 5 hrs để chuyển đổi 1 project không quan trọng. Thậm chí 5 ngày cũng được; 1 project làm việc 6 tháng đổi ngôn ngữ tốn vài ngày chết gì ai?
Vấn đề là sau đó, đọc lại cái code chuyển đổi tôi có hiểu hay không. Tôi cần đại khái các điểm mốc (key areas) để đặt thunks mà unit test chúng, hoặc để nghiệm thu chúng. Không đặt được điểm nghiệm thu, đối với tôi là code bỏ đi.

Cách đây khoảng 2 năm, có người làm công việc chuyển đổi này. Lúc code đưa qua tôi nghiệm thu, tôi chịu thua.
 
Lần chỉnh sửa cuối:
Đối với tôi 5 s hay 5 hrs để chuyển đổi 1 project không quan trọng. Thậm chí 5 ngày cũng được; 1 project làm việc 6 tháng đổi ngôn ngữ tốn vài ngày chết gì ai?
Vấn đề là sau đó, đọc lại cái code chuyển đổi tôi có hiểu hay không. Tôi cần đại khái các điểm mốc (key areas) để đặt thunks mà unit test chúng, hoặc để nghiệm thu chúng. Không đặt được điểm nghiệm thu, đối với tôi là code bỏ đi.

Cách đây khoảng 2 năm, có người làm công việc chuyển đổi này. Lúc code đưa qua tôi nghiệm thu, tôi chịu thua.
Thấy những từ ngữ cao siêu key areas, thunks, unit test của anh là tôi biết anh có lối tư duy cao siêu rồi (Thật xấu hổ là tôi cũng chẳng hiểu nghĩa là gì **~**). Tôi thì làm việc theo kiểu "điếc không sợ súng". Chẳng cứ phải đúng ngôn ngữ nào mình biết, đến cả những ngôn ngữ chẳng biết, chẳng được học thì khi cần tôi cũng tham khảo. Tôi từng tham khảo Delphi để viết VB6, VB.Nét để viết C#... nếu không tìm được code minh họa bằng đúng ngôn ngữ mong muốn.

Một chương trình có thể viết bằng các ngôn ngữ lập trình khác nhau nhưng vẫn chung nguyên lý, giải thuật, cách dùng các API... Trong các tài liệu về thuật toán người ta cũng minh họa bằng những đoạn code mà xét về hình thức tôi chẳng biết phải Pascal, VB, Delphi, C#, Python... mà tôi xin tạm gọi là ngôn ngữ thuật giải, và ngôn ngữ này cũng chẳng có giáo trình nào đề cập nhưng tại sao người ta vẫn sử dụng để minh họa cho hàng triệu người học lập trình?

Hiểu hay không là do cái hứng thú + tư duy vận động của chúng ta (google, tự điển, giấy nháp...), chứ chẳng thể nào đòi hỏi nó phải diễn giải bằng đúng ngôn ngữ này hay ngôn ngữ nọ. Không hứng thú + tư duy vận động thì mọi đoạn code dù là VB hay C# cũng là vô nghĩa.
 
Lần chỉnh sửa cuối:
.............................
Tôi không có cấu trả lời trực tiếp cho bạn. Nhưng gián tiếp thì là:

FileOpen là hàm VB.NET đưa ra để "miễn cưỡng" hổ trợ lùi (backward compatible) với VB6.

Nguyên tắc hổ trợ lùi là bạn chỉ dùng khi nào bạn bê nguyên cái module cũ sang nơi mới, chỉnh sửa 1 chút. Nếu viết code mới thì đừng bao giờ, nhấn mạnh: đừng bao giờ, dùng các công cụ hở trợ lùi.

Trong .NET, dùng System.IO.File.Open với class BinaryReader/BinaryWriter hoặc ReadAllBytes (cũng có thể dùng FileStream,...).
Cảm ơn bác VetMini đã quan tâm câu hỏi của dhn46, sử dụng ReadAllBytes đã giải quyết được thắc mắc của dhn46, nhưng không hiểu sao khi dùng ChrW để dịch mã và nối chúng vào 1 str thì không thể Debug.print hay Msgbox toàn bộ chuỗi được, Str ghi ra file Txt hay trích xuất byte thì đúng là có kết quả mong muốn.

Xin cảm ơn bác!
 
Tôi không hiểu rõ vấn đề của bạn nên chỉ có thể trả lời đại khái.

vì vb.net là ngôn ngữ hoàn toàn hướng đối tượng cho nên luật ép kiểu của nó khó khăn hơn vba một chút. Bạn phải cẩn thận khi gộp dữ liệu.

con toán ghép chuỗi là con toán rất tốn tài nguyên. Trong dot net, nếu phải cộng chuỗi nhiều thì người ta dùng lớp stringbuilder.
 
Tôi không hiểu rõ vấn đề của bạn nên chỉ có thể trả lời đại khái.

vì vb.net là ngôn ngữ hoàn toàn hướng đối tượng cho nên luật ép kiểu của nó khó khăn hơn vba một chút. Bạn phải cẩn thận khi gộp dữ liệu.

con toán ghép chuỗi là con toán rất tốn tài nguyên. Trong dot net, nếu phải cộng chuỗi nhiều thì người ta dùng lớp stringbuilder.
dhn46 xin cảm ơn bác đã trả lời, Trong VB.Net dhn46 muốn đọc File *.Mfd (đính kèm) và sử dụng Code
Mã:
Public Class Form1


    Public MFDLink As String
    Public ArrMFD           'Mảng Binary file *.Mfd
    Const LTitle = 16       'Lenght of Title Mfd
    Const LInstrument = 18  'Lenght of Instrument Mfd
    Const LMusicName = 32   'Lenght of MusicName Mfd
    Const LGenre = 16       'Lenght of Genre Style
    Const LKeyWord = 32     'Lenght of Keyword Style


  
    Private Sub Cmd_Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_Open.Click


        Dim MPos As Long
        Dim Title As String         'Tiêu đề
        Dim Instrument As String     'Loại nhạc cụ
        Dim MusicName As String     'Tên bản nhạc
        Dim Genre As String         'Thể loại
        Dim KeyWord As String       'Từ khóa
        Dim i As Long


        With OpenFileDialog1
            .Multiselect = False
            .Title = "Select MFD file - DHN"
            .Filter = "Yamaha music finder database files (*.mfd)|*.mfd|All files (*.*)|*.*"
            .FilterIndex = 1
            .FileName = ""
            .RestoreDirectory = True
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                MFDLink = .FileName
            End If
        End With
        If Len(MFDLink) > 0 Then
            ArrMFD = System.IO.File.ReadAllBytes(MFDLink)
        End If


        '*Chú ý: Phần tử trong mảng luôn bắt đầu từ 0, MPos =0
        'Tiêu đề File
        For i = MPos To MPos + LTitle - 1
            Title = Title & ChrW(ArrMFD(i))
            MPos = LTitle
        Next


        'Loại nhạc cụ
[COLOR=#006400]        For i = MPos To MPos + LInstrument - 1[/COLOR]
[COLOR=#006400]            Instrument = String.Concat(Instrument, ChrW(ArrMFD(i)))[/COLOR]
[COLOR=#006400]        Next[/COLOR]


    End Sub

Như bác đã thấy trong khai báo, Title lấy 16 bytes đầu, còn Instrument thì lấy 18 Bytes tiếp theo. Khi Title là 1 chuỗi liên tục dùng toán tử nối chuổi trích ra từ Array ArrMFD thì được, nhưng trích Instrument thì chỉ được đến phần có dấu cách (PSR-S750) còn phần phía sau (V1.03) thì không có hiện trong chuỗi.

Bác và các anh chị có thể cho dhn46 sự chỉ dẫn được không ah? dhn46 muốn tự mình học hỏi qua những lời chỉ hướng của bác và các anh chị.

Xin cảm ơn mọi người
 

File đính kèm

Tôi sửa đoạn code của bạn thành
Mã:
         [COLOR=#0000ff]dim[/COLOR] ArrMFD() [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]Byte[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] MPos [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]Long[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] Title [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]String[/COLOR]         [COLOR=#008000]'Tiêu đề[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] Instrument [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]String[/COLOR]     [COLOR=#008000]'Loại nhạc cụ[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] MusicName [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]String[/COLOR]     [COLOR=#008000]'Tên bản nhạc[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] Genre [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]String[/COLOR]         [COLOR=#008000]'Thể loại[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] KeyWord [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]String[/COLOR]       [COLOR=#008000]'Từ khóa[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] i [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]Long[/COLOR]
        [COLOR=#0000ff]Dim[/COLOR] LTitle [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]Integer[/COLOR] = 16
        [COLOR=#0000ff]Dim[/COLOR] LInstrument [COLOR=#0000ff]As[/COLOR] [COLOR=#6f002f]Integer[/COLOR] = 14


[COLOR=#008000]'        With OpenFileDialog1[/COLOR]
[COLOR=#008000]'            .Multiselect = False[/COLOR]
[COLOR=#008000]'            .Title = "Select MFD file - DHN"[/COLOR]
[COLOR=#008000]'            .Filter = "Yamaha music finder database files (*.mfd)|*.mfd|All files (*.*)|*.*"[/COLOR]
[COLOR=#008000]'            .FilterIndex = 1[/COLOR]
[COLOR=#008000]'            .FileName = ""[/COLOR]
[COLOR=#008000]'            .RestoreDirectory = True[/COLOR]
[COLOR=#008000]'            If .ShowDialog = Windows.Forms.DialogResult.OK Then[/COLOR]
[COLOR=#008000]'                MFDLink = .FileName[/COLOR]
[COLOR=#008000]'            End If[/COLOR]
[COLOR=#008000]'        End With[/COLOR]
        [COLOR=#008000]'If Len(MFDLink) > 0 Then[/COLOR]
            ArrMFD = System.IO.File.ReadAllBytes("D:\MusicFinderPreset.mfd")
        [COLOR=#008000]'End If[/COLOR]


        [COLOR=#008000]'*Chú ý: Phần tử trong mảng luôn bắt đầu từ 0, MPos =0[/COLOR]
        [COLOR=#008000]'Tiêu đề File[/COLOR]
        [COLOR=#0000ff]For[/COLOR] i = MPos [COLOR=#0000ff]To[/COLOR] MPos + LTitle - 1
            Title = Title & ChrW(ArrMFD(i))
            MPos = LTitle
        [COLOR=#0000ff]Next[/COLOR]
        Debug.Print(Title)

        [COLOR=#008000]'Loại nhạc cụ[/COLOR]
        [COLOR=#0000ff]For[/COLOR] i = MPos [COLOR=#0000ff]To[/COLOR] MPos + LInstrument - 1
            Instrument &= [COLOR=#0000ff]IIf[/COLOR](ArrMFD(i)=0, " ", ChrW(ArrMFD(i)))
            Debug.Print ("[" & i & "]" & ArrMFD(i) & " - " & ChrW(ArrMFD(i)))
        [COLOR=#0000ff]Next[/COLOR]        
        Debug.Print (Instrument)

Sau một hồi ngấm nghía cuối cùng tôi cũng tìm ra nguyên nhân ở byte thứ 24 (giá trị là 0 chắc là tương đương với dấu kết thúc chuỗi). Thú thật đây là lần thứ 2 trong đời tôi đụng tới VB.Net nên viết lủng củng lắm.
 
Lần chỉnh sửa cuối:
Tôi sửa đoạn code của bạn thành
------------------
Sau một hồi ngấm nghía cuối cùng tôi cũng tìm ra nguyên nhân ở byte thứ 24 (giá trị là 0 chắc là tương đương với dấu kết thúc chuỗi). Thú thật đây là lần thứ 2 trong đời tôi đụng tới VB.Net nên viết lủng củng lắm.
Xin cảm ơn bạn đã trả lời câu hỏi của mình. Khi sửa
Mã:
[COLOR=#0000ff]dim[/COLOR][COLOR=#000000] ArrMFD() [/COLOR][COLOR=#0000ff]As[/COLOR][COLOR=#000000] [/COLOR][COLOR=#6f002f]Byte
[/COLOR]
Thì phát sinh lỗi, khi tôi bỏ As Byte đi thì code chạy tốt => Bạn có thể giải thích giùm tôi được không?

Bạn có thể giaỉ thích tại sao dùng Dim chứ không phải Const? Độ dài này là cố định vậy khi khai báo Dim sẽ hiệu quả hơn Const? ( LInstrument =18 chứ không phải 14 bạn ah, bởi quy định của File là 18 byte)

Tôi cũng đã dùng code bắt lỗi ArrMFD(i)=0 để giải quyết tạm thời, song thực sự thắc mắc tại sao chỉ là toán tử nối chuỗi đơn thuần mà VB.Net không thể nối được 1 chuỗi hoàn chỉnh, khi đưa chuỗi vào Array thì làm gì còn chuỗi để kết thúc? Tôi nghĩ đơn thuần chỉ là nối các phần tử trong mảng lần lượt lại.

Qua bài của bạn học thêm được 1 cấu trúc nữa rất hay String1 &= String2 =>String1String2

Cảm ơn bạn rất nhiều!
 
Xin cảm ơn bạn đã trả lời câu hỏi của mình. Khi sửa
Mã:
[COLOR=#0000ff]dim[/COLOR][COLOR=#000000] ArrMFD() [/COLOR][COLOR=#0000ff]As[/COLOR][COLOR=#6f002f]Byte
[/COLOR]
Thì phát sinh lỗi, khi tôi bỏ As Byte đi thì code chạy tốt => Bạn có thể giải thích giùm tôi được không?

Bạn có thể giaỉ thích tại sao dùng Dim chứ không phải Const? Độ dài này là cố định vậy khi khai báo Dim sẽ hiệu quả hơn Const?
Thành thực thì hôm wa là lần thứ 2 tôi đụng tới VB.Net cho nên tôi cũng không rành rẽ về cái vụ á byte này và cũng không biết bạn dùng const như thế nào... Nhưng theo kinh nghiệm của tôi thì nếu bạn cứ cất câu hỏi này trong đầu thì chắc chắn 1 ngày nào đó bạn sẽ tìm được câu trả lời vì cái này thuộc về vấn đề phổ thông.
Tôi cũng đã dùng code bắt lỗi ArrMFD(i)=0 để giải quyết tạm thời, song thực sự thắc mắc tại sao chỉ là toán tử nối chuỗi đơn thuần mà VB.Net không thể nối được 1 chuỗi hoàn chỉnh, khi đưa chuỗi vào Array thì làm gì còn chuỗi để kết thúc? Tôi nghĩ đơn thuần chỉ là nối các phần tử trong mảng lần lượt lại.
Bạn nhập nhằng giữa chuỗi và mảng. Trong C++, chuỗi là 1 mảng byte luôn có byte 0 báo hiệu kết thúc chuỗi còn mảng thì nó không cần dấu hiệu kết thúc và đây có thể là quy ước chung cho các ngôn ngữ khác.
Cấu trúc
Mã:
 String1 &= String2 =>String1String2
cũng là 1 lệnh ngẫu hứng mà tôi mới phát hiện hôm qua. Tôi biết VB.Net được phát triển thêm những lệnh vốn trước đây chỉ có ở những ngôn ngữ khác nên tôi cũng thử nghiệm toán tử (&=) tương ứng với toán tử (+=) rất quen thuộc trên C++ và may mắn là trúng. --=0 Trong lập trình nếu bạn cứ để tư duy được phóng khoáng thì bạn sẽ tự phát hiện ra được nhiều thứ.

Nếu bạn đang học dotNet căn bản thì có thể tham khảo http://www.dotnetperls.com/vb. Tuy có hình thức quê mùa nhưng tôi thấy đây là một trang rất hay về lập trình dotNet. Ngoài khái niệm, ví dụ minh họa khá ngắn gọn, dotnetperls.com còn cung cấp các ví dụ test hiệu năng so sánh giữa các phương án giải quyết khác nhau nhằm giúp người học chọn ra cách giải quyết tối ưu nhất.
 
Lần chỉnh sửa cuối:
Xin cảm ơn bạn rất nhiều.
Trong C++, chuỗi là 1 mảng byte luôn có byte 0 báo hiệu kết thúc chuỗi còn mảng thì nó không cần dấu hiệu kết thúc và đây có thể là quy ước chung cho các ngôn ngữ khác.
Đây là kiển thức hoàn toàn mới với tôi.

'------------------------
Rất xin lỗi bạn, tôi đã phát hiện ra sai sót khi khai bảo mảng.

Sai là khai báo mảng phải có (), tôi không dùng () nên lỗi.
'-------------------------

Chúc bạn sức khỏe thành công!
 
Lần chỉnh sửa cuối:
Xin cảm ơn bạn rất nhiều.

Trong C++, chuỗi là 1 mảng byte luôn có byte 0 báo hiệu kết thúc chuỗi còn mảng thì nó không cần dấu hiệu kết thúc và đây có thể là quy ước chung cho các ngôn ngữ khác.


Đây là kiển thức hoàn toàn mới với tôi.

'------------------------
Rất xin lỗi bạn, tôi đã phát hiện ra sai sót khi khai bảo mảng.

Sai là khai báo mảng phải có (), tôi không dùng () nên lỗi.
'-------------------------

Chúc bạn sức khỏe thành công!

Khi bạn làm việc với VB.net hay C#, đừng nghĩ tới C/C++.
Chính Microsoft có khuyến cáo rằng chớ nhìn vào cái ký tự C trong C# mà lầm. Theo cấu trúc thì C# gần với Java hơn là gần với C++. (xem chú thích 1 và 2)

Và đồng thời, vì Microsoft bắt buộc phải cái tiến VB.net để theo kịp C# cho nên kết quả là VB.net có rất nhiều lệnh, kiểu, và toán tử mà VB6 không có.

chú thich 1 (chuỗi): C/C++ là hai ngôn ngữ chuyên (tôi nhấn mạnh từ "chuyên") sử dụng con trỏ để tăng tốc. Nếu bạn không quen hoặc không muốn học con trỏ thì đừng bao giờ xía vào hai cái này.
Mọi ngôn ngữ đều định nghĩa mảng là một vùng dự liệu liên tiếp nhau. Tuy nhiên cách sử dụng vùng này, cũng như cách duyệt mảng tuỳ theo từng ngôn ngữ. Các ngôn ngữ dòng họ C định nghĩa hẳn hoi toán tử [] là toán tử duyệt mảng. Biểu thức a được định nghĩa là biểu thức trả về phần tử cách phần tử đầu tiên của mảng i vị trí; định nghĩa không hề nói nó đứng ở vị trí nào.
Riêng trong C/C++, người ta thường dùng chuỗi bằng cách chỉ định một vùng nhớ và đưa con trỏ vào đầu vùng nhớ. Vì vùng nhớ có độ dài cố định cho nên trong C có quy ước rằng ký tự có trị là 0 sẽ là ký tự kết thúc chuỗi. Lưu ý rằng quy ước này chỉ áp dụng cho các hàm (đặc biệt là hàm thư viện) làm việc với chuỗi. Ví dụ bạn có một chuỗi định là nằm trong vùng nhớ dài 100 bytes; nhưng chuỗi của bạn chỉ dùng đến 30 bytes; khi ấy bytes thứ 31 sẽ chứa trị 0. Tất cả các hàm trong C đọc mảng này sẽ dừng lại khi đọc tới byte 31 này. Nhưng không có nghĩ là byte 32 trở đi sẽ không có gì hết. Code của bạn có toàn quyền đọc cho tới byte thứ 100. Tức là lúc bạn viết code, phải tự biết mà dừng ở 30 khi thấy byte 31 là 0.
C++, vì là ngôn ngữ hướng đối tượng, cho nên trong thư viện của nó có đặt thêm một lớp string để làm việc hiệu quả hơn với chuỗi. Vì vậy, khi làm việc với C++, người ta phải phân biệt 2 loại string: C string và lớp string.

Trong C# và VB.net, string là một lớp phức tạp. Có những toán tử, hàm và thuộc tính riêng của nó. Vì vậy trị 0 không có nghĩa là cuối chuỗi.

chú thích 2 (một số cấu trúc): C/C++ vì phải làm việc trong điều kiện hiệu quả tối đa cho nên có những cấu trức phải được hiểu khác với những ngôn ngữ khác. Ví dụ Case trong C/C++ có tính chất "tuột", tức là nó sẽ đi xuyên từ case này sang case kia nếu bạn không "break" nó. Những ngôn ngữ khác không như vậy.
 
Lần chỉnh sửa cuối:
Xin cảm ơn những kiến thức mà các bác đã chia sẻ, quả thực đọc cái Chr(0) cho cái kết thúc chuỗi này dhn46 lại thấy hiểu hơn cấu trúc File Mfd mà dhn46 đang muốn tìm hiểu.

Hiện nay dhn46 đang mắc khó khăn trong việc ghi ký tự vào file text sử dụng VB.Net:

Khi khi ChrW(0) vào file text thì với Excel sẽ cho ra 1 ký tự trắng (không phải khoảng trắng) tương ứng với mã tự ChrW(0) nhưng VB.Net thì lại cho ra ký tự "00" (dhn46 sử dụng .Write(chrW(0))

Tương tự như vậy với mã tự 128 thì Excel ghi ra kết quả là " €" nhưng VB.Net cho ra kết quả "."

=> Vậy tại sao có sự khác biệt đó? Và cách khắc phục để VB.Net cho ra kết quả tương đồng Excel hay VB6 ghi ra *.Txt là như thế nào

dhn46 mong nhận được sự phản hồi của mọi người

Xin cảm ơn!
 
Các Bác có thể chỉ cho em làm một Form nhập liệu bằng VB.Net với?????
 
Kiểu dữ liệu, đặc biệt cách làm việc với kiểu dữ liệu string trong ngôn ngữ C là cần thiết để các bạn có thể ứng dụng các hàm Windows API trong các ngôn ngữ lập trình. Bạn có thể search hàm API GetComputerName + VBA, VB6 sẽ thấy.
 
Các thầy ơi, trong vb.net. EM có 1 csdl access em muốn gán csdl này thành 1 mảng 2 chiều thì làm ntn ạ? Các thầy bảo em với ạ. Em cảm ơn
 

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

Back
Top Bottom