Tài khoản E-mail miễn phí @ngohaibac.net

Các bạn hãy dành chút thời gian đọc kĩ hướng dẫn sử dụng trước khi dùng.

Cách trao đổi dữ liệu hiệu quả giữa các hàm Callback của GUI

By admin
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

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:

  1. 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.

  2. 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:

  1. Thay đổi giá trị của trường number_errors thành 10.

    handles.number_errors = 10;
  2. 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:

  1. bqthanh posted the following on 24 June, 2008 at 8:45 am.

    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 bqthanh
    1. admin posted the following on 24 June, 2008 at 10:41 am.

      Chào em.

      Em load được cái ảnh gì hả em ??

      Reply to admin
  2. bqthanh posted the following on 25 June, 2008 at 7:31 am.

    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.

    Reply to bqthanh
  3. phap posted the following on 9 July, 2008 at 1:33 am.

    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

    Reply to phap

Leave a reply

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?: