{********************************************************************}
{                                                                    }
{     Copyright (c) 04.2000 by Serge Buzadzhy                        }
{     email:  serge_buzadzhy@mail.ru,                                }
{             FidoNet: 2:467/44.37                                   }
{                                                                    }
{                                                                    }
{********************************************************************}


{
 Работа с Array полями Interbase c помощью FibPlus.
 Эта форма демонстрирует как можно визуализировать и редактировать
 Array поля :


 Необходимые действия выполняются в pFIBDataSet1BeforePost,
                                    pFIBDataSet1PostError.

 Note: 1. CachedUpdates недопустим.
       2. В случае неудачного Update/Insert необходимо
          восстановить ArrayID Array поля и до следующего Update/Insert
          вновь выполнить модифицирующие действия 


 Также эта форма в сочетании с открытой Form2 демонстрирует возможности
 контейнера и пользовательских эвентов. Если Form2, открыта то датасет на ней
 рефрешит запись текущую для Form1

}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  FIBDatabase, pFIBDatabase, Db, Grids, DBGrids, StdCtrls, ExtCtrls,
  DBCtrls, FIBDataSet, pFIBDataSet
  {$IFDEF VER140}
  ,Variants
  {$ELSE}
    {$IFDEF VER150}
    ,Variants
    {$ENDIF}
  {$ENDIF}
  ;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    DBGrid1: TDBGrid;
    GroupBox2: TGroupBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    DBNavigator1: TDBNavigator;
    GroupBox3: TGroupBox;
    ArrayDataSet: TpFIBDataSet;
    DataSource1: TDataSource;
    DBMemo1: TDBMemo;
    procedure ArrayDataSetAfterScroll(DataSet: TDataSet);
    procedure ArrayDataSetBeforePost(DataSet: TDataSet);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ArrayDataSetAfterPost(DataSet: TDataSet);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ArrayDataSetBeforeInsert(DataSet: TDataSet);
    procedure ArrayDataSetAfterInsert(DataSet: TDataSet);
    procedure FormShow(Sender: TObject);
  private
    FInShowArrays:boolean;
    FCloneRecNumber:integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, DM;

{$R *.DFM}

procedure TForm1.ArrayDataSetAfterScroll(DataSet: TDataSet);
var v: Variant;
begin
  with ArrayDataSet do try
    FInShowArrays := true;
    v := ArrayFieldValue(FieldByName('LANGUAGE_REQ'));
    Edit1.Text := VarToStr(v[1]);
    Edit2.Text := VarToStr(v[2]);
    Edit3.Text := VarToStr(v[3]);
    Edit4.Text := VarToStr(v[4]);
    Edit5.Text := VarToStr(v[5]);
  finally
    FInShowArrays:=false
  end;
end;

procedure TForm1.ArrayDataSetBeforePost(DataSet: TDataSet);
begin
  with ArrayDataSet do begin
    SetArrayValue(FieldByName('LANGUAGE_REQ'),
      VarArrayOf([
         Edit1.Text,
         Edit2.Text,
         Edit3.Text,
         Edit4.Text,
         Edit5.Text
       ]));
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if (ArrayDataSet.State = dsBrowse) and (not FInShowArrays) then begin
    ArrayDataSet.Edit;
    ArrayDataSet.Fields[0].AsString := ArrayDataSet.Fields[0].AsString;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  FInShowArrays := false;
  Height := 360;
  Width := 668;
end;

procedure TForm1.ArrayDataSetAfterPost(DataSet: TDataSet);
begin
  ArrayDataSet.Transaction.CommitRetaining;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil;
end;

procedure TForm1.ArrayDataSetBeforeInsert(DataSet: TDataSet);
begin
  FCloneRecNumber := ArrayDataSet.RecNo - 1;
end;

procedure TForm1.ArrayDataSetAfterInsert(DataSet: TDataSet);
begin
  ArrayDataSet.CloneRecord(
    FCloneRecNumber, ['JOB_REQUIREMENT', 'LANGUAGE_REQ', 'JOB_CODE']
  );
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ArrayDataSet.Open;
end;

end.
