4

GUI追加したい がありpopup menuます。表示されるpopup menuフィールドはファイルに保存されますtargets.txt

プログラムを開くときにpopup menu、上記のファイルの行を含める必要があります。 プログラムで動的に変更したいので、これを行っています。 popup menu ユーザーが別のフィールドに入力したディレクトリ パスが含まれるため、ディレクトリ パスをファイルに保存し、ユーザーがフォルダーに入るたび popup menu に、ファイルに従って を設定します。(私はそれを実行しましたが、正常に動作します)

の各コンポーネントの を呼び出したfunction myFunction_OpeningFcn(hObject, eventdata, handles, varargin)でしか呼び出されないため、プログラムの で初期化を行うことができませんでした。代わりに、私は次のようなことをしなければなりませんでした:"create function"GUI"opening function"

function databaseMenu_CreateFcn(hObject, eventdata, handles)
if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
handles.databaseMenuObject=hObject; % (1) see below
guidata(hObject, handles);

(1) : ポップアップ メニュー オブジェクトをハンドルに保存して、opening 関数で使用できるようにします。

そして、オープニング関数で私ができること:

fid_r = fopen('targets.txt', 'r');
C = textscan(fid_r, '%s');
set(handles.databaseMenuObject,'String', C{1});

したがって、誰かが"database"プログラムに新しいフォルダーを追加すると、popup menu 変更が行われます (ユーザーが選択したフォルダーをファイルに追加し、ファイルpopup menuからフィールドを取得するように設定します (上記の関数))。次のようになります。

ユーザーが 2 つのフォルダーに入った後のプログラム

コードのデザインが気に入らず、別の方法でそれを行う方法がわかりませんでした。プログラムの のに の"create function""popup menu"呼び出す方法はありますか? または、私の目標を達成するためのより良い方法はありますか? "opening function"

4

2 に答える 2

2

バックグラウンド

役立つかもしれないいくつかのこと:

  • GUI内で必要に応じて追加の機能を定義できます。定義されたコールバックに限定されません。
  • Figure要素にタグを付けると、コールバックから簡単に見つけることができます。
  • gcbf現在のコールバック図を返します。
  • union文字列のセル配列の和集合を返すことができます。

提案

これが私がそのような関数を書く方法です。これにより、すべてが1つの場所に配置され、GUI内のどこからでも関数を呼び出すことができ、キャッシュされたリストが自動的に更新され、重複するエントリが排除されます。

このコードは、初期化コードの最後と、フォルダーを追加するためのコールバックで呼び出します。タグは、右クリックしてGUIDE内のプロパティを設定することで設定できます。

updatePopupMenu()
  popupMenuHandle = findobj(gcbf,'Tag','myPopupMenuTag');
  popupMenuContents = get(popupMenuHandle,'String');

  % Initialization
  if isempty(popupMenuContests)
    fid_r = fopen('targets.txt', 'r');
    C = textscan(fid_r, '%s');
    popupMenuContents = C{1};
  end

  % Join
  otherFields = howeverYouGetFieldsFromOtherList();
  combinedContents = union(popupMenuContents, otherFields);

  % Save
  set(popupMenuHandle,'String', combinedContents);
  fid_w = fopen('targets.txt','w+');
  for i = 1:length(combinedContents)
    fprintf(fid_w,'%s\n',combinedContents{i}); 
  end
  fclose(fid_w);
end
于 2012-12-17T22:35:33.833 に答える
2

問題を理解しているかどうかはわかりませんが、これが役に立てば幸いです。

説明から判断すると、これは物事が起こるための論理的な順序のようです。

1: 初期化、ただすべてを初期化します。ドロップダウン メニューがあることは既にわかっていますが、内容はまだわかりません。したがって、デフォルトのオプションまたは空 (おそらく非表示) から始めてください。

2: 更新、ユーザーが新しい入力を保存するとすぐに、リストを更新します。

于 2012-12-14T10:37:00.513 に答える