0

ここでMATLABの達人に質問があります。

これが私のコードです(ここでの問題に関連するコード行のみを示しています):

mainProcess(hObject, handles)

handles.Checkpoint2 =1;
guidata(hObject, handles);

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles.Checkpoint3 = 1; //EDIT: Checkpoint2 is also not visible at this line
guidata(hObject, handles);
handles.Checkpoint4 = 1;


function saveAndContinueButton_Callback(hObject, eventdata, handles)

(breakpoint here) --> faceDatabase(handles.currentImageIteration).lookingTowardsCamera=handles.lookingAtCamera;

したがって、上記のコードでは、コードのさまざまな部分でこれらの「チェックポイント」を作成し、[保存して続行]ボタンを個別にクリックするとどのチェックポイントが表示されるかを確認しています...チェックポイント1は、mainProcessというカスタム関数を呼び出す前に作成されます、Checkpoint2はmainProcessのコード内に作成され、Checkpoint3はmainProcessの実行が終了した後に作成され、コントロールはそれを呼び出した関数testGUI1_OpeningFcnに戻ります...そしてCheckpoint4はtestGUI1_OpeningFcn内に作成されますが、handles構造体はtestGUI1_OpeningFcnコードで更新されました。

だから私の質問はこれです、ボタンがクリックされ、その時点で何が表示されているかを見ると、チェックポイント1と3はボタンのコールバックコードに表示されますが、チェックポイント2と4は表示されません...チェックポイント4は表示されないことを理解していますtestGUI1_OpeningFcnのコードでhandles構造が更新された後に作成されたため、表示されます...しかし、mainProcessのコードの最後にある場合でも、Checkpoint2が表示されないのはなぜですか。

guidata(hObject, handles);

mainProcess関数がhObjectとハンドルの両方への参照を取得しているので、書き込みアクセス権が必要ですよね?

では、なぜCheckpoint2がボタンのコールバックコードに表示されないのですか..?

手がかりはありますか?

編集:コントロールが呼び出し元に返された直後に、mainProcessの呼び出し元の関数内でもCheckpoint2が表示されているかどうかを確認しようとしましたが、Checkpoint2は表示されていません(上記のコードのEDITを参照してください)。

4

2 に答える 2

3

そうです、あなたはあなたが持っているhandles変数を更新するためにguidataを呼び出す必要があります。ただし、guidataには引数が必要です。正しいコマンドは次のようになると思います。

handles = guidata(hObject);  

このリンクが役立つ場合があります。

http://www.mathworks.com/matlabcentral/answers/10197-guidata-doesn-t-work-the-way-i-expected-it-to

于 2012-01-30T23:53:31.180 に答える
0

mainProcess()を呼び出した直後に以下を追加する必要があると思います

handles = guidata();

一般に、「handles」構造体は値によってguidata()関数に渡されます。したがって、mainProcess()はハンドル構造を変更できません。既存の構造をハンドルにアタッチするだけです。さらに変更を加える前に、それを元に戻す必要があり(handles = guidata()を使用)、更新して、guidata(h、handles)で再度設定します。

これが十分に明確でない場合(または単に機能しない場合は教えてください:)

編集

次のようにコードを変更する必要があります。

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles = guidata();   // <--- new line

handles.Checkpoint3 = 1; //EDIT: now checkpoint2 will be visible here
guidata(hObject, handles);

handles.Checkpoint4 = 1;
guidata(hObject, handles); // Otherwise Checkpoint4 will not be bound to hObject
于 2011-04-29T06:31:46.537 に答える