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

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

Réponse acceptée

Kazuya
Kazuya le 20 Juil 2019
セル配列で複数表示できます。例:
hLog.String = {'One','Two','Three'};
ので、セルを追加で結合するイメージで行けると考えましたが、いかがでしょう?
  4 commentaires
koji fukumoto
koji fukumoto le 22 Juil 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 le 22 Juil 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'}];
の意味で書きました。

Connectez-vous pour commenter.

Plus de réponses (1)

koji fukumoto
koji fukumoto le 22 Juil 2019
何度もご対応いただき、ありがとうございました。
縦方向に連結することで、思った通りの出力ができました。
ただ、
hLog.String = str;
の処理により、処理に遅延(※)が発生するのですが、高速化の手法として何かございますでしょうか?
ちなみにsetメソッドを使っても同じでした。
※上記1行が無い場合、1000行処理するのに約1秒、
 上記1行がある場合、1000行処理するのに約13秒(後半になるほど、遅くなっている感じ)。
 いずれも、予め「hLog.String = cell(1000,1);」をした状態で測定。
  2 commentaires
Kazuya
Kazuya le 22 Juil 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 le 22 Juil 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行処理時は変数にデータを蓄積、全行処理後に蓄積データをエディットボックスに一括出力」
というやり方に変えようと思います。
色々とアドバイスありがとうございました。

Connectez-vous pour commenter.

Produits


Version

R2018a

Community Treasure Hunt

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

Start Hunting!