テキストボックスに文字を追加する処理を見ていきたいと思います。
タイマーもちょうど役にたつので一緒に書いておこう!
前回に引き続き、今回はテキストボックスに、タイマーで1秒間隔に文字を表示していく実装です。
タイマーの利用方法の定型と、テキストボックスへの文字入力の基本的な部分をシンプルにメモしていきたいと思います。
https://panda-clip.com/plugin-simple-text-box/前回のテキストボックスの設置方法と合わせることで、上のようなシンプルに文字を表示するアプリができます。プログラムは、アプリ制作時にコピペして使ったりして頂ければありがたいです。
タイマーの実装
タイマーは、以下の3つの手順で実装ができます。
①タイマークラスの継承
②コールバック関数の定義
③タイマーのスタート
juce::Timerクラスを継承させることで利用できます。今回は、エディタクラスにタイマーを継承させて、エディタ側のスレッドで、1秒間隔に実行されるタイマー関数を実装します。
①は、次のぷエログラムの[1]にあたります。②のコールバック関数は、[2]のように定義します。
class MidiTest2AudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer//[1]継承
{
public:
//...略...
//[2]コールバック関数
void timerCallback() override
{
midiMessagesBox.moveCaretToEnd();
midiMessagesBox.insertTextAtCaret("Timer");
}
[2]のコールバック関数には、テキストボックスのキャレット(文字挿入位置)を最後に盛ってくるmoveCaretToEndを実行してから、文字列をキャレットに挿入するinsertTextAtCaret関数を利用して文字をテキストボックスに追加する処理を行います。
TextBoxクラスには、いろいろな関数(メソッド)が用意されていますが、基本的には、上記のように、表示する目的が多いと思いますので、シンプルな処理にとどめておきます。
③のタイマースタートの処理は、エディタのコンストラクタに記載します。startTimerHz関数は、ヘルツ単位で処理回数を指定できます。1Hzは一秒に1回の実行となります。
ちなみに、startTimer関数は引数にミリセカンドの単位を取るので、より直感的かもしれません。1秒何回の時は、Hzを使うとわかりやすいかなと思います。それぞれの用途に合わせて使い分けられるといいと思います。
MidiTest2AudioProcessorEditor::MidiTest2AudioProcessorEditor (MidiTest2AudioProcessor& p)
: AudioProcessorEditor (&p), audioProcessor (p)
{
//...略...
setSize (400, 300);
startTimerHz(1);//[3]タイマーのスタートです。
}
テキストボックスへのテキストの反映
コールバック関数内で、テキストを追加するだけでは物足りないので、クリアと、改行について少しだけプログラムを追加してみました。
clear()関数でテキストのクリアができます。3回テキストを表示したら、文字全体をクリアするような実装です。clear関数を任意のタイミングで入れることで、テキストボックスを見やすく制御することができます。
//適当に繰り返し回数をカウントする変数です。
int i = 0;
//コールバック関数を以下のように変更してみました。
void timerCallback() override
{
midiMessagesBox.moveCaretToEnd();
midiMessagesBox.insertTextAtCaret("Timer");
i++;
//3回に一回、テキストボックス内をクリアします。
if (i > 3) {
i = 0;
midiMessagesBox.clear();
}
}
また、テキストボックス内で改行したいときは、「\n」を入力します。普通にエスケープシーケンスが使えるので、汎用性があってよいです。
えすけーぷしーけんす
midiMessagesBox.insertTextAtCaret("Timer\n");
こんな感じで、テキストボックスには簡単に文字列を追加することができますので、アプリの状態確認などのメッセージ表示に最適です。