この記事は学習メモとして書いています。間違いや改善点があれば随時更新します。
1. はじめに
Power Apps のキャンバスアプリでモダンコントロールを使っていると、プロパティパネルに次のような通知が表示されることがあります。
⚠ このコントロールの新しいバージョンを使用できます。
詳細情報 [更新]
これは、2026年2月以降に提供が開始されたモダンコントロールの一括アップデートによるものです。対象となるコントロールは以下の9種類です。
- テキスト
- テキスト入力
- 数値入力
- 日付の選択
- コンボボックス
- タブ リスト
- ラジオ
- Link
- 情報ボタン
今回の更新には、プロパティ名の変更、列挙型パターンの導入、OnChange の動作変更、パフォーマンス改善など、多くの変更が含まれています。
「更新」ボタンを押す前に、変更内容を把握して、影響を受ける数式を事前に修正しておくことが重要です。
本記事では、9つの対象コントロールの中でも特に実務への影響が大きそうな テキスト入力(ModernTextInput) に焦点を当てて、更新内容を詳しく解説します。
2. テキスト入力コントロールの更新内容まとめ
2-1. プロパティ名の変更
他のモダンコントロールと共通して、以下のプロパティ名が変更されました。旧プロパティ名を使っている数式はすべて書き換えが必要です。
| 旧プロパティ名 | 新プロパティ名 |
|---|---|
FontColor |
Color |
FontSize |
Size |
FontItalic |
Italic |
FontStrikethrough |
Strikethrough |
FontUnderline |
Underline |
BorderRadius |
RadiusTopLeft / RadiusTopRight / RadiusBottomLeft / RadiusBottomRight
|
BorderRadius は4つの個別プロパティに分割されました。これにより、角ごとに異なる半径を設定できるようになっています。
2-2. 出力プロパティの変更(Value → Text)
テキスト入力コントロールの出力プロパティが Value から Text に変更されました。
// 旧バージョン
TextInput1.Value
// 新バージョン
TextInput1.Text
Self を使っている場合も同様です。
// 旧バージョン
Self.Value
// 新バージョン
Self.Text
なお、数値入力(NumberInput)の出力プロパティは引き続き Value のままなので混同に注意してください。
2-3. OnChange / TriggerOutput の動作変更
今回の更新で最も影響が大きい変更です。詳細は次章で解説しますが、ポイントだけまとめると以下のとおりです。
| 項目 | 旧バージョン | 新バージョン |
|---|---|---|
| OnChange の発火タイミング | キーストロークごと | フォーカスアウト時のみ |
| TriggerOutput のデフォルト | FocusOut |
Keypress |
| OnChange と TriggerOutput の関係 | 密結合 | 独立して動作 |
2-4. その他のバグ修正・改善
- DisplayMode.View の修正: View モードに設定すると本当に読み取り専用になった。以前はテキストが編集できてしまう不具合があった。
- Default プロパティの追加: コントロール読み込み時の初期値を設定できるようになった。
- null 処理の改善: 空白や null の値が null ではなく空文字列を返すようになり、数式エラーが回避される。
- 複数行オーバーフローの修正: 複数行テキストで Enter キーを押した際のオーバーフロー問題を解消。
- パスワードプレビュー: パスワードフィールドがプレビューモードでもマスク表示されるようになった。
- OnChange のタブ移動修正: 値を変更せずにタブ移動しただけでは OnChange が発火しなくなった。
3. OnChange と TriggerOutput の違いを理解する
今回の更新で最も重要なのが、OnChange と TriggerOutput の動作変更です。この2つは役割が異なるのですが、混同しやすいのでまず整理します。
3-1. TriggerOutput — 「いつ出力値を更新するか」
TriggerOutput は、Text 出力プロパティ(TextInput1.Text)がいつ最新の入力値に更新されるか を制御するプロパティです。
たとえば、ユーザーが「こんにちは」と入力しているとき、他の場所で TextInput1.Text を参照している数式がいつ反映されるかを決めるのがこの設定です。
| 設定値 | 動作 |
|---|---|
Keypress |
1文字入力するたびに即座に Text が更新される |
FocusOut |
フィールドを離れたときにまとめて更新される |
Delayed |
入力後、短い遅延を挟んで更新される |
新バージョンでは Keypress がデフォルトです。ただし、フォーム内に配置すると自動的に Delayed が適用されます。
3-2. OnChange — 「値が変わったときに何をするか」
OnChange は、値が確定的に変わったときに特定のアクション(数式)を実行する ためのイベントです。Set() で変数を更新する、Patch() でデータソースに書き込む、Notify() でメッセージを出すといった処理を書く場所です。
// OnChange の使用例
Set(gblLastInput, Self.Text);
Patch(DataSource, {ID: 1, Name: Self.Text})
3-3. 旧バージョンと新バージョンの動作を比較する
ユーザーが検索ボックスに「東京」と入力するシナリオで、動作の違いを見てみましょう。
旧バージョン(TriggerOutput = FocusOut / OnChange = キーストロークごとに発火):
| 操作 | TriggerOutput(Text の値) | OnChange |
|---|---|---|
| 「東」を入力 | まだ更新されない | 発火する |
| 「京」を入力 | まだ更新されない | 発火する |
| フィールドを離れる | 「東京」に更新される | ― |
旧バージョンでは、OnChange は発火しているのに Text の値はまだ更新されていないという ちぐはぐな状態 が起きていました。
新バージョン(TriggerOutput = Keypress / OnChange = フォーカスアウト時のみ):
| 操作 | TriggerOutput(Text の値) | OnChange |
|---|---|---|
| 「東」を入力 | 即座に「東」に更新 | 発火しない |
| 「京」を入力 | 即座に「東京」に更新 | 発火しない |
| フィールドを離れる | ― | 発火する |
新バージョンでは、リアルタイムの値反映は TriggerOutput が担い、確定時のアクション実行は OnChange が担う という形で、役割が明確に分離されています。
3-4. この変更がもたらす影響
旧バージョンで OnChange にリアルタイム系の処理(表示切り替え、フィルタリングなど)を書いていた場合、新バージョンではフォーカスアウトするまで処理が実行されなくなります。
逆に、OnChange に Patch() などのデータ保存処理を書いていた場合は、キーストロークごとに無駄に実行されなくなるため、パフォーマンスが向上します。
4. 実践編 — 数式の書き換え例
旧バージョンから新バージョンへの移行で、どのように数式を書き換えればよいかを具体例で見ていきます。
例1: ギャラリーの表示/非表示を入力値で切り替える
入力値が2文字以上になったらギャラリーを表示する、というケースです。
旧バージョンの実装:
テキスト入力の OnChange で変数を設定し、ギャラリーの Visible でその変数を参照していました。
// テキスト入力の OnChange
Set(gblGalleryVisibleFlag, If(Len(Self.Value) > 1, true, false))
// ギャラリーの Visible
gblGalleryVisibleFlag
旧バージョンでは OnChange がキーストロークごとに発火するため、入力値が2文字以上になった瞬間にギャラリーが表示されました。
新バージョンでの問題:
OnChange がフォーカスアウト時にしか発火しなくなるため、入力中にギャラリーが表示されません。ユーザーはいったん入力を終えてフィールドの外をクリック/タップしないと、ギャラリーが表示されないことになります。
新バージョンでの書き換え:
OnChange と変数を使わず、ギャラリーの Visible プロパティで Text 出力を直接参照します。
// テキスト入力の OnChange
(空にする、または削除)
// ギャラリーの Visible
Len(TextInput1.Text) > 1
TriggerOutput のデフォルトが Keypress なので、TextInput1.Text はキー入力のたびに更新されます。それを Visible から直接参照することで、OnChange を経由しなくてもリアルタイムに評価されます。
例2: リアルタイム検索フィルタリング
テキスト入力の値でギャラリーの Items をリアルタイムにフィルタリングするケースです。
旧バージョンの実装:
// テキスト入力の OnChange
Set(gblSearchKeyword, Self.Value)
// ギャラリーの Items
Filter(Products, gblSearchKeyword in Name)
新バージョンでの書き換え:
// テキスト入力の OnChange
(空にする、または削除)
// ギャラリーの Items
Filter(Products, TextInput1.Text in Name)
考え方は例1と同じです。変数を介さず、TextInput1.Text を直接参照することで、キー入力のたびにフィルタが更新されます。
例3: データ保存処理(書き換え不要なパターン)
入力確定後にデータソースへ保存するケースです。
旧バージョンの実装:
// テキスト入力の OnChange
Patch(Customers, LookUp(Customers, ID = 1), {Name: Self.Value})
旧バージョンではキーストロークごとに Patch() が実行されてしまい、パフォーマンス上の問題がありました。
新バージョンでの書き換え:
// テキスト入力の OnChange
Patch(Customers, LookUp(Customers, ID = 1), {Name: Self.Text})
OnChange がフォーカスアウト時のみ発火するようになったため、Patch() は入力確定後に1回だけ実行されます。Self.Value → Self.Text の変更だけで、ロジックの書き換えは不要です。このパターンは新バージョンの動作がむしろ好都合です。
書き換えパターンの判断基準
| やりたいこと | 旧バージョン | 新バージョン |
|---|---|---|
| リアルタイムの表示切り替え・フィルタリング | OnChange + 変数 | Text 出力プロパティの直接参照 |
| 入力確定後のデータ保存・通知 | OnChange(毎回発火してしまう) | OnChange(フォーカスアウト時だけ発火) |
| 入力確定後の変数更新 | OnChange | OnChange(Self.Value → Self.Text に変更) |
判断のポイントは、「リアルタイム性が必要かどうか」 です。リアルタイムなら直接参照、確定後でよいなら OnChange という使い分けになります。
5. 更新手順と注意点
5-1. 更新前のチェックポイント
更新ボタンを押す前に、以下を確認しましょう。
- テキスト入力コントロールの OnChange に数式が設定されているか確認する
- 設定されている場合、リアルタイム系の処理(表示切り替え、フィルタリングなど)が含まれていないか確認する
- 旧プロパティ名(
FontColor,FontSizeなど)を使っている数式がないか確認する -
Self.ValueやTextInput名.Valueを使っている箇所を洗い出す -
FontWeight.Mediumを使っている場合はFontWeight.NormalまたはFontWeight.Semiboldに変更する
5-2. 更新の実施
- プロパティパネルに表示された 「詳細情報」 リンクから更新ガイドを確認する
- 前述のチェックポイントに基づいて、数式を事前に修正 する
- 「更新」 ボタンを押してコントロールをアップグレードする
5-3. 更新後のテスト観点
更新後は以下の観点でテストすることをおすすめします。
- テキスト入力に値を入力して、OnChange に設定した処理が期待どおりのタイミングで動くか
- ギャラリーのフィルタリングなど、リアルタイム系の処理が引き続き機能するか
- フォーム送信時に、テキスト入力の値が正しく取得できているか
- DisplayMode.View に設定した場合、本当に読み取り専用になっているか
- モバイルデバイスでの表示・操作に問題がないか
6. おわりに
テキスト入力コントロールの更新では、OnChange と TriggerOutput の動作が大きく変わりました。
-
TriggerOutput(デフォルト
Keypress)→ 出力値のリアルタイム更新を担当 - OnChange(フォーカスアウト時のみ)→ 確定後のアクション実行を担当
この2つの役割が明確に分離されたことで、設計としてはわかりやすくなっています。ただし、旧バージョンで OnChange にリアルタイム系の処理を書いていた場合は、Text 出力プロパティの直接参照への書き換えが必要です。
なお、今回の記事ではテキスト入力コントロールに焦点を当てましたが、モダンコントロールの更新は全部で9種類のコントロールが対象です。テキストコントロールでは OnSelect イベントの追加、コンボボックスでは SelectMultiple のデフォルトが true に変更されるなど、コントロールごとに注意すべきポイントがあります。他のコントロールの更新内容については、公式ドキュメントを参照してください。