テキストボックス(エ​ディットテキスト)に​文字列を追加する方法

15 ビュー (過去 30 日間)
koji fukumoto
koji fukumoto 2019 年 7 月 17 日
コメント済み: koji fukumoto 2019 年 7 月 22 日
GUIDE でテキストボックスを含む GUI を作成しています。
テキストボックスは、処理内容を1行ずつ出力するというものです(動作ログを出力する)。
テキストボックスに文字列を追加するには、どのようにすればよいのでしょうか?
※プロパティのMaxを2.0にして、複数行対応はできております。
テキストボックスのハンドルのStringに
"「元のString」と「追加したい文字列」を結合した文字列"
をセットする、という考えでいるのですが、
hLog.String = strcat(hLog.String, newline, putData);
だと、改行ができませんでした。

採用された回答

Kazuya
Kazuya 2019 年 7 月 20 日
セル配列で複数表示できます。例:
hLog.String = {'One','Two','Three'};
ので、セルを追加で結合するイメージで行けると考えましたが、いかがでしょう?
  4 件のコメント
koji fukumoto
koji fukumoto 2019 年 7 月 22 日
返信ありがとうございます。
str = [hLog.String , {putData}];
の部分のエラーが、やはり回避できません。
hLog.String が「2x1 cell」、{putData} が「1x1 cell」、となるので、
------
エラー: horzcat
連結する配列の次元が一致しません。
------
のエラーとなります。
> ただ、1つ目の文字列もセル配列でないとエラーが出ると思いますので、注意してください。
とのご指摘が、まさにこれだと思うのですが、例の
hLog.String = {};
hLog.String = [tt.String, {'one'}];
hLog.String = [tt.String, {'two'}];
にある、「tt.String」とは、何でしょうか?別のttという変数を用意する、という意味でしょうか?
テキストボックスに2行以上のデータがある場合のStringは「nx1 cell」となるので、
やはり、「nx1 cell」を「n個のcell配列」に変換する必要があるが、その方法は・・・?
という所で止まっている状態です。
よろしくお願い致します。
Kazuya
Kazuya 2019 年 7 月 22 日
function putLog(hLog, putData)
% hLog:テキストボックスのハンドル
% putData:出力内容
str = [hLog.String; {putData}];
hLog.String = str;
と , (コンマ)を ; (セミコロン)に変えて縦方向に連結するようにしてみて試していただけますか?
あとすいません、
hLog.String = {};
hLog.String = [tt.String, {'one'}];
hLog.String = [tt.String, {'two'}];
hLog.String = {};
hLog.String = [hLog.String, {'one'}];
hLog.String = [hLog.String, {'two'}];
の意味で書きました。

サインインしてコメントする。

その他の回答 (1 件)

koji fukumoto
koji fukumoto 2019 年 7 月 22 日
何度もご対応いただき、ありがとうございました。
縦方向に連結することで、思った通りの出力ができました。
ただ、
hLog.String = str;
の処理により、処理に遅延(※)が発生するのですが、高速化の手法として何かございますでしょうか?
ちなみにsetメソッドを使っても同じでした。
※上記1行が無い場合、1000行処理するのに約1秒、
 上記1行がある場合、1000行処理するのに約13秒(後半になるほど、遅くなっている感じ)。
 いずれも、予め「hLog.String = cell(1000,1);」をした状態で測定。
  2 件のコメント
Kazuya
Kazuya 2019 年 7 月 22 日
予め hLog.String = cell(1000,1) をしたとしても、その後 hLog.String = str と上書きしてしまうと、hLog.String = cell(1000,1) を実行する意味が無くなります。
hLog.String = cell(1000,1) とセル配列を確保するのであればログを追加する際には
hLog.String(1) = log1 % log1 はセル配列
hLog.String(2) = log2 % log2 はセル配列
hLog.String(3) = log3 % log3 はセル配列
.
.
と事前確保したセル内に順次収めていく必要があります。何番目のログかを認識する必要がある点は手間ですね。
koji fukumoto
koji fukumoto 2019 年 7 月 22 日
ログの番号を記憶し、順番にhLog.Stringに格納するようにしましたが、結果は変わらずでした。
エディットボックスの描画処理に時間が掛かっているのでしょうか?
だとしたら、ロジックで頑張っても実現は難しいのかな、と思ってきました。
完成イメージは、
function putLog(hLog, putData)
disp(['> SEND:', putData]);
とした場合の、コマンドウインドウのように、
------
> SEND:1
> SEND:2
> SEND:3
> SEND:4
> SEND:5
> SEND:6
・・・
------
と高速(1処理10ms想定)で出力されるというものでしたが、MATLABでは(私の理解度では)無理そうなので
「1行処理時は変数にデータを蓄積、全行処理後に蓄積データをエディットボックスに一括出力」
というやり方に変えようと思います。
色々とアドバイスありがとうございました。

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeHTTP インターフェイス についてさらに検索

製品


リリース

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!