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

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

 Akzeptierte Antwort

Kazuya
Kazuya am 20 Jul. 2019

0 Stimmen

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

4 Kommentare

koji fukumoto
koji fukumoto am 22 Jul. 2019
ご回答ありがとうございます。
function putLog(hLog, putData)
% hLog:テキストボックスのハンドル
% putData:出力内容
str = {hLog.String , putData};
hLog.String = str;
というような関数でログ出力機能を実装しました。
関数が呼ばれるたびに、テキストボックスに行が追加されていくイメージです。
しかし、2回目の実行時はstrが {{2×1 cell}, putData} となる為、「hLog.String = str;」で
--------------------
クラス 'UIControl' のプロパティ 'String' の設定中にエラーが発生しました:
cell 配列には空でない文字ベクトル、string ベクトル、または数値のみを含めることができます。
--------------------
というエラーになります。
{{'One','Two'}, 'Three'}
{'One', 'Two', 'Three'}
にするには、どのように処理すればよいでしょうか?
尚、ログは数百行に亘る為、「ログ量が増えると処理速度が遅くなる」というような処理は避けたいのです。
よろしくお願い致します。
Kazuya
Kazuya am 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
koji fukumoto am 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
Kazuya am 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'}];
の意味で書きました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

koji fukumoto
koji fukumoto am 22 Jul. 2019

0 Stimmen

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

2 Kommentare

Kazuya
Kazuya am 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
koji fukumoto am 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行処理時は変数にデータを蓄積、全行処理後に蓄積データをエディットボックスに一括出力」
というやり方に変えようと思います。
色々とアドバイスありがとうございました。

Melden Sie sich an, um zu kommentieren.

Produkte

Version

R2018a

Community Treasure Hunt

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

Start Hunting!