unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ImgList, ExtCtrls; type TForm1 = class(TForm) IPLabel: TLabel; IPEdit: TEdit; ConnectButton: TButton; MainStatus: TStatusBar; Label0: TLabel; WriteButton: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; DOByteLabel: TLabel; LevelImages: TImageList; OutImage0: TImage; OutImage1: TImage; OutImage2: TImage; OutImage3: TImage; OutImage4: TImage; OutImage5: TImage; OutImage6: TImage; OutImage7: TImage; Label9: TLabel; LegendImageLow: TImage; Label10: TLabel; LegendImageHigh: TImage; Label11: TLabel; procedure ConnectButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure WriteButtonClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure OutImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); protected procedure SetStatusText(NewStatus: String); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} uses AIOETHW; var MainCR: Pointer = nil; OutImage: array[0..7] of TImage; DOData: Byte; LowLevel, HighLevel: TBitmap; procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin OutImage[0] := OutImage0; OutImage[1] := OutImage1; OutImage[2] := OutImage2; OutImage[3] := OutImage3; OutImage[4] := OutImage4; OutImage[5] := OutImage5; OutImage[6] := OutImage6; OutImage[7] := OutImage7; LowLevel := TBitmap.Create; LevelImages.GetBitmap(0, LowLevel); HighLevel := TBitmap.Create; LevelImages.GetBitmap(1, HighLevel); LegendImageLow.Picture.Assign(LowLevel); LegendImageHigh.Picture.Assign(HighLevel); DOData := $FF; for I := 0 to 7 do OutImage[I].Picture.Assign(LowLevel) ; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(LowLevel); FreeAndNil(HighLevel); end; procedure TForm1.ConnectButtonClick(Sender: TObject); begin WriteButton.Enabled := False; ConnectButton.Enabled := False; if MainCR = nil then begin //We don't have a connection client ref, so try to connect. SetStatusText('Connecting...'); MainCR := AEW_Connect(PChar(IPEdit.Text), 0); if MainCR = nil then SetStatusText('Error ' + IntToStr(GetLastError) + ' connecting to ' + IPEdit.Text + '.') else begin SetStatusText('Connected.'); ConnectButton.Caption := 'Disconnect'; WriteButton.Enabled := True; end; end else begin //Already connected, so disconnect. SetStatusText('Disconnecting...'); AEW_Disconnect(MainCR); MainCR := nil; SetStatusText('Disconnected.'); ConnectButton.Caption := 'Connect'; WriteButton.Enabled := False; end; ConnectButton.Enabled := True; end; procedure TForm1.OutImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var BitIndex: Integer; BitMask: Byte; begin if Button <> mbLeft then Exit; BitIndex := TComponent(Sender).Tag; BitMask := 1 shl BitIndex; DOData := DOData xor BitMask; //Toggle the bit. if (DOData and BitMask) <> 0 then //Change the picture to match the new bit state. OutImage[BitIndex].Picture.Assign(LowLevel) else OutImage[BitIndex].Picture.Assign(HighLevel) ; DOByteLabel.Caption := IntToHex(DOData, 2); //Update the "as byte" display. end; procedure TForm1.WriteButtonClick(Sender: TObject); var L: Integer; Status: LongWord; begin if MainCR = nil then begin SetStatusText('Must connect before writing.'); Exit; end; SetStatusText('Writing...'); L := SizeOf(DOData); Status := AEW_DIO_WriteAll(MainCR, @L, @DOData); if Status = ERROR_SUCCESS then SetStatusText(IntToHex(DOData, 2) + ' written to DO.') else SetStatusText('Error ' + IntToStr(Status) + ' writing to DO.') ; end; procedure TForm1.SetStatusText(NewStatus: String); begin MainStatus.Panels[0].Text := NewStatus; MainStatus.Update; end; end.