////////////////////////////////////////////////////
//      //
// .                                        //
// ---------------------------------------------- //
//                          //
////////////////////////////////////////////////////
//  ,    //
//   ,     //
//   (   -//
//   .                               //
////////////////////////////////////////////////////
unit fmuMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComObj, StdCtrls, Grids, ComCtrls;

type
  TSamplePDX = class(TForm)
    btnRead: TButton;
    btnShowProp: TButton;
    ckbDeviceEnabled: TCheckBox;
    btnClose: TButton;
    List: TStringGrid;
    WriteData: TButton;
    AddRow: TButton;
    DeleteRow: TButton;
    Label1: TLabel;
    Form: TComboBox;
    procedure btnCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ckbDeviceEnabledClick(Sender: TObject);
    procedure btnShowPropClick(Sender: TObject);
    procedure btnReadClick(Sender: TObject);
    procedure DeleteRowClick(Sender: TObject);
    procedure AddRowClick(Sender: TObject);
    procedure WriteDataClick(Sender: TObject);
    procedure FormChange(Sender: TObject);
  private
    fPDX: OleVariant;
    procedure UpdateForm;
  public

  end;

var
  SamplePDX: TSamplePDX;
  nFields: Integer;

implementation

{$R *.DFM}

procedure TSamplePDX.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TSamplePDX.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  //   
  fPDX := CreateOleObject('AddIn.PDX45');
  fPDX.RaiseException := True;
  nFields := 0;
  //    
  for I := 0 to 15 do
    Form.Items.Add(IntToStr(I));
  Form.ItemIndex := 0;
  UpdateForm;
end;

procedure TSamplePDX.FormDestroy(Sender: TObject);
begin
  //   
  fPDX := Unassigned;
end;

procedure TSamplePDX.ckbDeviceEnabledClick(Sender: TObject);
begin
  fPDX.DeviceEnabled := ckbDeviceEnabled.Checked;
  UpdateForm;
end;

procedure TSamplePDX.UpdateForm;
begin
  ckbDeviceEnabled.Checked := fPDX.DeviceEnabled;
  if (nFields = 0) then
  begin
    WriteData.Enabled := False;
    AddRow.Enabled := False;
    DeleteRow.Enabled := False;
  end
  else
  begin
    WriteData.Enabled := True;
    AddRow.Enabled := True;
    DeleteRow.Enabled := True;
  end;
end;

procedure TSamplePDX.btnShowPropClick(Sender: TObject);
begin
  //    
  fPDX.ShowProperties;
  UpdateForm;
end;

procedure TSamplePDX.btnReadClick(Sender: TObject);

  procedure SetFields(Index: Integer);
  var
    I: Integer;
  begin
     List.RowCount := List.RowCount + 1;
     List.FixedRows := 1;

     for I := 0 to nFields - 1 do
     begin
        fPDX.ReportFieldIndex := I;
        List.Cells[I, Index] := fPDX.ReportField;
     end;
  end;

  //      
  procedure PrepareForm;
  var
    I: Integer;
  begin
     //     
     List.RowCount := 0;

     if (nFields = 0) then
     begin
       nFields := fPDX.ReportFieldCount;
       List.ColCount := nFields;

       //  
       for I := 0 to nFields - 1 do
       begin
          fPDX.ReportFieldIndex := I;
          List.Cells[I, 0] := fPDX.ReportFieldName;
       end;
     end;
  end;

var
  I: Integer;
begin
  //    () -  
  fPDX.FormNumber := Form.ItemIndex;
  //    
  fPDX.BeginReport;
  //  
  PrepareForm;

  //     
  for I := 1 to fPDX.ReportRecordCount do
  begin
    fPDX.GetRecord;
    SetFields(I);
  end;

  //   
  fPDX.EndReport;
  UpdateForm;
end;

procedure TSamplePDX.DeleteRowClick(Sender: TObject);
begin
  //   
  if (List.RowCount > 1) then
  begin
    List.RowCount := List.RowCount - 1;
  end;
end;

procedure TSamplePDX.AddRowClick(Sender: TObject);
var
  I: Integer;
  Row: Integer;
begin
  //   
  List.RowCount := List.RowCount + 1;
  Row := List.RowCount;

  //  
  for I := 0 to nFields - 1 do
    List.Cells[I, row - 1] := '0';

end;

procedure TSamplePDX.WriteDataClick(Sender: TObject);
var
   I, J: Integer;
begin
  //    
  fPDX.FormNumber := Form.ItemIndex;
  fPDX.BeginAdd;

  for I := 1 to List.RowCount - 1 do
  begin
    for J := 0 to nFields - 1 do
    begin
      fPDX.ReportFieldIndex := J;
      fPDX.ReportField := List.Cells[J, I];
    end;
    fPDX.SetRecord;
  end;

  //      
  fPDX.EndAdd;

  UpdateForm;
end;

procedure TSamplePDX.FormChange(Sender: TObject);
begin
   //    -   
   //  
   nFields := 0;
   UpdateForm;
end;

end.
