unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) buttonConfirm: TButton; comboRange: TComboBox; Label1: TLabel; groupDAC: TGroupBox; DACLabel8: TLabel; DACLabel9: TLabel; DACLabel10: TLabel; DACLabel11: TLabel; DACLabel12: TLabel; DACLabel13: TLabel; DACLabel14: TLabel; DACLabel15: TLabel; DACLabel0: TLabel; DACLabel1: TLabel; DACLabel2: TLabel; DACLabel3: TLabel; DACLabel4: TLabel; DACLabel5: TLabel; DACLabel6: TLabel; DACLabel7: TLabel; Label9: TLabel; Label10: TLabel; DACTrack0: TTrackBar; DACTrack1: TTrackBar; DACTrack2: TTrackBar; DACTrack3: TTrackBar; DACTrack4: TTrackBar; DACTrack5: TTrackBar; DACTrack6: TTrackBar; DACTrack7: TTrackBar; AutoCheck: TCheckBox; UpdateButton: TButton; DACTrack8: TTrackBar; DACTrack9: TTrackBar; DACTrack10: TTrackBar; DACTrack11: TTrackBar; DACTrack12: TTrackBar; DACTrack13: TTrackBar; DACTrack14: TTrackBar; DACTrack15: TTrackBar; procedure FormCreate(Sender: TObject); procedure DACTrackChange(Sender: TObject); procedure AutoCheckClick(Sender: TObject); procedure UpdateButtonClick(Sender: TObject); procedure buttonConfirmClick(Sender: TObject); procedure comboRangeChange(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} uses AIOUSB, DetectUnit; type TDACChange = packed record Channel, Counts: Word; end; var DeviceIndex: LongWord; DACTrack: array[0..15] of TTrackBar; DACLabel: array[0..15] of TLabel; bAuto: Boolean = True; Changes: array of TDACChange; procedure TForm1.FormCreate(Sender: TObject); var DetectForm: TDetectForm; I: Integer; Status: LongWord; PID: LongWord; begin DeviceIndex := diOnly; Status := QueryDeviceInfo(DeviceIndex, @PID, nil, nil, nil, nil); if (Status <> ERROR_SUCCESS) or (PID < $8060) or (PID > $807F) then begin DetectForm := TDetectForm.Create(Self); if DetectForm.ShowModal = mrOK then begin DeviceIndex := DetectForm.DeviceIndex; DetectForm.Free; end else begin DetectForm.Free; Application.Terminate; Exit; end; end; for I := 0 to 15 do DACDirect(DeviceIndex, I, $0000) ; HandleNeeded; // ensure the FORM has been instantiated so we can access things like Constraints, below. Constraints.MaxHeight := Height; Constraints.MinHeight := Height; DACTrack[0] := DACTrack0; DACTrack[1] := DACTrack1; DACTrack[2] := DACTrack2; DACTrack[3] := DACTrack3; DACTrack[4] := DACTrack4; DACTrack[5] := DACTrack5; DACTrack[6] := DACTrack6; DACTrack[7] := DACTrack7; DACTrack[8] := DACTrack8; DACTrack[9] := DACTrack9; DACTrack[10] := DACTrack10; DACTrack[11] := DACTrack11; DACTrack[12] := DACTrack12; DACTrack[13] := DACTrack13; DACTrack[14] := DACTrack14; DACTrack[15] := DACTrack15; DACLabel[0] := DACLabel0; DACLabel[1] := DACLabel1; DACLabel[2] := DACLabel2; DACLabel[3] := DACLabel3; DACLabel[4] := DACLabel4; DACLabel[5] := DACLabel5; DACLabel[6] := DACLabel6; DACLabel[7] := DACLabel7; DACLabel[8] := DACLabel8; DACLabel[9] := DACLabel9; DACLabel[10] := DACLabel10; DACLabel[11] := DACLabel11; DACLabel[12] := DACLabel12; DACLabel[13] := DACLabel13; DACLabel[14] := DACLabel14; DACLabel[15] := DACLabel15; end; procedure TForm1.DACTrackChange(Sender: TObject); var I, J, L: Integer; Counts: Word; begin I := (Sender as TControl).Tag; Counts := DACTrack[I].Position; DACLabel[I].Caption := IntToHex(Counts, 4); DACLabel[I].Color := $008000; DACLabel[I].Font.Color := $FFFFFF; if bAuto then begin DACDirect(DeviceIndex, I, Counts); DACLabel[I].ParentColor := True; DACLabel[I].ParentFont := True; end else begin L := Length(Changes); for J := 0 to L - 1 do if Changes[J].Channel = I then begin Changes[J].Counts := Counts; Exit; end ; SetLength(Changes, L + 1); Changes[L].Channel := I; Changes[L].Counts := Counts; end; end; procedure TForm1.AutoCheckClick(Sender: TObject); begin if UpdateButton.Enabled and (Length(Changes) <> 0) then UpdateButton.Click; bAuto := AutoCheck.Checked; UpdateButton.Enabled := not bAuto; end; procedure TForm1.UpdateButtonClick(Sender: TObject); var I: Integer; begin if Length(Changes) <> 0 then begin DACMultiDirect(DeviceIndex, @Changes[0], Length(Changes)); for I := 0 to High(Changes) do begin DACLabel[Changes[I].Channel].ParentColor := True; DACLabel[Changes[I].Channel].ParentFont := True; end; SetLength(Changes, 0); end; end; procedure TForm1.buttonConfirmClick(Sender: TObject); begin if DACSetBoardRange(DeviceIndex, comboRange.ItemIndex) = 0 then begin buttonConfirm.caption := 'Confirmed'; groupDAC.visible := true; buttonConfirm.enabled := false; end; end; procedure TForm1.comboRangeChange(Sender: TObject); begin if comboRange.itemindex = -1 then buttonConfirm.enabled := false else begin buttonConfirm.enabled := true; buttonConfirm.Caption := 'Confirm Selection'; end; end; end.