2 điểm bởi GN⁺ 2024-11-15 | 1 bình luận | Chia sẻ qua WhatsApp
  • Avalonia Visual Basic 6 là một dự án mang tính thử nghiệm nhằm tái dựng IDE và ngôn ngữ Visual Basic 6 cổ điển bằng C# sử dụng Avalonia
  • Có thể mở phiên bản web trong trình duyệt, và phiên bản desktop cũng có thể được build dựa trên .NET 9.0
  • Các tính năng chính gồm trình thiết kế trực quan, lưu·mở dự án theo định dạng tương thích VB6, chạy dự án và hỗ trợ hạn chế cho ngôn ngữ VB6
  • Phiên bản trình duyệt yêu cầu .NET 9.0, còn bản build desktop có thể dùng cả .NET 8.0 nếu chỉnh sửa Directory.Build.props
  • Quyền đối với tên gọi, biểu tượng và đồ họa của Visual Basic thuộc về Microsoft Corporation, và dự án này không có mục đích thương mại

Tổng quan dự án

  • Avalonia Visual Basic 6 là dự án tái dựng IDE và ngôn ngữ Visual Basic 6 cổ điển bằng C# và Avalonia
  • Được giới thiệu là một fun, toy project không nhằm mục đích thương mại
  • Mọi quyền đối với tên gọi, biểu tượng và đồ họa Visual Basic đều thuộc về Microsoft Corporation
  • Có thể chạy phiên bản web trong trình duyệt

Tính năng được hỗ trợ

  • Cung cấp Visual Designer
  • Có thể lưu và tải dự án theo định dạng tương thích VB6
  • Cung cấp khả năng chạy dự án
  • Hỗ trợ ngôn ngữ VB6 ở mức hạn chế

Build phiên bản desktop

  • Thông thường cần .NET 9.0
  • Phiên bản desktop có thể dùng .NET 8.0 nếu chỉnh sửa Directory.Build.props
  • Phiên bản trình duyệt yêu cầu .NET 9.0
  • Lệnh build desktop như sau
dotnet build AvaloniaVisualBasic.Desktop/AvaloniaVisualBasic.Desktop.csproj

Lỗi Antlr4 và Java

  • Nếu xảy ra Antlr4 errors, có thể thư viện Antlr4BuildTasks đã không tự động tải Java về
  • Trong trường hợp này, cài đặt Java thủ công có thể giải quyết vấn đề

Triển khai desktop

  • Cần publish riêng dự án IDE và runtime
dotnet publish AvaloniaVisualBasic.Desktop -f net9.0 -o bin/
dotnet publish AvaloniaVisualBasic.Standalone -f net9.0 -o bin/standalone/
  • Sau khi triển khai, có thể chạy tệp sau
./bin/AvaloniaVisualBasic.Desktop

Các dự án và tài nguyên được sử dụng

