3

ユーザーの行動によって常に上書きされるデータを格納するマットファイルを作成しました。これは、関数「test()」で発生します。

n=1
while n < 5 
    myVal = double(Test704(1, 780, -1)) %Returns the user's behavior
    if myVal == 1
        n = n + 1 %"n" is the overwritten variable in the matfile
    end

    save('testSave1.mat') %The matfile
    m = matfile('testSave1.mat')
end

次に、これらのデータを「storageTest()」という別の関数 (2 つの別個の関数を持つことが不可欠です) で表示したいと考えています。より具体的に言うと、storageTest() は、私が uitable "t" を開発した GUI 関数です。そこで、まず関数「test()」を呼び出し、その出力値を「t」のデータとして与えます。「storageTest」の興味深い部分のコードは次のとおりです。

m = test()
    d = [m.n]
    t = uitable('Data',d, ...
        'ColumnWidth',{50}, ...
        'Position',[100 100 461 146]);
    t.Position(3) = t.Extent(3);
    t.Position(4) = t.Extent(4);

    drawnow

このコードは、「m = test()」の実行が終了したときにのみ実行され、「n」の最終値を確認できるタブが表示されます。ただし、テーブルを前に表示し、ユーザーの行動に応じて値が増加するのを確認したいと考えています。問題を解決するために Web で検索しましたが、答えが見つかりません。そのようなことは可能ですか?

4

2 に答える 2

2

exzaは、基本的に私のような同じ答えを書くのが少し速かったです。見た目が少し違うので載せておきます。

function storagetest()
    close all
    f = figure;
    data = [1];
    t = uitable(f,'Data',data,'ColumnWidth',{50});
    test()
end

function test()
    % handle uitable
    t = evalin('caller','t')

    n = 1;
    while n < 5
        newVal = input('Enter a number:');
        data = get(t,'Data');
        set(t,'Data', [data; newVal]);
        n = n + 1;
    end

end

input関数で真似した「ユーザーの行動」 。基本的な考え方は、 内からテーブルを更新することtest()です。evalinパラメータを に渡したくない場合は、 を使用できますがtest()、uitable のハンドルを直接渡す方が確かに優れたオプションです。

本格的な GUI プロジェクトに取り組んでいる場合は、この回答を読むことを強くお勧めします。

于 2015-08-21T17:11:47.653 に答える
2

私が質問を正しく解釈していると仮定すると、呼び出す前にテーブルを初期化しtest、ハンドルをテーブルに渡してループtestで更新する場合、これを達成するのはかなり簡単です。while

例えば:

function testGUI
% Initialize table
t = uitable('ColumnWidth',{50}, 'Position',[100 100 461 146]);
test(t)

function test(t)
n = 1;
while n < 5
    n = n + 1;
    t.Data = n;
    pause(0.25); % Since we're just incrementing a number, a slight so we can actually see the change
end

上記を実行すると、テーブル内のデータが期待どおりに繰り返されていることがわかります。

于 2015-08-21T17:08:36.453 に答える