unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) DACLabel0: TLabel; DACLabel1: TLabel; Label9: TLabel; Label10: TLabel; DACTrack0: TTrackBar; DACTrack1: TTrackBar; AutoCheck: TCheckBox; UpdateButton: TButton; procedure FormCreate(Sender: TObject); procedure DACTrackChange(Sender: TObject); procedure AutoCheckClick(Sender: TObject); procedure UpdateButtonClick(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..1] of TTrackBar; DACLabel: array[0..1] 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 < $8140) or (PID > $815D) 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 1 do DACDirect(DeviceIndex, I, $000) ; DACSetBoardRange(DeviceIndex, 0); //Turn on the DACs. 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; DACLabel[0] := DACLabel0; DACLabel[1] := DACLabel1; 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; end.