Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[1258] >질문< 정욱님 도와 주세요~~
폭주족 [ ] 2271 읽음    1998-02-11 17:52
안녕하세요..
제 질문이 너무 막연했죠..

아래는 제가 만들고 있는 프로그램을 가장 간단화 시킨 예제입니다..
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;


+ -

관련 글 리스트
1258 >질문< 정욱님 도와 주세요~~ 폭주족 2271 1998/02/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.