ブログ

ご注意:
この情報は過去に書かれたブログ記事のキャッシュになります。最新の情報ではありませんのでご注意ください。
また、公開当時のキャッシュされたテキストのみを読めるようにした内容になっております。 公開当時の画像やデザイン情報がありませんので、デザイン上読みにくい部分がありますことをご了承ください。 なお、最新のブログはGitHubにて公開しています。

Tech Tips

日付2014/07/28

この記事では、4Dの使用に役立つTips(小技)を紹介してきます。

Mac OSのウィンドウでのフルスクリーンモード
Mac版のv14でのDisplay Notificationコマンド
複数のメニュー項目を管理するための一般的なメソッド
プライマリーキーフィールドのIDを返すユーティリティメソッド
同一フォーム内のカレントセレクションリストボックスと命名セレクションリストボックス

Mac OSのウィンドウでのフルスクリーンモード

Mac版のv14にはフォームウィンドウを最大化するためのオプションがあります。Open form window コマンドを以下の様に使用します:

$win:=Open form window("Form1";Has full screen mode Mac)
これにより、以下の画像の赤丸で示してある矢印をクリックすることによってフォームをフルスクリーンモードに移行する事ができます:

関連項目:
Open form window

Mac版のv14でのDisplay Notificationコマンド

v14以前では、通知メッセージを表示するDISPLAY NOTIFICATION コマンドは、主にWindowsのマシンで使用されてきました。この機能はv14においてMac版(OS 10.8以降)でも使用できるようになりました。

関連項目:
Display Notification

複数のメニュー項目を管理するための一般的なメソッド

メニューにおける常識の一つとしては、それにメソッドを割り当てることです。それぞれのメニュー項目に対するメソッドは、ツールバーから割り当てることができます。

それぞれのメニュー項目は独自のメソッドを実行する事もできますし、全て同じメソッドを実行することもできます。複数のメニュー項目に同じメソッドを実行させることにより、それらのメニュー項目の機能を単一のメソッドで管理できるという利点があります。それに加え、メニュー項目で引数を受け取る事ができます。ツールボックスからメソッドを割り当てる場合には引数をメソッドへと渡す方法はなかったからです。

メニュー項目の挙動を管理するための単一のメソッド:

// メソッド: HandleMenuItem
// 詳細: 選択されたメニュー項目を検知し、
// 選択されたメニュー項目の名前に基づいて
// 適切なメソッドを実行します。
//-----------------------------------------
C_TEXT($MenuItemName_t)

//メニュー項目の名前を取得
$MenuItemName_t:=(Get menu item(Menu selected\65536;Menu selected%65536))

//メニュー項目のタイトルに基づいて実行するメソッドを決定
Case of
: ($MenuItemName_t:=”Item 1”)
MyMenuMethod1
:($MenuItemName_t:=”Item 2”)
MyMenuMethod2(“param1”)
:($MenuItemName_t:=”Item 3”)
MyMenuMethod3(“param1”;”param2”)
End case
この方法を採用することにより、ユーザーは単一のメソッド内で全てのメニューメソッドを管理することができ、その名前/タイトルを見ればメニュー項目が何をするのか分かります。また、この方法であればメニューから呼び出されたメソッドが引数を受け取る事ができます。

ツールバーにて、それぞれのメニュー項目に上記のメソッド(HandleMenuItem)を実行するように割り当てて下さい:

プライマリーキーフィールドのIDを返すユーティリティメソッド

以下はプライマリーキーを持つテーブルのフィールドIDを返すメソッドです。最初にまずテーブルにプライマリーキーがあることを確認し、次にそのテーブル内でプライマリーキーとして設定されているフィールドを探します。

C_LONGINT($0;$1;$table_id_l;$primary_key_field_id_l;$hasPK_l)

If (Count parameters>=1)
$table_id_l:=$1

