FileMaker スクロールバーの存在取得を困難にする書式設定バー

FileMakerのウインドウサイズ調整について未だ最適解を見つけられないのは、スクロールバーの存在を取得するのを難解にする書式設定バーのせいです。

この稿では、ウインドウ調整に関する話題のひとつとして、スクロールバーの表示状態をゲットすること及び書式設定バーの怪奇について書いています。

ウインドウサイズの調整

ウインドウサイズを調整するにあたっては各種ゲットの関数を使って現状を知ることが最初のステップとなります。Get 関数でウインドウの幅や高さを得ることができますね。しかし不確定要素が一つあります。スクロールバーです。

スクロールバーの存在

ウインドウサイズを測量して判断したいときに問題となるのがスクロールバーの存在です。スクロールバーが表示されているかいないかで、表示領域に 15px(OSのバージョンによるかも) の違いが出てきます。

スクロールバーが表示されているかいないかを取得する関数というものはありません。他の方法で存在を確認する必要があります。そのとき、幅に影響する右サイドでは問題は起きませんが、高さに影響する下部で問題が起こります。

右側のスクロールバー

Get ( ウインドウ幅 ) – Get ( ウインドウ内容幅 ) が 0 であれば右側のスクロールバーは表示されていません。15 など数字が現れればそれが表示されているスクロールバーのサイズです。ウインドウの横方向には、不確定要素がスクロールバー以外に何もありませんから、確定した実数であるウインドウ幅と内容幅の計算で導き出せます。

下方のスクロールバー

下方のスクロールバーを判断するのは簡単にいきません。 Get ( ウインドウ高さ ) – Get ( ウインドウ内容高さ ) で得られる数字は、「ウインドウ上部のパーツ」と「スクロールバーサイズ」の合計になります。横方向と同じ理屈だと、ウインドウ高さ – (上部パーツ + ウインドウ内容高さ)でスクロールバーが算出できるはずです。が、この計算式が成り立つためには、上部パーツのサイズが確定された数値でなければなりません。

ところが現実には上部パーツのサイズはGet関数ではゲットできないことを最近知りました。確定した数値を得られない以上、上記の式は成り立ちません。

これまで誤解していたんですよ、「書式設定バー」の関数について。

ウインドウ上部のパーツ

ツールバー、書籍設定バー、定規

ウインドウ上部のパーツです。ツールバー書式設定バーテキスト定規があります。サイズはそれぞれ固定です。これらについては、過去記事でも取り扱っています。

→ FileMaker ウインドウに関する忘れがちな用語のまとめ(修正版)

これらの要素は、手動で表示させたり非表示にすることができます。自動でもできます。表示状態をゲットできれば、サイズを確定することができます。

現状自分の環境ではタイトルバー22px、ツールバー84px、書式設定バー25px、定規22pxですので、表示を取得して足し算すると上部パーツのサイズが明確になります。これにウインドウ内容高さを加えたものが「ウインドウ高さ」であり、もしそこに誤差15pxあれば、それはスクロールバーが表示されていると判るのです。

上部の三つのパーツについて、表示状況をゲットする関数が用意されていて、表示を制御するスクリプトステップも用意されている・・・と、最近まで誤解していました。

ツールバーとテキスト定規には、ゲット関数と制御ステップがどちらも用意されています。が、書式設定バーだけはそれがなく、妙なことになっているんです。そのせいで、ウインドウ上部の「現在の状況・サイズ」を確実に手に入れることが大変難しいことになって、スクロールバーの存在を知る計算式 ウインドウ高さ – (上部パーツ + ウインドウ内容高さ) が成り立ちません。上部パーツの数字がそもそも不確定要素だからです。

ゲット関数

ツールバーの表示・非表示の状態をゲットする関数は、Get ( ステータスエリア状態 ) です。
テキスト定規の表示・非表示の状態をゲットする関数は、Get ( テキスト定規表示 ) です。

書式設定バーは、表示非表示の状態をゲットすることができません。ただし、「表示を許可しているかしていないか」の設定がゲットできます。Get ( 書式設定バーの表示状態 ) がそれです。この日本語の名前、絶対に間違っていますよ。表示状態はゲットできません。許可しているかどうかをゲットします。

許可しているからといって表示しているとは限りません。許可していないなら間違いなく非表示になります。ここに不確定要素があります。これまで、その名の通り「表示状態」をゲットしているとばかり思っていましたがそうではありませんでした。

