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

Liên hệ QC

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


  • Total voters
    22

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

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
 
Web KT

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

Back
Top Bottom