1 bình luận

 
GN⁺ 2024-11-15
Ý kiến trên Hacker News
  • Chủ đề liên quan đăng 3 ngày trước: https://news.ycombinator.com/item?id=42105869 — 224 bình luận
  • Trời ơi, cái này thì nhất định phải bình luận. Hồi nhỏ, cách tôi học lập trình đúng y như vậy
    Tôi tìm thấy cuốn "Write Your Own Adventure Programs" (1983 - Usborne: https://colorcomputerarchive.com/repo/Documents/Books/Write%...) trên kệ sách ở trường tiểu học; mã viết bằng BASIC, còn nhà tôi lúc đó không có máy tính tử tế
    Vài năm sau, khi thấy Visual Basic, tôi nghĩ chắc nó sẽ tương tự, và ở một mức nào đó đúng là vậy. Ban đầu không có sách để học nên tôi bấm hết mọi menu và nút để xem chức năng, rồi dùng kết nối quay số tải đủ loại control form VB của bên thứ ba, thả chúng vào Form và xem chúng làm gì
    Cuối cùng, qua việc cứ sao chép-dán và chỉnh sửa, tôi làm được mấy công cụ hỗ trợ bài tập kiểu tính diện tích hình tròn, rồi cả các chương trình nghịch ngợm như hiện biểu tượng ở vùng thông báo cạnh đồng hồ hoặc ẩn cửa sổ để phát ra âm thanh khó chịu trong nền. Nhưng mỗi khi cố cài lên máy bạn bè thì thường thất bại vì các .dll cần thiết không nhét vừa một đĩa mềm
    Có những lúc bực bội, nhưng tôi cảm thấy mình rất may mắn khi học lập trình theo cách đó, nhờ cha mẹ cho tôi gần như tự do nghịch một thiết bị mà thời đó hẳn là rất đắt
    Ngay cả tutorial hồi đó cũng thú vị hơn. Kiểu như “tutorial Windows Registry của hypnoMan37!!! HEyyeyeyy Guuyzs :-)))) vào kênh IRC #blabla của tôi trên EFNet nhé! Trước tiên gọi RegistryCreateNewKey32(...) rồi…”; tất nhiên là cũng chẳng có CD MSDN
    Học kiểu code camp chắc hiệu quả hơn nhiều, nhưng so ra thì khô khan quá. Tôi nghĩ cái giá của việc khiến người mới chán đến chết có lẽ cũng khá lớn
    • Tôi cũng có trải nghiệm tương tự với VB6, nhưng điểm xuất phát thì ngược lại. Không phải sách BASIC mà là đang đọc sách VB.NET
      Lần đầu tôi tiếp xúc với Visual Basic là VBA trong MS Word; mở ra thì biết đó là chỗ viết code, nhưng hoàn toàn không biết phải nhập gì. Lúc đó tôi chưa biết một ngôn ngữ lập trình nào
      Sau này tôi tìm thấy một cuốn sách VB.NET ở hiệu sách, mừng quá nên lập tức làm theo trong VBA, nhưng code hoàn toàn không chạy, khiến tôi rất nản. Tôi tự nhủ thử thêm lần cuối, nếu không được thì bỏ cuộc, may là nó chạy
      Hóa ra VBA của MS Word trên máy tôi dựa trên VB 6, còn sách là sách VB.NET nên code hơi khác
      Sau đó tôi mua mọi cuốn sách liên quan đến VB 6 mà tôi thấy, rồi tình cờ tìm được bộ cài VB 6 IDE trong đống CD của họ hàng và cài lên. Đến giờ tôi vẫn nghĩ GUI builder của VB 6 là thứ tốt nhất tôi từng dùng
    • Đoạn tải mọi control form VB của bên thứ ba có thể tải được qua dial-up rồi thả vào Form thật sự gợi nhớ
      Thư viện địa phương của tôi cũng có cuốn "Visual Basic How-To: The Definitive Vb3 Problem Solver", và tôi gia hạn nhiều đến mức họ bảo tôi không thể mượn tiếp được nữa. Tôi vẫn nhớ mình đã tạo một giao diện hoạt động thật dựa trên giao diện “Peanut Computer” ở phần đầu Out of this World
    • Tôi cũng muốn con mình có trải nghiệm tương tự, nhưng thời nay không có BASIC thì nên làm thế nào, tôi không chắc. Tôi không mấy hứng thú với các công cụ chỉ cho tạo game platform bằng WYSIWYG
      Có ý tưởng nào hay không?
    • Điểm khởi đầu của tôi là cuốn "How to Create Adventure Games" (1986) của Christopher Lampton ở thư viện thành phố. Máy tính của bố tôi đã cài sẵn QBASIC nên tôi tự tay gõ code BASIC vào
    • Hồi nhỏ tôi cũng có trải nghiệm giống hệt. Tôi tìm thấy một cuốn sách GW-BASIC trên kệ sách của bố mẹ, rồi sau khi biết Windows có kèm QBASIC và phần lớn code ví dụ trong cuốn sách đó chạy được, tôi mê luôn
      Khi buồn chán, tôi thích đọc sách hướng dẫn MS-DOS 6 từ đầu đến cuối
      Vào thời internet chưa phổ biến, chất lượng tài liệu và code ví dụ thật ấn tượng
  • Một tầm nhìn thật sự truyền cảm hứng, nhưng dùng thử khoảng 2 phút thì thấy thiếu khá nhiều tính năng nhỏ. Ít nhất là với bản build web
    Dấu ampersand trong nhãn nút không tạo phím tắt. Ví dụ &Go không gạch chân chữ G
    Trong VB6 thật, nếu đặt control Label rồi gõ ngay thì nội dung sẽ thay đổi, nhưng ở đây phải focus vào ô nhập trước. Nhấp vào tiêu đề “Caption” cũng không được, phải nhấp vào trong cột nhập liệu
    Để tăng độ trung thực, khi chọn một control trong GUI designer, một hàng trong lưới Properties phải luôn được tô sáng. Với Label, tôi nhớ mặc định là Caption; còn control không có thuộc tính mặc định thì là Name
    Khi chuyển sang control khác, nếu có thuộc tính cùng tên với thuộc tính đang chọn, VB6 sẽ giữ nguyên lựa chọn đó. Nhờ vậy có thể nhanh chóng đổi liên tiếp thuộc tính Tag của nhiều control với số lần nhấp tối thiểu
    Rõ ràng các menu như debug, lưu, trợ giúp, add-in vẫn chưa được triển khai. Nếu nút Build có thể xuất ra một “file thực thi” chạy trong trình duyệt thì sẽ rất tuyệt
    Những nhận xét soi mói này xuất phát từ tình yêu thôi ;-)
    • Trong Avalonia, ký tự phím tắt vốn là dấu gạch dưới _, nhưng tôi vừa đẩy bản cập nhật để hỗ trợ cả & rồi :)
      Lưu thực ra có hoạt động. Nhưng chỉ trên desktop, và hơn nữa còn tương thích định dạng với VB6. Vì hỗ trợ tổng thể còn hạn chế nên độ tương thích cũng hạn chế, nhưng tôi dự định cải thiện thêm một chút
      Build cũng hoạt động, nhưng chỉ trên desktop ;)
    • Việc dấu ampersand trong nhãn nút tạo phím tắt không phải tính năng riêng của VB mà là tính năng của Windows common controls, nên có thể đã bị bỏ sót
    • Nếu cần nút Build tạo ra “file thực thi” chạy trong trình duyệt, bạn có thể xem Quartex Pascal của Jon Aasenden: https://quartexdeveloper.com/
  • Tôi vẫn không hiểu nổi vì sao từ những thứ như thế này mà chúng ta lại chuyển sang các GUI toolkit hiện đại

