unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) DACTrack0: TTrackBar; DACTrack1: TTrackBar; DACTrack2: TTrackBar; DACTrack3: TTrackBar; DACTrack4: TTrackBar; DACTrack5: TTrackBar; DACTrack6: TTrackBar; DACTrack7: TTrackBar; DACLabel0: TLabel; DACLabel1: TLabel; DACLabel2: TLabel; DACLabel3: TLabel; DACLabel4: TLabel; DACLabel5: TLabel; DACLabel6: TLabel; DACLabel7: TLabel; AutoCheck: TCheckBox; UpdateButton: TButton; ChLabel0: TLabel; ChLabel1: TLabel; ChLabel2: TLabel; ChLabel3: TLabel; ChLabel4: TLabel; ChLabel5: TLabel; ChLabel6: TLabel; ChLabel7: TLabel; 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..7] of TTrackBar; DACLabel: array[0..7] 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 not ((PID = $4003) or (PID = $4002)) 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 7 do DACDirect(DeviceIndex, I, $000) ; Handle; 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; DACLabel[0] := DACLabel0; DACLabel[1] := DACLabel1; DACLabel[2] := DACLabel2; DACLabel[3] := DACLabel3; DACLabel[4] := DACLabel4; DACLabel[5] := DACLabel5; DACLabel[6] := DACLabel6; DACLabel[7] := DACLabel7; 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, 3); 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.