4D v16

配列、ポップアップ、リストボックス

ホーム

 
4D v16
配列、ポップアップ、リストボックス

配列、ポップアップ、リストボックス    


 

 

ビデオ中で説明されている操作の他、以下の点にも留意してください:

配列はプログラミングにおいて欠かすことのできない機能です。

配列とはメモリ上にあるデータの入れものであり、オブジェクト (ポップアップ、コンボボックス、リストボックス) を通じてフォーム上に表示できます。

通常の変数については既に説明しました。配列には同じ型の値を複数格納し、各要素ごとに読み書きすることができます。

配列を使用する際には配列名とともにその型と要素数を指定します。以下は変数と配列の比較です:

ステップ通常の変数配列変数
宣言C_TEXT(vText)ARRAY TEXT(ArrayText;10) // 10 行
初期化vText:="変数の内容"ArrayText{1}:="配列要素の内容1" // 1行目
ArrayText{2}:="配列要素の内容2" // 2行目
ArrayText{3}:="配列要素の内容3" // 3行目
...
利用する$NumChar:=Length(vText)$Amant:=ArrayText{1}
内容を消去CLEAR VARIABLE(vText)CLEAR VARIABLE(ArrayText) または ARRAY TEXT(ArrayText;0)
フォーム上での表示変数タイプオブジェクトに、バインドするする変数名を設定リストボックスやポップアップタイプオブジェクトに、バインドする配列変数名を設定

ご覧のとおり両者には多くの共通点があります。

配列名の後ろに { } を書くと配列要素を参照しますが、配列名は単独で使用されることもあり、配列変数名そのものは4Dが自動で作成する倍長整数変数です。

配列名の倍長整数変数を参照すると、配列内で現在選択されている要素番号を得ることができます。ユーザーがフォーム上の配列オブジェクトのどの行をクリックしたかが分かりますし、逆に値を設定することで配列オブジェクトの表示を更新することもできます。

以下のようなコードをプログラム中でよく目にすることになるでしょう:

 [INTERVENTIONS]$Object:=ObjectsArr{ObjectsArr}

これは以下のような意味です: "オブジェクト := オブジェクト配列の内容 {選択されている要素番号}"
汎用的なコードを記述する際にはSelfコマンドを使用して、以下のように書くことができます:

 [INTERVENTIONS]$Object:=Self->{Self->}

使用されるシンタックスに関わらず、動作は同じです。

4Dにはタブインターフェースがあり、複数のタイトルをタブ上に表示できます。これも配列を表示する例です。

通常タブはすべてのページで表示され、ページの切り替えに使用するため、0ページに配置します。

プログラムを始めてすぐに配列の有用性に気づくことでしょう。そしてさらに必須のものとなるはずです。

配列には型が同じ値を格納できます。ひとつの配列に文字データや日付データ、時間データを混在して格納することはできません。このようなことを行いたい場合、すべてを文字型に変換するか、異なるタイプの変数へのポインターを格納するポインター型の配列を使用します。

リストボックスはひとつ以上の配列が連結されグループ化されたものと考えることができます。

リストボックスには以下の要素が含まれます:

  • リストボックス自身 (コンテナー)
  • 列ヘッダー
  • 列 (配列)
  • 列フッター
リストボックスを使用すると以下のことが行えます:
  • データの入力
  • 行や列の並べ替え
  • 奇数行と偶数行で背景色の変更
  • 階層表示
  • フッターへの計算値の表示
  • など

(リストボックスには配列の他、テーブルのカレントセレクションや命名セレクションを表示することもできます。)

リストボックスはすべての列で同期される点に留意してください。最も行数の少ない配列に合わせられます。すべての列の配列の要素数が同じでなければ正しい結果は得られません。例えばリストボックス中のひとつの配列要素数が0の場合、他の配列すべての行が表示されません。

Today we're going to learn to create and program arrays as well as objects we can use to represent them in forms.

Like a simple variable, an array must be:

  • declared
  • assigned a value
  • and then used.

To help us understand this, we're going to create a first array in the DETAIL form of the INTERVENTIONS table.

This array will concern the objects.
So, we will need to:

  1. Create the array in memory
  2. Place an object on the form that can represent this array in memory
  3. Check that the array contains the correct information
  4. Then when we select a value in the array, we transfer this value to the field