Get ( 書式設定バーの表示状態 ) から得られる状態の可能性は次の三つです。

  • 許可していて表示されている ・・・ 1
  • 許可しているが表示されていない ・・・ 1
  • 許可していないので非表示・・・ 0

上二つは結果が共に「1」であり、表示されているのかいないのかを判別できません。「0」なら、必ず非表示になっていると判断できます。

スクリプトステップ

ツールバーの表示・非表示を命じるスクリプトステップは、ツールバーの表示切り替えです。
テキスト定規の表示・非表示を命じるスクリプトステップは、テキスト定規の表示切り替え です。

書式設定バーは、表示・非表示を司るスクリプトステップがありません。ただし「許可を与えるか与えないか」を制御できます。書式設定バーを許可 です。この制御では、表示・非表示を命じることはできません。

  • [ オン ] 実行時、メニュー「書式設定バー」にチェックが入っていれば ・・・ 表示される
  • [ オン ] 実行時、メニュー「書式設定バー」にチェックが入ってなければ ・・・ 表示されない
  • [ オフ ] 実行 ・・・ 非表示になる

上の二つは「オン」と命じていますが、メニューの状況によって結果が異なります。書式設定バーを許可 [オフ] を実行すれば、間違いなく非表示にできます。

じゃあ、メニュー「書式設定バー」のチェック状態をゲットする関数ないの?ありません。じゃあ、チェックを付けたり外したりするスクリプトステップはないの?ありません。

スクロールバーの存在をどうやって取得するか

以上を踏まえて、スクロールバーの存在をどのように取得すれば良いか考えましょう。

レイアウトのサイズをどこかに明記する

これまで私がやってきた方法は主にこれでした。レイアウトごとにレイアウトサイズをどこかに明記しておくわけです。明記する場所は、レイアウト名のグローバル変数、レイアウト情報が入ったリストのグローバル変数、最適化ボタンのスクリプト引数、レイアウト管理専用テーブルのレコードと、いろいろ試しました。

サイズを記録することでデフォルトウインドウサイズを固定し、スクロールバーが表示されているかどうかも簡単に計算できます(固定値より表示サイズが小さければ対角にスクロールバーが表示されます)

確実ではあるものの、このやり方はレイアウト管理をしなければならないことが大前提となるため、超絶面倒くさい。何が悲しゅうてレイアウトのサイズを逐一書き込み続けねばならんのかと思い始めて止まりません。レイアウト管理に手間を取られて本末転倒に近づきます。この方法を元に長年ウインドウ調整を計り続け、何か根本的に間違ってないか?と自問自答していたところです。

書式設定バーを常にオフにする

直近の思いつきはこれです。書式設定バーを全面的に使用禁止にします。書式設定バーの妙なGet関数のうち、確実なのは「許可しない=非表示」ですから。これを貫けば、単純な計算式でスクロールバーの存在を取得できるし、ウインドウサイズ調整の自動化が一気に進みます。面倒なレイアウト管理も省略・簡略化できます。

レイアウト編集モード以外で書式設定バーが必要なときって、テキストフィールドに文章を入力、しかも文字に装飾を施したい場合だけですよね。そういうのが必要なところにだけ、書式設定バー許可オンオフのボタンを配置しておけば済む話です。フィールドから抜けるときに必ずオフにするスクリプトを併用すれば、実害ありません。

書式設定バーを全面禁止にすることで ウインドウ高さ – (上部パーツ + ウインドウ内容高さ)の計算式が成り立ちます。

尚、この理屈で言うと「テキスト定規」なんかはさらに不要な表示となります。が、もともとテキスト定規はGetもできるしスクリプトステップで制御もできます。問題にならず、どうでもいいということで、どうでもいいです。

ウインドウサイズあれこれのFileMaker書類

以上、スクロールバー表示の有無を取得することを困難にすることから端を発した書式設定バーについてでした。マジで、書式設定バーがGetも制御もできないことに、これまで全く気付いていませんでした。自分にとっては驚愕の新事実を暴いたような気持ちになっております。

 

WindowSize.fmp12 というファイルがあります。以前のウインドウサイズ調整の記事で挙げたものを修正して改良したファイルです。ウインドウサイズのいろいろなゲットについて直感的にわかるようになるファイルですよ。お試しください。

WindowSize.fmp12.zip

ウインドウサイズに関する小さなファイル
ウインドウサイズに関する小さなファイル

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください