안녕하세요..
제 질문이 너무 막연했죠..
아래는 제가 만들고 있는 프로그램을 가장 간단화 시킨 예제입니다..
OnTrigger Event와 OnTriggerData Event를 번갈아 써 봤는데
둘다 'No More Trigger Slots'이란 에러를 냅니다..
우선 에러의 뜻을 모르겠고, 어떤 부분에서 잘못되었는지 궁금합니다..
그리고, 강제 종료 방법도 알려 주신대로 하여도 안되어 아래와 같이
편법을 사용하였습니다..
팀장이 금요일 야간에 테스트하여 결과를 가져오라는데,
어휴~ 어찌하오리까..
정욱님 좀 도와주세요..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AdModem, AdPort, StdCtrls, AdStatLt, OoMisc;
const
NULL = 0;
EOT = 4;
ENQ = 5;
ACK = 6;
LF = 10;
CR = 13;
DLE = 16;
NAK = 21;
ESC = 27;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Button1: TButton;
ApdComPort1: TApdComPort;
ApdModem1: TApdModem;
ApdSLController1: TApdSLController;
ApdStatusLight1: TApdStatusLight;
ApdStatusLight2: TApdStatusLight;
ApdStatusLight3: TApdStatusLight;
ApdStatusLight4: TApdStatusLight;
ApdStatusLight5: TApdStatusLight;
ApdStatusLight6: TApdStatusLight;
ApdStatusLight7: TApdStatusLight;
ApdStatusLight8: TApdStatusLight;
procedure Button1Click(Sender: TObject);
procedure ApdModem1DialTimedOut(Sender: TObject);
procedure ApdModem1ModemBusy(Sender: TObject);
procedure ApdModem1ModemConnect(Sender: TObject);
procedure ApdModem1ModemNoCarrier(Sender: TObject);
procedure ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
private
{ Private declarations }
procedure AddStatus(const Msg: string);
procedure InitModem;
procedure WriteModem;
public
{ Public declarations }
end;
var
Form1: TForm1;
Cnt: Integer;
CRTrig: Word;
ReqENQ: Integer;
implementation
{$R *.DFM}
procedure TForm1.AddStatus(const Msg: string);
begin
ListBox1.Items.Add(Msg);
ListBox1.ItemIndex := Pred(ListBox1.Items.Count);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
InitModem;
WriteModem;
end;
procedure TForm1.InitModem;
begin
Cnt := 0;
ReqENQ := 1;
AddStatus('Modem Init');
ApdComport1.Baud := 300;
ApdComport1.ComNumber := 2;
ApdComport1.DataBits := 7;
ApdComport1.Parity := TParity(Ord(pEven));
CRTrig := ApdComPort1.AddDataTrigger(#5,False);
end;
procedure TForm1.WriteModem;
var
tmp: string;
begin
AddStatus('Dial');
ApdComport1.DTR := True;
ApdComport1.RTS := True;
ApdModem1.Started := True;
tmp := '6,' + Edit1.Text;
ApdModem1.Dial(tmp);
end;
procedure TForm1.ApdModem1DialTimedOut(Sender: TObject);
begin
AddStatus('Timed Out waiting for remote to answer');
end;
procedure TForm1.ApdModem1ModemBusy(Sender: TObject);
begin
AddStatus('Remote was busy');
end;
procedure TForm1.ApdModem1ModemConnect(Sender: TObject);
begin
AddStatus('Connected');
end;
procedure TForm1.ApdModem1ModemNoCarrier(Sender: TObject);
begin
AddStatus('Connection lost');
end;
procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
begin
if TriggerHandle = CRTrig then
begin
AddStatus('Receive ENQ');
Inc(Cnt);
if Cnt = 1 then
begin
try { try...except...end 부분은 강제로}
ApdModem1.Hangup; {종료하기 위한 부분입니다.}
ApdComport1.DTR := False;
ApdComport1.RTS := False;
ApdModem1.Started := False;
except
ApdComport1.DTR := False;
ApdComport1.RTS := False;
ApdModem1.Started := False;
sleep(3000);
InitModem;
WriteModem;
end;
end;
ApdComPort1.RemoveTrigger(TriggerHandle);
end;
end;
end.
그리고 OnTriggerData Event대신 OnTriggerAvail Event를 사용한 경우도
해 보았는데 아래와 같습니다.
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
i: Word;
c: Char;
begin
for i := 1 to Count do
begin
c := ApdComport1.GetChar;
if Ord(c) = ENQ then
begin
AddStatus('Receive ENQ');
Inc(Cnt);
if Cnt = ReqENQ then
begin
try { try...except...end 부분은 강제로}
ApdModem1.Hangup; {종료하기 위한 부분입니다.}
ApdComport1.DTR := False;
ApdComport1.RTS := False;
ApdModem1.Started := False;
except
ApdComport1.DTR := False;
ApdComport1.RTS := False;
ApdModem1.Started := False;
sleep(3000);
InitModem;
WriteModem;
end;
end;
end;
end;
end;
|