To make things simple, we're going to put all the programming in the object. This will also let us review the concept of an event.

  • Select the popup/drop-down list object
  • Then draw it to the right of the OBJECT field.
  • Name it PopObjects
  • We check the On Load and On Clicked events
  • Then we edit the method as follows.

 $evt:=Form event
 Case of
    :($evt=On Load//before the form is displayed
       ARRAY TEXT(PopObjects;5) //Definition of array (Type, Name and number of elements)
 
  //Fill in the elements of the array
       PopObjects{1}:="Training"
       PopObjects{2}:="Software"
       PopObjects{3}:="Hardware"
       PopObjects{4}:="Network"
       PopObjects{5}:="System"
 
    :($evt=On Clicked//when the user chooses an element in the array
       If(PopObjects#0) //if the user chose an element
          $ChosenElement:=PopObjects //store the selected element
          $ChosenValue:=PopObjects{$ChosenElement//store the value contained in this element
          [Interventions]Object:=$ChosenValue  //assign the value to the field
       End if
 End case

The object method will be made up of a certain number of elements:

  • Initially, the test of the event.
  • If it is "On Load", we create an array of 5 elements, where the 1st will contain "Training" and so on
  • And when we click on the object, the transfer will take place here in the object.

We're going to trace the operation of this method by carrying out an initial test.

We see that when we double-click on an intervention, we go to On Load.

We'll be able to display the array that contains 5 elements and these 5 elements are gradually assigned values.
The intervention appears.

When we choose a value in the menu, we see here the line number indicated in a variable, which is a variable that has the same name as the array, but which is a longint type variable.

And here we see the 5 elements of the array, the elements 1 to 5 and then the zero element which we will come back to later.

When this method is executed:

  • the event concerned is "On Clicked".
  • we can check that an element has been chosen.
  • if the element was chosen, we can:
    •  pass by the intermediate variable (here "ChosenElement")
    • retrieve the chosen value, if we look at ChosenElement, we see that it is "Hardware"
    • and transfer this chosen value to the object.

We can replace these 3 lines by a single one as follows:

 [Interventions]Object:=PopObjects{PopObjects}

Why?

Because this value here is the longint variable that contained the 3 earlier ones, so it indicates the line number of the array concerned (which has the same name).
For generic issues, you'll often find this type of syntax:

 [Interventions]Object:=Self->{Self->}

which uses a pointer to the object.

Since programming is carried out on the object itself, Self refers to the object and when we write Self->{Self->},

we indicate the array {at the row chosen in the array} and we transfer the contents directly into the object.

We're going to trace this to check that we get the same result.

  • So currently we have "system" in the [intervention] object.
  • If we display PopObjects{PopObjects} we have "system"
  • If we display Self->{Self->} we also have "system"

This breakdown helps us understand in detail.
This is the most generic and concise way of writing it.

Now we're going to create a new array where we can enter a date to within plus or minus 10 days.

  • Duplicate the object
  • Rename it
  • Copy
  • And modify its method.

This is a date array of 21 elements: today + 10 days - 10 days
and we'll write the most concise code this way.

So, how do we fill in these elements? We're going to make a loop where we assign a value to the array as follows: (Current date + $i-11).

Of course, the array will have the correct name and now we can test it:
and we see here that when we choose a value in the array, it is shifted next to the intervention date.

Now that you know how to program arrays, you can represent them in different 4D objects, such as list boxes.

A list box is an object made up of one or more columns with headers and it is precisely the column that interests us, where we'll just write the name of the array that we managed in memory.

If we now return to an intervention, the list box contains the different values of the array and we see the direct synchronization between the choice in the list box and the corresponding one in the array here.

We're going to program the list box in the same way so that when we click on it or when we make a new selection in it, the value of the object is modified automatically.

So in the list box we check the On Clicked and On Selection Change events.

You just need to copy the following line into the object method of the list box:

 [Interventions]Object:=PopObjects{PopObjects}

During use, when we select a value in the list box with the mouse or using the arrow keys, the values are transferred automatically.

Of course, it is also possible to use drag and drop as long as the areas were set as draggable and droppable.

 
 

 
プロパティ 

プロダクト: 4D
テーマ: 配列、ポップアップ、リストボックス

 
履歴 

 
ARTICLE USAGE

セルフトレーニング ( 4D v16)