Begin SQL
SELECT TABLE_ID
FROM _USER_CONSTRAINTS
WHERE TABLE_ID = :$table_id_l
AND CONSTRAINT_TYPE = 'P'
INTO :$hasPK_l;
End SQL

If ($hasPK_l#0)
Begin SQL
SELECT COLUMN_ID
FROM _USER_CONS_COLUMNS
WHERE TABLE_ID = :$table_id_l
INTO :$primary_key_field_id_l;
End SQL
Else
$primary_key_field_id_l:=0
End if
End if
$0:=$primary_key_field_id_l
注::返り値の引数($0)をテキスト型にし、二つ目のSQLクエリにてCOLUMN_IDの代わりにCOLUMN_NAMEを選択するとIDの代わりにフィールド名を取得する事ができます。

同一フォーム内のカレントセレクションリストボックスと命名セレクションリストボックス

4D v11にてSQLを導入して以来、4Dがサポートする、セレクションに基づいたリストボックスは二つありました。カレントセレクションと命名セレクションです。

カレントセレクションと命名セレクション、両方があるフォームが導入される以前は、デベロッパは二つのリストボックスの違いと、ユーザーが命名セレクションリストボックスを扱う際の問題に気を付ける必要がありました。

もし二つのリストボックス(一つはカレントセレクションリストボックスでもう一つは命名セレクションリストボックス)が一つのフォームに置かれる場合、命名セレクションリストボックスの方のプロパティは、「フォーカス可」のチェックを外し、「行をダブルクリック」を「何もしない」に設定することが強く推奨されます。

ユーザーが命名セレクションに表示されたレコードを操作することが許可される場合、デベロッパは命名セレクションの本来の目的を熟知している必要があります。それは「命名セレクションは、複数のセレクションを同時に扱う簡単な方法を提供します。命名セレクションはプロセス中における、テーブルレコードの並び順付きリストです。この並び順付きリストに名前を付けてメモリに保持することができます。命名セレクションによって簡単にセレクションをメモリに置くことができます。命名セレクションはセレクションの並び順とカレントレコードをメモリに保持する簡単な手段を提供します」ということです。命名セレクションはUSE NAMED SELECTIONコマンドを呼び出さない限り、カレントセレクションとして使用するべきものではありません。

カレントセレクションリストボックスと命名セレクションリストボックスがどのように相互作用するか

命名セレクションの作成には4通りの方法があります。

COPY NAMED SELECTION

CUT NAMED SELECTION

SET QUERY DESTINATION (Into named selection)

CREATE SELECTION FROM ARRAY

CUT NAMED SELECTIONで作成された命名セレクション以外のリストボックスは、その挙動は同じです。

編集のために選択したレコードがカレントセレクション、命名セレクション両方ともに同時に存在する場合(ターゲットとなるリストボックスのプロパティの設定による)、リストまたは詳細フォーム内で編集は可能となります。どちらのリストボックスにおいても、編集したレコードはそのリストボックス内において直ちには表示されません。スクロールをするか、REDRAWコマンドを呼び出すか、またはウィンドウを強制的に更新して再描画することによって両方のリストボックスにその更新が表示されるようになります。

「命名セレクション」プロパティ(データソース)の設定に関係なく、もし命名セレクションがCUT NAMED SELECTIONから作成されていて、ユーザーが表示されたレコードをそれを使用して編集しようとした場合、リストボックスは、カレントセレクションリストボックス内の表示されているレコードの数とどのレコードが表示されているかに応じて、以下の様に変化します。

行を無効化し、行の背景色を灰色にします。
入力フォームを表示します。ただし、命名セレクションの中から選択されたレコードが入力フォームで編集用に表示されたレコードと同一であるかどうかは保証されません。

命名セレクションリストボックスでレコード選択したときに、カレントセレクションからどのレコードが表示されるかが予測不可能であるため、命名セレクションリストボックスからレコードを選択した際には編集はサポートされるべきではありません。命名セレクションリストボックスは表示目的のみに使用されるべきです。