MATLAB Answers

0

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

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

  0 Comments

Sign in to comment.

Products


Release

R2018a

2 Answers

Kazuya
Answer by Kazuya
on 20 Jul 2019
 Accepted Answer

セル配列で複数表示できます。例:
hLog.String = {'One','Two','Three'};
ので、セルを追加で結合するイメージで行けると考えましたが、いかがでしょう?

  4 Comments

Show 1 older comment
Kazuya
on 22 Jul 2019
function putLog(hLog, putData)
% hLog:テキストボックスのハンドル
% putData:出力内容
str = [hLog.String , {putData}];
hLog.String = str;
という風に putData を {} で囲み 1x1のセルとして、セル同士の結合とすればOKです。ただ、1つ目の文字列もセル配列でないとエラーが出ると思いますので、注意してください。例:
hLog.String = {};
hLog.String = [tt.String, {'one'}];
hLog.String = [tt.String, {'two'}];
実行速度についてですが、、最初から ログ数が分かっている場合にはできれば
hLog.String = cell(100,1);
などと最初からサイズを指定するのもよいですが、数百程度であればそこまで気にならないのではと想像しています。
koji fukumoto on 22 Jul 2019
返信ありがとうございます。
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
on 22 Jul 2019
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'}];
の意味で書きました。

Sign in to comment.


Answer by koji fukumoto on 22 Jul 2019

何度もご対応いただき、ありがとうございました。
縦方向に連結することで、思った通りの出力ができました。
ただ、
hLog.String = str;
の処理により、処理に遅延(※)が発生するのですが、高速化の手法として何かございますでしょうか?
ちなみにsetメソッドを使っても同じでした。
※上記1行が無い場合、1000行処理するのに約1秒、
 上記1行がある場合、1000行処理するのに約13秒(後半になるほど、遅くなっている感じ)。
 いずれも、予め「hLog.String = cell(1000,1);」をした状態で測定。

  2 Comments

Kazuya
on 22 Jul 2019
予め 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 on 22 Jul 2019
ログの番号を記憶し、順番に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行処理時は変数にデータを蓄積、全行処理後に蓄積データをエディットボックスに一括出力」
というやり方に変えようと思います。
色々とアドバイスありがとうございました。

Sign in to comment.