レコードがデータベースに保存されたら、ユーザーがそのフィールドに入力した場合にコミットされていない変更を行ったことを示すために、フィールドの色を変更したいと考えています。
closeField に foreColor を設定するのが最善ですか、それともキーを押すたびに追跡して、前のフィールドの内容を含む変数と比較する方がよいですか?
フィールド データをロードするプロセスが実行され、保存されていない新しいデータが入力されると、テキストの変更を検出する方法を尋ねていますか? あなたはコミットされていない新しい変更について言及しましたが、あなたが何を考えているのかわかりません。これは、closeField ハンドラーを使用しても、「そのフィールドに入力してもコミットされていない変更」を示さないことを意味します。
ただし、そうであれば、データベースへの書き込み時にフィールドのカスタム プロパティを設定し、フィールド スクリプトに単純なハンドラーを配置します。
on textChanged
if me <> the lastText of me then set the foreColor of me to "blue"
end textChanged
このプロパティは "the lastText" という名前で、データベースに保存されるハンドラーによって設定されます。
set the lastText of field "yourField" to field "yourField"
そのフィールド内で何かが編集されると、色が青に変わります。もちろん、保存ハンドラも色を黒に戻す必要があります。
glx2 では、実際には少しやり過ぎです。フィールドを保存するときにフィールドの md5digest を保存し、フィールドの md5digest を保存された値と照合して、保存が必要かどうかを確認します。明らかに、どんなに高速であっても、キーを押すたびに計算を実行したくありません。OSXで別のアプリをクリックしてもcloseFieldがトリガーされないという問題が過去にあったことを覚えているようですが、closeFieldでそれを行うことはそれに対処する良い方法です。
フォームのすべてのフィールドを処理するカード レベルのスクリプトを次に示します。データをカードにロードするときは、各フィールドの uOriginalText カスタム プロパティを、フィールドにロードされたテキストと同じ値に設定します。
on closeField
# the target control for this message
put the target into tTarget
# detect case changes like 'mr jobs' to 'Mr Jobs'
set the caseSensitive to true
# compare with the original text, set when the form was loaded
if the text of tTarget <> the uOriginalText of tTarget then
# indicate the change - I've used backColor in case the field is now empty
set the backColor of tTarget to "red"
else
# clear warning background color
set the backColor of tTarget to empty
end if
end closeField