Mô tả tài nguyên bằng chỉ thị #resource
Để bao gồm một tệp tài nguyên trong phiên bản chương trình đã biên dịch, hãy sử dụng chỉ thị #resource
trong mã nguồn. Chỉ thị này có các dạng khác nhau tùy thuộc vào loại tệp. Trong mọi trường hợp, chỉ thị chứa từ khóa #resource
theo sau bởi một chuỗi hằng.
#resource "path_file_name"
Lệnh #resource
chỉ thị cho trình biên dịch bao gồm (ở định dạng nhị phân ex5
) một tệp với tên được chỉ định và, tùy chọn, vị trí (tại thời điểm biên dịch) vào chương trình thực thi đang được tạo. Đường dẫn là tùy chọn: nếu chuỗi chỉ chứa tên tệp, nó sẽ được tìm kiếm trong thư mục bên cạnh mã nguồn được biên dịch. Nếu chuỗi có đường dẫn, các quy tắc được mô tả dưới đây sẽ áp dụng.
Trình biên dịch tìm kiếm tài nguyên tại đường dẫn được chỉ định theo thứ tự sau:
- Nếu đường dẫn bắt đầu bằng dấu gạch chéo ngược '\' (phải được nhân đôi, vì dấu gạch chéo đơn là ký tự điều khiển; đặc biệt, '\' được dùng cho xuống dòng '\r', '\n' và tab '\t'), thì tài nguyên được tìm kiếm bắt đầu từ thư mục MQL5 bên trong thư mục dữ liệu của terminal.
- Nếu không có dấu gạch chéo ngược, thì tài nguyên được tìm kiếm tương đối với vị trí của tệp nguồn mà tài nguyên này được đăng ký.
Lưu ý rằng trong các chuỗi hằng với đường dẫn tài nguyên, bạn phải sử dụng dấu gạch chéo ngược đôi làm dấu phân cách. Dấu gạch chéo đơn không được hỗ trợ ở đây, không giống như đường dẫn trong hệ thống tệp.
Ví dụ:
#resource "\\Images\\euro.bmp" // euro.bmp nằm trong /MQL5/Images/
#resource "picture.bmp" // picture.bmp nằm trong cùng thư mục,
// nơi tệp nguồn (mq5 hoặc mqh) nằm
#resource "Resource\\map.bmp" // map.bmp nằm trong thư mục con Resource của thư mục
// nơi tệp nguồn (mq5 hoặc mqh) nằm
2
3
4
5
Nếu tài nguyên được khai báo với đường dẫn tương đối trong tệp tiêu đề mqh, đường dẫn được xem xét tương đối với tệp mqh này chứ không phải tệp mq5 của chương trình đang được biên dịch.
Các chuỗi con "..\" và ":\" không được phép trong đường dẫn tài nguyên.
Sử dụng một vài chỉ thị, bạn có thể, ví dụ, đặt tất cả các hình ảnh và âm thanh cần thiết trực tiếp vào tệp ex5. Sau đó, để chạy chương trình như vậy trong một terminal khác, bạn không cần phải chuyển chúng riêng lẻ. Chúng ta sẽ xem xét các cách lập trình để truy cập tài nguyên từ MQL5 trong các phần tiếp theo.
Độ dài của chuỗi hằng "path_file_name" không được vượt quá 63 ký tự. Kích thước tệp tài nguyên không thể lớn hơn 128 Mb. Các tệp tài nguyên được nén tự động trước khi được bao gồm trong tệp thực thi.
Sau khi tài nguyên được khai báo bởi chỉ thị #resource
, nó có thể được sử dụng trong bất kỳ phần nào của chương trình. Tên của tài nguyên trở thành chuỗi hằng được chỉ định trong chỉ thị mà không có dấu gạch chéo ở đầu (nếu có), và một ký hiệu đặc biệt của tài nguyên (hai dấu hai chấm, ":😊 nên được thêm vào trước nội dung của chuỗi.
Dưới đây chúng ta trình bày các ví dụ về tài nguyên, với tên của chúng trong phần chú thích.
#resource "\\Images\\euro.bmp" // tên tài nguyên - ::Images\\euro.bmp
#resource "picture.bmp" // tên tài nguyên - ::picture.bmp
#resource "Resource\\map.bmp" // tên tài nguyên - ::Resource\\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // tên tài nguyên - ::Files\\Pictures\\good.bmp
#resource "\\Files\\demo.wav"; // tên tài nguyên - ::Files\\demo.wav"
#resource "\\Sounds\\thrill.wav"; // tên tài nguyên - ::Sounds\\thrill.wav"
2
3
4
5
6
Tiếp theo trong mã MQL, bạn có thể tham chiếu đến các tài nguyên này như sau (ở đây, chỉ các hàm ObjectSetString
và PlaySound
đã quen thuộc với chúng ta, nhưng còn có các tùy chọn khác như ResourceReadImage
, sẽ được mô tả trong các phần tiếp theo).
ObjectSetString(0, bitmap_name, OBJPROP_BMPFILE, 0, "::Images\\euro.bmp");
...
ObjectSetString(0, my_bitmap, OBJPROP_BMPFILE, 0, "::picture.bmp");
...
ObjectSetString(0, bitmap_label, OBJPROP_BMPFILE, 0, "::Resource\\map.bmp");
ObjectSetString(0, bitmap_label, OBJPROP_BMPFILE, 1, "::Files\\Pictures\\good.bmp");
...
PlaySound("::Files\\demo.wav");
...
PlaySound("::Sounds\\thrill.wav");
2
3
4
5
6
7
8
9
10
Cần lưu ý rằng khi đặt hình ảnh từ tài nguyên vào các đối tượng OBJ_BITMAP và OBJ_BITMAP_LABEL, giá trị của thuộc tính OBJPROP_BMPFILE không thể được thay đổi thủ công (trong hộp thoại thuộc tính của đối tượng).
Lưu ý rằng các tệp wav được đặt mặc định cho hàm PlaySound
tương đối với thư mục Sounds
(hoặc các thư mục con của nó) nằm trong thư mục dữ liệu của terminal. Đồng thời, các tài nguyên (bao gồm cả âm thanh), nếu được mô tả với dấu gạch chéo đầu trong đường dẫn, được tìm kiếm bên trong thư mục MQL5. Do đó, trong ví dụ trên, chuỗi "\Sounds\thrill.wav" đề cập đến tệp MQL5/Sounds/thrill.wav
chứ không phải Sounds/thrill.wav
tương đối với thư mục dữ liệu (thực tế có thư mục Sounds
với các âm thanh tiêu chuẩn của terminal).
Cú pháp đơn giản của chỉ thị #resource
được thảo luận ở trên chỉ cho phép mô tả các tài nguyên hình ảnh (định dạng BMP) và tài nguyên âm thanh (định dạng WAV). Việc cố gắng mô tả một tệp thuộc loại khác làm tài nguyên sẽ dẫn đến lỗi "unknown resource type".
Kết quả của việc xử lý chỉ thị #resource
, các tệp thực sự trở thành nhúng vào chương trình nhị phân thực thi và trở nên có thể truy cập bằng tên tài nguyên. Hơn nữa, bạn nên chú ý đến một đặc tính đặc biệt của các tài nguyên như vậy, đó là khả năng truy cập công khai từ các chương trình khác (thêm về điều này trong phần tiếp theo).
MQL5 cũng hỗ trợ một cách khác để nhúng tệp vào chương trình: dưới dạng biến tài nguyên. Phương pháp này sử dụng cú pháp mở rộng của chỉ thị #resource
và cho phép kết nối không chỉ các tệp BMP hoặc WAV mà còn các loại khác, ví dụ, văn bản hoặc mảng cấu trúc.
Chúng ta sẽ phân tích một ví dụ thực tế về việc kết nối tài nguyên trong vài phần tiếp theo.