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:
- Tổng quan về hàm Callback trong lập trình GUI Sau khi các bạn tạo cái giao diện đã xong thì đến phần lập trình rất quan trọng, chính là lập trình các hành vi của các điều khiển để đáp ứng lại các sự kiện như nhấn phím, kéo thanh trượt, khi chọn menu, … đó chính là các hàm Callback (giống như các [...]...
- Hiển thị Led 7 thanh trên GUI Matlab Chào các bạn. Mình cũng đang làm cái giao diện cho đồ án tốt nghiệp và có tìm kiếm source Matlab cho Led7 thanh và tìm được một project rất hay. Từ đó, có thể nhúng vào trong GUI của mình. Các bạn có thể xem Project đó tại đây. Demo cái hình trông cho [...]...
- Cách học Matlab hiệu quả Chào các bạn. Mình có ý định viết một vài Tutorial để học Matlab nhưng qua tìm hiểu và search thì có một số link rất là hay. Do đó, mình chỉ xin trình bày một số nguồn tham khảo dành cho các bạn mà mình thấy là hay. 1. Matlab Help Cái này thì [...]...
- Lập trình giao diện GUI trong Matlab (Phần 1) Mình viết bài này để tổng hợp lại các hướng dẫn về thiết kế giao diện GUI trong Matlab để các bạn dễ dàng thực hiện. Phần mềm: Matlab R2007a Bài đầu tiên mình sẽ giới thiệu các bạn giao diện GUI. 1. Mở phần mềm Matlab, gõ lệnh sau vào cửa sổ Command >> [...]...
- Trình quản lý tài liệu hiệu quả JabRef – Reference manager trong Ubuntu Chào các bạn. Được anh Hiệp giới thiệu về phần mềm quản lý tài liệu này khá hay nên mình giới thiệu cho các bạn. Trang chủ: http://jabref.sourceforge.net/index.php Mình mới dùng thì thấy thích thú là nó cho phép ta ghi đầy đủ chi tiết về các book, article, conference, … và có thể link [...]...
- Vẽ đồ thị trong Matlab Mình đang làm đồ án về đề tài giao tiếp máy tính và vđk qua công com, mình có 1 thắc mắc mong được các bạn chỉ giáo: khi dữ liệu được truyền vào máy tính thì có sự kiện BytesAvailable, mình viết hàm serial_Callback() để đọc dữ liệu này như sau: function serial_CallBack(obj,event) inval=fread(obj,1); [...]...



{ 16 comments… read them below or add one }
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
xin 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.
em đã đọ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
[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
em muon tao mot nut back .o phan thuoc tinh em chon control-callback:chuonhtrinhchinh
chu y:chuongtrinhchinh la chuong trinh em muon quay ve
nhung khi quay ve figure.chuongtrinhchinh tho van ton tai figure cua chuong trinh cu .anh co the giup em giai quyet bai toan nay khong
Chào em.
Cái đó không khó mấy đâu em. Điều em muốn có phải là muốn cho cái figure cũ tắt đi đúng không nào. Em có thể dùng lệnh:
Sau khi em gọi lệnh cho figure mới ra. Nhớ là lệnh gọi figure mới và delete nên cho vào trong hàm callback mặc định của nó thì hay hơn là config trong cửa sổ Property.
Cám ơn admin rất nhiều cề những bài viết này. Hi vọng anh tiếp tục viết những bài hướng dẫn cụ thể và trực quan như vầy nữa để mọi người có thể tham khảo và học tập.
Anh cho em hỏi dùng lệnh gọi một cái fig mới ra có fải là dùng lệnh call (fig.) ko anh? EM mới tìm hiểu về phần GUIDE này nên chưa rõ lắm mong anh chỉ giáo.
các bạn cho mình hỏi có cách nào để đánh chữ tiếng việt có dấu trong gui ko?
minh muon hoi la matlap co tuong thich voi cac phan mem khac khong???. vi du nhu phan mem tao web chang han. Vi minh dang duoc giao nhiem vu lap chuong trinh tinh toan cac may ki thuat sau do phai show no len sao cho gioing mot trang web. ma minh chi moi viet duoc chuong trinh tinh don thuan trong matlap. bac nao biet hay noi qua cho em voi????. Em cam ơn!!!!!!
Chào anh.
Em muốn xuất ra cùng một edit text nhiều dữ liệu thì làm thế nào hả anh?
Ví dụ như em muốn đưa ra dòng “đây là 1 đường tròn”, sau đó lại muốn đưa lên “bán kính là: r” trên cùng một edit text.
Em dùng hàm sprintf, gõ lệnh
help sprintf. Hàm này là hàm chuẩn ở trong C đó, cú pháp tương tự.Ví dụ: sprintf(buf,”Đây là đường tròn, bán kính: %d”,r);
Có thể ý của em là thêm dữ liệu vào string đó thì làm như sau:
str = 'Day la duong tron';str = [str,' ban kinh r']
Chúc em thành công.
Em dùng lệnh dạng như sau:
str = 'Day la 1 duong tron';str = [str,' ban kinh r']
Chúc em thành công.
chào anh.
Em có dòng lệnh sau làm trong guide.
set(handles.text10,’String’,'Day la 1 elip’);
Em muốn đưa vào cái text10 ấy thêm: “bán trục lớn là num2str(a) và bán trục nhỏ là: num2str(b)”.
thì làm thế nào hả anh.
Mà sao em làm xong một bài guide khi gửi cho bạn em, nó copy 2 file .m và .fig vào trong mục work của matlab. Xong gõ lệnh gọi hàm ấy ra mà nó lại không chạy trong khi máy em chạy ngon. Nó hiện lỗi như là mình bấm đúp chuột vào file .fig chứ không gọi từ matlab. Sửa như thế nào hả anh?
1. Em dùng lệnh format string là
sprintf, xem thêmhelp sprintf2. Em chạy lệnh
guidetrước, rồi browse đến file .fig đó.Chúc em thành công.
Anh Bắc cho em hỏi là làm thế nào để xuất kết quả ra file .txt.Ví dụ chương trình gui calculate bây giờ em xuất kết quả ra 1file .txt thì như thế nào anh.Mong anh chỉ em.Cám ơn anh!
Em sử dụng các function kiểu như fprintf là được.
Chào em.
Em load được cái ảnh gì hả em ??