Tips

デバッグ用のフォームをデザインする

日付2019/06/12
ID19-005
バージョンv17以降
プラットフォームWin, Mac

現在テーブルに収められているデータを目で確認したいようなとき、リスト形式のフォームを作成することがあると思います。 しかし1つのテーブルに沢山のフィールドがあるようなとき、フォームウィザードでは、すべてのフィールドを生成しないかもしれません。

4Dの座標系は、過去のバージョンとの互換性のため3200が最大値です。 これを超えてデザインすることは意味がないので、フォームウィザードでは32000を超えたあたりで、フィールドオブジェクトを追加することはありません。

またスクロールは非常にコストがかかる処理(特に横スクロール)でもあるので、リストフォームで大量のフィールドを表示することは現実にはパフォーマンスの観点から無理があります。

リストボックスでデザインするとなると、必要な数のカラムをデザインするのは、相当に大変だとお考えになるかもしれません。 そのような面倒なくSQLのSELECT文で一気に作成する方法があり、過去に紹介した経緯があります。

Tips:SQLを使ってリストボックスにデータを表示

しかし上記の方法は、配列型のリストボックスになりますので、大量のレコードが存在するようなケースでは、表示までに時間がかかる、あるいはメモリが不足するようなことがあるかもしれません。 そこで、問題の少ないセレクション型のリストボックスを自動生成する一例をご紹介します。

まず、下記のようなフォームを作成しますが、ボタンは必要に応じて利用することになるかと思います。

このフォームの大きなポイントはリストボックスですが、次のようにプロパティ設定をしてあります。

  1. 列数は0
  2. ハイライトセットにローカルセット($から始まるセット名)を指定
  3. カラム自動リサイズが有効

このようにデザインしたフォームのフォームメソッドに次のように記述します。

Case of 
	: (Form event=On Load)
		
		Form.table_ptr:=->[Table_lage]  //リストボックスのデータソースと合わせる
		Form.table_name:=Table name(Form.table_ptr)
		Form.table_num:=Table(Form.table_ptr)
		
		  //リサイズした時の表示を整えるためにカラム幅を設定
		Form.column_width:=150
		Form.column_width_min:=100
		Form.column_width_max:=200
		
		  //リストボックスのカラム生成
		For ($i;1;Get last field number(Form.table_ptr))
			If (Is field number valid(Form.table_ptr;$i))
				$field_name:=Field name(Form.table_num;$i)
				$type:=Type(Field(Form.table_num;$i)->)
				LISTBOX INSERT COLUMN FORMULA(*;"List Box";$i;"Column "+$field_name;"["+Form.table_name+"]"+$field_name;Is text;"header "+$field_name;$nil)
				OBJECT SET TITLE(*;"header "+$field_name;$field_name)
				LISTBOX SET COLUMN WIDTH(*;"Column "+$field_name;Form.column_width;Form.column_width_min;Form.column_width_max)
			End if 
		End for 
		
End case 

上記例題では、[Table_lage]テーブルのすべてのデータをテキストで表示するようにしてありますが、実際にはフィールドのデータタイプは考慮されますので、テキスト型以外でも大丈夫です。

フォームデザインで、ボタンが配置されていますが、左側の「追加」と「削除」の2つのボタンは、標準アクションのaddSubrecordとdeleteSubrecordで動作します。 その他のボタンは、後述のコードをそれぞれ記述して表現できます。

//すべて表示ボタン
ALL RECORDS(Form.table_ptr->)
//サブセット表示ボタン
USE SET("$ListboxSet")  //リストボックスの「ハイライトセット」プロパティに合わせる
//クエリボタン
QUERY(Form.table_ptr->)
//並び替えボタン
ORDER BY(Form.table_ptr->)

さらに汎用的に作成することも可能ですが、記事としての簡潔性から、コードの読みやすさとのバランスから、汎用性にはこだわらずにコーディングしました。 この作例をさらに汎用的にプログラムすることで、どのようなストラクチャでもブラウジング可能なフォームを作成することも可能です。

注意:

Formコマンドは基本的にDIALOGコマンドからフォームを表示したときに利用できるものです。 それ以外のコンテキストで利用するときには、Formが利用できないことを考慮したプログラムが必要になります。