TTest = class(TComponent)
  private
    FIdUDPServer: TIdUDPServer;
  public
    constructor create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Active(Port: Integer);
  end;
{ TTest }procedure TTest.Active(Port: Integer);
begin
  FIdUDPServer.DefaultPort := Port;
  FIdUDPServer.Active := True;
end;constructor TTest.create(AOwner: TComponent);
begin
  inherited;
  FIdUDPServer := TIdUDPServer.Create(self);
  FIdUDPServer.BufferSize := 4096;
  FIdUDPServer.ThreadedEvent := True;
end;destructor TTest.Destroy;
begin
  if Assigned(FIdUDPServer) then
  begin
    FIdUDPServer.Active := False;
    FIdUDPServer.Free;
  end;
  inherited;
end;
//调用后,关闭窗体会出现 socket Error #10093的错误
procedure TForm1.Button5Click(Sender: TObject);
begin
  FSerTest := TTest.create(nil);
  FSerTest.Active(23323);
end;在网上查找10093错误解释:應用程式沒有呼叫WSAStartup()或是呼叫WSAStartup()失敗。應用程式要成功地呼叫WSAStartup()才能使用WinSock.DLL,否則會有此錯誤訊息出現。
这个到底是啥问题呀

解决方案 »

  1.   

      inherited Destroy();释放完自定义的内容
    继承父类的释放
      

  2.   

    FIdUDPServer := TIdUDPServer.Create(nil);
    -----------------------------------------------------------------type
      TSocketSvr = class
        FIdUDPServer: TIdUDPServer;
      private
        procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TBytes;ABinding: TIdSocketHandle);
        procedure SetTransPort(const Value: UINT);
        function GetActived: boolean;
        procedure SetActived(const Value: boolean);
      public
        constructor Create;
        destructor Destroy;
      published
        property TransPort: UINT read FTransPort write SetTransPort;
        property Actived: boolean read GetActived write SetActived;
      end;constructor TSocketSvr.Create;
    begin
      try
        FIdUDPServer := TIdUDPServer.Create(nil);
        FIdUDPServer.DefaultPort := 3000;      
        FIdUDPServer.OnUDPRead := UDPServerRead;    //我用XE OnUDPRead 事件与泛型有冲突,只能引用事件
        FIdUDPServer.ThreadedEvent := true;         //如果为FALSE 监听不到事件
      except
      end;
    end;destructor TSocketSvr.Destroy;
    begin
      FIdUDPServer.Active := false;
      FIdUDPServer.Bindings.Clear;
      FIdUDPServer.Free;
      SocketSvr := nil;
    end;procedure TSocketSvr.UDPServerRead(AThread: TIdUDPListenerThread;AData: TBytes; ABinding: TIdSocketHandle);
    begin
      try
        if not AThread.Terminated then
        begin
          //处理数据......
          Sleep(LockDelay);
        end;
      finally
        mySocketProcesser.Free;
      end;
    end;