ORDA – Genealogy – エピソード4(リクエストにお応えして !)

Deeplからの自動翻訳

このシリーズの第1回第2回、第3回では、ORDAのパワーと、1つの高度に再帰的なテーブルで関連人物を管理することがいかに簡単であるかを示しました。

本日のエピソードでは、見栄えの良いリストやグリッドを作成するためのユーザーインターフェイスに焦点を当てます。

系図をダウンロード – エピソード4

リストボックスとスタイル付きテキスト

配列と選択に基づくリストボックスでは、スタイル付きテキストのカラムを表示することができます。そこで、“コレクションやエンティティの選択に基づくリストボックスでも同じことができるのか?”という疑問が生じます。

お察しの通り、答えは「イエス」ですが、その方法がわからないかもしれません。

もちろん、エンティティの属性がすでにスタイル設定されている場合は、(列の “multi-style” プロパティがチェックされていれば)プログラミングなしで “This.myStyledAttribute” がその役割を果たします。しかし、複数の属性(名前、名字、郵便番号、電話番号など)がある場合、あなたの目標はもっと……

を表示することです。

blank

マジック?

上記の2つのケースでは、DS (以前のエピソードを参照) を使って作成したエンティティ選択に基づいてリストボックスが作成されています。単一の属性(例:This.name)や、「This.Firstname+」「+This.Lastname」のような式を表示するのではなく、列式は全文テキストを返す4Dメソッドになっています。

一方では、テキストはスタイル付きであるもう一方では、そうではありません。

単純なテキスト(スタイル付きでない)

$text:=""
$text: =$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
$text:
=$text+This.Address+Char(Carriage return)
...
$text: =$text+"email:"+This.email+Char(Carriage return)
$0 : =。$text

テンプレートに基づいたスタイル付きテキスト

ここで、スタイル付きテキストのテンプレートを作成するのがコツです。そのためには、下のサンプルの左のように、スタイル付きテキストの領域を使えばよい。

右のエリアは、スタイル付きテキストがspanタグをベースにしていることを説明するためのものです。自分のタグの中にspanタグを入れないようにする必要があります。Lastname]という文字列は、replace string. というコマンドで取得しなければなりません。これは、[Lastname][Lastname](つまり、最初の文字が異なる色のスタイルになっている)には使えません。

blank

$textReplace string$text:=template
$text :=Replace string($text;"[title]";This.Title)
$text :=Replace string($text;"[firstname]";This.Firstname)
...
:=$text($text;"[cell]";This.Cell)
:=Replace string($text;"[email]";This.email)
$0: =$text

エンティティ選択とコレクション

“え?なんでこんなの比べなきゃいけないの?全然違うじゃないですか!”

“そう、その通りです。でも、ちょっと待って……”

エンティティ選択によるリストボックスは素晴らしいものです。何千ものエンティティを保持し、必要なだけのカラムで素早くきれいに表示することができます。コンパクトなデータ(上の写真)でも、個別の属性でも表示できます。

唯一できないことは、データのグリッド(行列)表示です。1列目に1から100までのグループを表示し、2列目に101から200までのグループを表示する、などということはできないのです。正直なところ、コレクションをベースにしたリストボックスでもそれはできませんが、わずかなプログラミングでそれを実現する素晴らしい方法があります。

例えば、こんな風に人の集まりを表示するのが目的だとします。

blank上のリストには9人しか表示されていませんが、エンティティ選択にはもっと多くの人がいて、28人いるとします。

ちょっとした計算

まず最初に、各セルに0から 28までのユニークな番号を持たせる方法を見つける必要があります。左から右へ、行ごとに上から下へ、または列ごとに、のいずれかです。

blank

行番号と列番号の2つのパラメータを持つ関数を呼び出すだけで、このような処理を行うことができます。この場合、NumberOfColumns3($colNum from 0 to 2) で、必要なNumberOfRows10($rowNum from 0 to 9) です。これがわかれば、計算は簡単です。
ケース “A”:$rowNum+($colNum*NumberOfRows)
ケース “B”: ($rowNum*NumberOfColumns) +。 $colNum

リストボックス自体には、行番号を表す0から 9までの 数字で埋め尽くされたコレクションが表示されます。行番号を関数に送信する必要はありません。関数が呼び出されるたびに、行番号はThis.value で表現されます。したがって、関数に列番号を送るだけで、行番号に応じた ID を計算することができます。

そして、どうなったと思いますか?これだけです。計算した$i を longint で返すのではなく、myEntity[$i].name のように必要な情報をテキストで返せばいいのです!(ただ、$i の値は、次の値よりも低いことを確認してください。 myEntities.length)

ケース “A” のコード例。

列の式は次のようになります。

CalcID(“vertical”;0) は1列目用。
CalcID(“vertical”;1) 2番目のカラムの場合
CalcID3列目の場合は (“vertical”;2) です。
(など、3列以上の場合)。

では、CalcID メソッドがどのようなものかを見てみましょう。

C_TEXT// This.value is the current value of the collection (0,1,2,3,...)($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value
$colNum :=$2 // $2 is given by the expression
If($1="vertical")
$0 :=$rowNum+($colNum*numberOfRows)// numberOfRows is a previously calculated value (ex: 10)
Else
$0 :=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")

End if

もうひとつ

必要な結果の種類ごとに個別の関数を作成する必要はありません。単にパラメータを送るだけで、何を返してもらうかを決め、関数は要求された属性が満たされたオブジェクトを返すようにします!

3つのメソッド(getName,getPicture,getBirthday を作成して、text,picture,date を返すのではなく、これらをカラム式に入力するのです…

getName(0)// getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date

getAttributeメソッドをひとつ作成します。このメソッドは、送信されたパラメータにしたがって満たされたオブジェクトを返します。

質問です。その人の名前を教えてください。
答えここに、あなたが尋ねたものを含むname属性を持つオブジェクトがあります!

以下は、getAttribute メソッドの例です。:

C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
:// portrait is requested: returned as attribute of $result($1="name")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="portrait")
$result .portrait:=contact.portrait
: ($1="birthday")
$result .birthday:=contact.birthday // birthday is requested: returned as attribute of $result
End case
$0:=となります。$result

このメソッドを書いておけば、カラム式で呼び出すことができる。

名前 // getAttribute returns an object
getAttribute ("似顔絵").portrait // getAttribute returns an object
getAttribute("誕生日").birthday // getAttribute returns an object

楽しんで、想像力を膨らませてください。

Roland Lannuzel
- プロダクトオーナー&4Dエキスパート -電子工学を学んだ後、産業用ITの分野で開発者兼コンサルタントとして、さまざまなデータベースやテクノロジーを使って顧客のためのソリューションを構築。80年代後半に4Dに惚れ込み、会計、請求書作成、メールシステムなどのビジネスアプリケーションの作成に4Dを使用してきました。現在も、新機能やデータベース開発ツールの定義など、4Dの未来を積極的に切り開いています。