Chào các bạn.
Một vấn đề mà các bạn hay gặp phải khi thực hiện lập trình giao diện GUI là trao đổi dữ liệu giữa các hàm Callback hay của chính hàm Callback đó. Ví dụ: bạn làm sao biết hàm Callback này chạy được bao nhiêu lần ?? Nếu bạn muốn thực hiện một điều gì đó khi hàm này chạy đến lần thứ 2 thì làm sao ?? Nếu muốn lấy kết quả của một hàm Callback khác thì làm sao ??
Giải pháp tất nhiên là phải ghi vào một nơi mà có thể truy suất bất kì lúc nào trong các hàm Callback.
Ngày xưa, lúc mới lập trình GUI mình có nghĩ đến dùng cách ghi dữ liệu cùa biến nhớ, data vào một file .mat rồi dùng các lệnh load, save để đọc và ghi vào file này. Tuy nhiên, vấn đề vớ vẩn hay gặp là khi bạn ghi liên tục khối dữ liệu lớn thì file này sẽ bị hỏng và báo rằng không đọc, ghi được. Bó tay luôn, hic hic.
Đọc đến cấu trúc handles thấy quả thật đây là giải pháp Pro nhất rồi. Không còn gặp trục trặc khi trao đổi dữ liệu nữa. Chi tiết xin các bạn xem tham khảo [1] rất là đầy đủ.
handles là một cấu trúc mà các trường của nó chính là các handle của các điều khiển trong GUIDE. Chúng ta vẫn dùng cấu trúc này để thiết lập các thuộc tính của các điều khiển trong GUI.
Thêm các trường vào cấu trúc Handles
Cấu trúc handles chính là tham số của tất cả các hàm Callback. Để thêm một trường vào trong cấu trúc handles chúng ta làm theo 2 bước sau:
-
Gán một giá trị vào trường mới của handles. Ví dụ:
handles.number_errors = 0;
đã thêm trường number_errors vào cấu trúc handles và khởi tạo với giá trị 0. Chú ý: nên khởi tạo một trường mới của handles trong hàm OpenFcn của GUI để trường này luôn được tạo khi GUI chạy và khi đó tất cả các hàm Callback đều truy nhập được vào trường đã khởi tạo này.
-
Dùng lệnh sau đây để lưu dữ liệu:
guidata(hObject,handles)
trong đó hObject là handles của thành phần mà đang gọi hàm callback. hObject là tham số luôn luôn có ở các hàm Callback, được tự động tạo bởi GUIDE.
Cập nhật GUI Data trong M-file tạo bởi GUIDE
Khi đã tạo ra một trường mới trong handles thì bây giờ chúng ta truy nhập và cập nhật giá trị của nó như thế nào ??
Ở bên trên chúng ta đã tạo ra một trường với tên là number_errors. Bây giờ chúng ta sẽ gán một giá trị khác cho nó và lưu dữ liệu vào. Tất nhiên phải làm theo như sau:
-
Thay đổi giá trị của trường number_errors thành 10.
handles.number_errors = 10;
-
Lưu lại cấu trúc handles với lệnh sau:
guidata(hObject,handles)
trong đó hObject là biến của hàm Callback chính là handle của chính điều khiển gọi hàm Callback đó. Nếu bạn không ghi dữ liệu handles vào GUIDATA thì sẽ bị mất mà ngay. Nó sẽ vẫn lưu giá trị cũ thôi.
Lấy giá trị từ cấu trúc handles
Tất nhiên để lấy một giá trị từ một trường của handles, chúng ta làm như sau:
a = handles.number_errors;
Quá đơn giản phải không ke ke.
Xem thêm về GUIDATA tại tham khảo [2].
Các bạn có thể xem thêm về Application Data, tức là tạo một cấu trúc tương tự như handles. Cách này mở rộng hơn không nhất thiết phải cho các figure.
Tham khảo
[1] Mathwors Corp, Mechanisms for Managing Data
[2] Mathworks Corp, GUI Data
Các bài viết liên quan:
4 comments
Posted in Thông báo
Written on Fri, 30 May 2008 at 9:33 am
Tags: Callback, GUI, handles, Matlab
If you liked this post, then consider subscribing to our full RSS feed.


em load được cái ảnh rùi, nhưng sao nó hiện luôn cả path của cái ảnh lên luôn vậy anh
Reply to bqthanhChào em.
Em load được cái ảnh gì hả em ??
Reply to adminxin lỗi anh, em hỏi lộn bên topic này. Em muốn xóa nhưng không biết cách xóa.Nên đành để vậy.Anh thông cảm lần sau em sẽ cẩn thận hơn.
Reply to bqthanhem đã đọc phần hướng dẫn của matlab “image processing” nhưng em vẫn không hiểu anh cho em hỏi vấn đề này nha! em cảm ơn anh trước
Reply to phap[X,map]= imread(filename,fmt);
anh co the nói rõ cho em biết là X và map la dử liệu gì lệnh trên dùng cho việc đọc loại ảnh nào.
anh chỉ giúp em cách lấy giá trị của một màu trong một file ảnh được không? thank