4

Matlab で UItable を作成し、さまざまな値とオプションを入力しました。次のようになります。

ここに画像の説明を入力

対応するコードは次のとおりです。

selector_1 = { 'A'; 'B' ; 'C' };
selector_2 = { 'A.1'; 'A.2'; 'A.3'; ...
               'B.1'; 'B.2'; 'B.3'; ...
               'C.1'; 'C.2'; 'C.3' };

rows = 5;           

f = figure('name','Configuration of output','Position',[200 200 430 25+rows*20],'numbertitle','off','MenuBar','none');

dat =  {'select outputfile...', 'select identifier...', 'Specifier',  'Index'};
dat = repmat(dat,rows,1);
columnname =   {'Output file                   ',...
                'Identifier                    ',...
                'Specifier          ', 'Index'};
columnformat = { {selector_1{:}}, {selector_2{:}}, 'char', 'numeric' };
columneditable =  [true true true true]; 
t = uitable('Units','normalized','Position',...
            [0 0 1 1], 'Data', dat,... 
            'ColumnName', columnname,...
            'ColumnFormat', columnformat,...
            'ColumnEditable', columneditable,...
            'RowName',[]);
set(t, 'Data', dat,'celleditcallback','get(t,''Data'')');

コードを実行すると、Figure が開きます。したがって、基になるスクリプトは終了しました。テーブルを編集すると、uitable オブジェクトが変更され、終了後、次のようにして最終的な構成を取得できます。

finalconfig =  get(t,'Data');

ただし、スクリプトは既に終了しているため、この行を手動で入力する必要があります。この行をスクリプトの最後に置くと、エラーが発生します。

そこで、次のループを使用して、テーブルを閉じたことを検出し、最後の構成を保存することを考えました

while ~isempty(findobj('name','Configuration of output'))
    % some action
end
finalconfig =  get(t,'Data');

setそして、ループ、スクリプト全体、を含むコマンドだけ、その他のものをすべて入れようとしましたcelleditcallbackが、何も機能しませんでした。スクリプトがループ内でスタックするか、値を編集してもテーブルの表示が更新されません。drawnow私も色々なポジションで挑戦しました。この状況をどのように処理しますか?最終結果を自動的に保存するにはどうすればよいですか? 「保存」ボタンを実装できるとは思わないため、「ウィンドウを閉じる」ことが検出するのに最適なアクションであると思います。も使用してGUIを作成しようとしましたGUIDEが、完全に迷子になりました。なしで解決したいと考えています。


編集:「保存」ボタンを実装できるようになり、次のようにコールバックを試しました:

uimenu('Label','Save configuration','Callback',@saveConfig);
function saveConfig(~,~)
        output = get(t,'Data',);
        save([pwd 'output.mat'],'output');
end

CloseRequestFcnまた、Lucius Domitius Ahenobarbus の提案に従ってカスタムを実装しました。しかし、次のいずれかの問題があります。

1) すべてをスクリプトとして定義し、すべて正常に動作しますが、(実際には私のお気に入り)のような関数を定義するか@saveConfig@my_Closefcnワークスペース内の一意の関数ファイルとして定義する必要があり、正しいパラメータを渡すのに苦労していますdat実際には変更されますが、同じです。( mathworks サイトの例は機能しますが、追加のパラメーターは必要ありません。)

2)使用する場合

function configuration
% my script from above
end

私は実装@saveConfigまたは@my_Closefcn直接(ネスト)することができ、パラメーターの受け渡しはうまくいくと思います。しかし、テーブルの編集が機能しなくなり、次のエラーがスローされます。

handle.handle/get の使用中にエラーが発生しました

無効または削除されたオブジェクトです。

uitable CellEditCallback の評価中にエラーが発生しました

それを解決する方法は?ボタンを uitable に追加することさえできることがわかったので、本当に避けたいGUIDEです。上記の私のコードは実行可能ですので、説明するのが難しいので、実際の問題が何であるかを確認していただければ幸いです。

4

2 に答える 2

3

GUIDE を使用するかどうかに応じて:

CloseRequestFcn を使用します->

GUIDE を使用しない場合:

%write your own CloseRequestFcn and set the figure CloseRequest-Callback to it:
set(gcf,'CloseRequestFcn',@my_closefcn)
%use gcf or the handle of the figure directly

そして、図ハンドルの削除ステートメントを含む my_closefcn を定義します。そうしないと、図は閉じません:)

「CloseRequestFcn の再定義」の詳細については、ドキュメントを参照してください。

ガイド付き:

Figure を調べて CloseRequestFcn を編集できます。関数を自動的に作成する CloseRequestFcn というフィールドがあり、ハンドルの取得について気にする必要はありません。次のようになります。

function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: delete(hObject) closes the figure
delete(hObject);

Figure を削除する前に、(ハンドルがある場合) uitable のデータを取得できるはずです。次のように、データをベース ワークスペースに割り当てることをお勧めします。

assignin('base', 'finalTableData', get(myTableHandle,'Data'));

編集

十分に明確ではなかったので、次の例を参照してください。

(1 つのスクリプト内で使用)->

function test
h=figure;
x=1:10;
mytable=uitable(h,'Data',x);
set(h,'CloseRequestFcn',@myCloseFcn)
%give a unique Tag:
set(h,'Tag', 'myTag')
set(mytable,'Tag','myTableTag')
end

function myCloseFcn(~,~)
myfigure=findobj('Tag','myTag');
myData=get(findobj(myfigure,'Tag','myTableTag'),'Data')
assignin('base','myTestData',myData)
delete(myfigure)
end

実際、Figure のハンドルを見つける方法を知っていれば、Closereq-Callback のパラメーターを気にする必要はありません。Figure/uitable に、後で識別できる何かを与えるだけです。最初に思いついたので「タグ」を使用しましたが、他のパラメーターもあるでしょう。

于 2013-10-15T13:21:20.280 に答える