Nhìn cũng như cách hoạt động đều thật sự trực quan

  • Đã rời khỏi các widget quen thuộc theo sở thích và không quá nổi bật, chuyển sang những thiết kế được tạo kiểu tinh vi, có chiều sâu và thể hiện rõ thương hiệu
    Việc tập trung vào một thương hiệu hào nhoáng, khác lạ không chỉ thu hút người dùng mới mà còn khiến họ cảm thấy lạ lẫm và bức bối hơn khi chuyển sang nơi khác, từ đó giảm rời bỏ. Cách này kiếm tiền dễ hơn so với xu hướng trước đó vốn tập trung vào hiệu suất người dùng và khác biệt hóa tính năng
    Công nghệ cũng chạy theo trào lưu đó, tiêu ngân sách độ phức tạp vào tùy biến phong cách, hoạt ảnh, cải thiện kết xuất phông chữ, v.v.; còn những nỗ lực khuyến khích một ngôn ngữ thiết kế tiêu chuẩn để cả người tạo lẫn người dùng cùng làm quen thì bị từ bỏ

  • Tất cả các phiên bản Visual Studio về sau cũng có cùng builder này. Tôi dùng builder này hằng ngày khi làm các ứng dụng cá nhân nhỏ. Ngay cả trong Visual Studio 2022 mới ra hôm qua, nó gần như giống 100%
    Thật ra bây giờ còn tốt hơn. Vì việc căn chỉnh và thay đổi thuộc tính đã dễ hơn. Nhưng giao diện thì vẫn vậy, đúng nghĩa là không thay đổi suốt 25 năm
    Tôi vừa mở VS2022 và tạo ứng dụng này trong chưa đầy 60 giây: https://imgur.com/a/qHOCasJ

  • Có hai lý do khiến tôi bị VB thu hút. Một là có thể tự vẽ GUI; theo chuẩn thời đó, việc tạo ra phần mềm “trông giống phần mềm” với nỗ lực tối thiểu là một trải nghiệm rất tuyệt và đầy sức mạnh
    Lý do còn lại là để làm GUI thì thay vì dùng VB, bạn phải vật lộn với các thư viện lớp. Khi ấy OOP hoàn toàn khó hiểu với một lập trình viên sở thích như tôi, và ngay cả để tạo một ứng dụng “hello world” tối thiểu trên Windows hay Mac cũng cần hướng dẫn dài nhiều trang
    Trong vài thập kỷ sau đó, yêu cầu đối với GUI chất lượng cao tăng lên, đồng thời kỹ năng lập trình cần để tạo GUI nhỏ bằng code dường như cũng trở nên phổ biến hơn. Có thể là nhờ các ngôn ngữ dần dần làm việc này dễ hơn
    Giờ thì với mức GUI tôi cần, tôi chỉ viết bằng code; trong trường hợp của tôi, để Tkinter tự đặt theo bố cục mặc định vừa đủ lại khiến tôi hài lòng hơn. Các nạn nhân của tôi, à không, người dùng của tôi, cũng không đòi hỏi gì tốt hơn

  • Điều này khá giống cách Interface Builder của Xcode dùng trong các ứng dụng macOS và iOS
    Như những người khác đã nói, nó hoạt động tốt cho đến khi phải hỗ trợ kích thước màn hình, bố cục, hoạt ảnh, tương tác cảm ứng, v.v.

  • Sau khi đã làm cả ứng dụng native desktop lẫn ứng dụng dựa trên trình duyệt, tôi thấy rằng một khi vượt qua đường cong học tập, việc viết bố cục widget bằng văn bản dưới dạng code hoặc markup là hiệu quả
    Tôi biết Qt và wxWidgets cũng có tính năng bố cục tự động, nhưng vì làm trên C++ nên trải nghiệm có thể kém mượt mà hơn. Cho đến nay, trình thiết kế form của Visual Studio vẫn yêu cầu bố trí pixel thủ công, nên GUI càng phức tạp thì càng nhàm chán
    Cách kéo thả control dễ học nên tốt cho người mới, nhưng chỉ cần khoảng 12 control là thời gian dùng để kéo, căn và chỉnh kích thước thủ công đã bắt đầu thấy rõ. Với GUI dựa trên markup hoặc được tạo theo thủ tục, những phép tính bố cục này được làm thay cho bạn

  • Giao diện Windows giai đoạn 1995–2001 thật sự giống như đỉnh cao của Windows
    Rất sắc nét và gọn gàng. Visual C++ và Visual Basic thời đó không hoàn hảo, nhưng chúng giúp hoàn thành công việc
    XP đã ở ngay trước mắt, và tôi nghĩ sau đó là đi xuống

    • Không gì bằng một bản cài Windows 2000 sạch
    • Trên XP, Vista, 7 nếu dùng chế độ classic thì cũng có được cảm giác đó
  • Hơi lạc đề một chút, nhưng cái này được làm bằng Avalonia, thứ tôi mới nghe lần đầu. Có ai đã dùng chưa? Lời hứa tạo ra các ứng dụng đa nền tảng đẹp mắt từ một codebase .NET duy nhất nghe rất ấn tượng, nhưng tôi tò mò liệu thực tế có làm được đến mức đó không
    https://avaloniaui.net/

  • Thấy cái này thật sự vui
    Tôi là một trong những lập trình viên ban đầu làm phần “visual” của Visual Basic
    Khi đó nó có tên là Ruby, không liên quan gì đến ngôn ngữ lập trình Ruby. Nó dự định là một shell có thể tùy biến cho Windows 3.0. Ý tưởng là từng người dùng Windows có thể tạo môi trường desktop cá nhân của riêng mình bằng trình biên tập trực quan và các “gizmos”; sau này những gizmos đó được gọi bằng cái tên nhàm chán hơn nhiều là “controls”
    Có lẽ Microsoft đã khôn ngoan khi nhận ra thứ này phù hợp làm công cụ cho lập trình viên hơn là công cụ cho người dùng cuối, rồi kết hợp Ruby với Basic để tạo ra Visual Basic
    Nếu từng tạo control tùy chỉnh VBX, bạn có thể đổ lỗi cho tôi về API kinh khủng đó
    Và nếu tò mò cụm “fire an event” đến từ đâu, bạn có thể tìm câu trả lời trong bài viết của Retool về VB: https://retool.com/visual-basic
    Cảnh báo nội dung: có cách diễn đạt liên quan đến ma túy. Nói cách khác, “cứ hỏi tôi bất cứ điều gì”
    Tự quảng bá hơi trơ trẽn một chút: hiện tôi đang tìm việc. Ở IBM, nhóm của chúng tôi bị ảnh hưởng khá nặng trong đợt sa thải gần đây, và chúng tôi mất McDonald's, khách hàng chuyên trách duy nhất
    Tôi biết nhiều ngôn ngữ và framework, nhưng không biết tất cả. Có ai biết hết không?
    Tôi thích làm việc cùng khách hàng để hiểu nhu cầu của họ. Như mọi lập trình viên, tôi cũng thích code, nhưng code chỉ là phương tiện để làm khách hàng hài lòng
    Nếu quan tâm, có thể tìm tôi ở đây: http://linkedin.geary.com/, http://resume.geary.com/

    • Chính những bài như thế này khiến tôi quay lại trang này :-)
      Tôi là người đã viết bình luận dài đầy nhiệt huyết ở trên. Tôi muốn ngồi Zoom khoảng một giờ để nghe chuyện thời đó, và nếu đăng video đó lên đây thì mọi người chắc sẽ thích
      Tôi hoàn toàn không có kinh nghiệm phỏng vấn hay kênh truyền thông nào, nhưng sẽ cố hết sức để đặt các câu hỏi thú vị. Nếu quan tâm thì cứ gửi email cho tôi. Có thể tìm thấy trong hồ sơ của tôi
    • Cảm ơn vì đã giúp tôi bước vào công việc phát triển phần mềm chuyên nghiệp đầu tiên. Nó khiến việc tạo các tiện ích nhỏ để xử lý công việc trở nên thật sự dễ dàng
    • Thật ngạc nhiên khi bạn cũng tạo ra SQLWindows. Tôi rất nể phục
  • Có liên quan gì đến MS Dialog Editor không?

  • Nếu đào sâu vào mã, có thể thấy tác giả chỉ triển khai mức tối thiểu để tạo ra một bản demo ấn tượng
    Ví dụ, các hàm được hỗ trợ chỉ có hai hàm MsgBoxInputBox: https://github.com/BAndysc/AvaloniaVisualBasic6/blob/383a005...
    Dù vậy, nhìn vào lịch sử commit thì việc tạo ra một thứ phức tạp như thế này chỉ trong 4 ngày thật ấn tượng. Đây cũng là điểm khởi đầu tốt để phát triển thành một IDE hoàn chỉnh
    Đáng tiếc là thiếu các tính năng nâng cao như tô sáng cú pháp và tự động hoàn thành. Tôi chưa chạy thử, nhưng vì đang dùng macOS nên đoán là cũng sẽ không có debugger
    Nói chuyện tuổi thơ của tôi một chút, hành trình lập trình ban đầu bắt đầu với Turbo Pascal rồi sau đó chuyển sang Delphi 7. Delphi khá giống VB6, cho phép thiết kế app bằng cách kéo thả component lên form
    App đầu tiên tôi làm là một bản clone Notepad++, và mã vẫn còn, nhưng tệ đến mức mỗi lần nhìn lại đều thấy ngượng

    • Thực ra có tô sáng cú pháp. Nó được thêm sau khi ghi GIF và có thể thấy trong phiên bản web. Còn tự động hoàn thành thì, ừm, có thể để sau :)
      Hỗ trợ ngôn ngữ VB6 cũng còn hạn chế. Nó giống một món đồ chơi hoặc proof of concept hơn, nhưng phản ứng tích cực khiến tôi muốn triển khai thêm tính năng. Đặc biệt vì định dạng lưu tương thích với VB6. Có lẽ nó vẫn sẽ là đồ chơi, nhưng biết đâu có thể trở thành một món đồ chơi thực sự chạy được?
  • Có thể mở phiên bản web trong trình duyệt: https://bandysc.github.io/AvaloniaVisualBasic6/

    • Trên Firefox và Chrome thì rất nhanh, nhưng không hiểu vì sao trên Microsoft Edge(Chromium) lại chậm gần như bị treo
      Sửa: đã tìm ra nguyên nhân. Tùy chọn Enhance your security on the web của Edge làm chậm rất nhiều. Tắt tùy chọn này thì vấn đề hiệu năng được giải quyết
  • Tôi thật sự nhớ component frame trong các ứng dụng ngày nay. Có vẻ ai cũng nghĩ một tiêu đề đậm cộng với chút khoảng trắng ở cuối là đủ để nhóm các mục lại

    • HTML có fieldset với kiểu hiển thị như vậy. Nhưng quá nhiều CSS framework làm hỏng nó. Cá nhân tôi thật sự thích kiểu đó
      Muốn kiểm tra thì chỉ cần đặt nội dung sau vào một file HTML trống và xem nó được render thế nào: Frame1, HTML, CSS, JavaScript
    • Đúng vậy. GroupBox là một trang trí UI thiết yếu, nhưng vì các toolkit hiện nay không có nên tôi đang tự làm. Khi cả nhóm control liên quan đến một chức năng có thể bật/tắt, tôi còn đặt checkbox có nhãn nằm trên đường viền. Nó từng được dùng như chuẩn trong nhiều UI cũ và rất rõ ràng
      Liên quan đến chuyện này, một thứ quan trọng khác cũng đã biến mất là TabView đúng nghĩa. Tôi không biết ai là người đầu tiên khăng khăng gọi một hàng nút bình thường là TabView, nhưng có lẽ là Apple, và điều đó rất tệ. Bởi vì, cũng như khi thiếu GroupBox, nó không hiển thị ranh giới cho thấy các control bên dưới thuộc về view của tab được chọn. Tôi nghĩ chuyện này đáng lẽ phải hiển nhiên