TIDTCPClient EAccessViolation - PullRequest
       30

TIDTCPClient EAccessViolation

0 голосов
/ 28 мая 2019

У меня есть RFID-считыватель, который поставляется со службой RFTT.Я запускаю службу и пытаюсь получить к ней доступ с помощью TidTCPClient, но при попытке подключения я получаю нарушение прав доступа.Чтение адреса 00000000 Как только он нажмет кнопку «Подключиться», я получу сообщение.

    unit UClient;

interface


uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
    IdComponent, IdTCPConnection, IdTCPClient, IdThreadComponent;

type
    TFClient = class(TForm)

    Label1        : TLabel;
    Label2        : TLabel;

    messageToSend : TMemo;
    messagesLog   : TMemo;

    btn_connect   : TButton;
    btn_disconnect: TButton;
    btn_send      : TButton;


    procedure FormShow(Sender: TObject);

    procedure btn_connectClick(Sender: TObject);
    procedure btn_disconnectClick(Sender: TObject);
    procedure btn_sendClick(Sender: TObject);

    procedure IdTCPClientConnected(Sender: TObject);
    procedure IdTCPClientDisconnected(Sender: TObject);

    procedure IdThreadComponentRun(Sender: TIdThreadComponent);

    procedure Display(p_sender: String; p_message: string);
    function  GetNow():String;
    procedure FormCreate(Sender: TObject);

    private
        { Private declarations }
    public
        { Public declarations }
    end;

    // ... listening port : GUEST CLIENT
    const GUEST_PORT = 5733;


    var
        FClient             : TFClient;

        // ... TIdTCPClient
        idTCPClient         : TIdTCPClient;

        // ... TIdThreadComponent
        idThreadComponent   : TIdThreadComponent;



implementation

{$R *.dfm}


procedure TFClient.FormCreate(Sender: TObject);
begin
    // ... create TIdTCPClient
    idTCPClient                 := TIdTCPClient.Create();

    // ... set properties
    idTCPClient.Host            := 'localhost';
    idTCPClient.Port            := GUEST_PORT;
    idTCPClient.ConnectTimeout  := 5000;
    // ... etc..

    // ... callback functions
    idTCPClient.OnConnected     := IdTCPClientConnected;
    idTCPClient.OnDisconnected  := IdTCPClientDisconnected;
    // ... etc..

    // ... create TIdThreadComponent
    idThreadComponent           := TIdThreadComponent.Create();

    // ... callback functions
    idThreadComponent.OnRun     := IdThreadComponentRun;
    // ... etc..

end;

procedure TFClient.FormShow(Sender: TObject);
begin

    // ... INITAILIZE

    // ... message to send
    messageToSend.Clear;
    messageToSend.Enabled     := False;

    // ... clear log
    messagesLog.Clear;

    // ... buttons
    btn_connect.Enabled       := True;
    btn_disconnect.Enabled    := False;
    btn_send.Enabled          := False;

end;

procedure TFClient.btn_connectClick(Sender: TObject);
begin

    // ... disable connect button
    btn_connect.Enabled := False;

    // ... try to connect to Server
    try
        IdTCPClient.Connect;
    except
        on E: Exception do begin
            Display('CLIENT', 'CONNECTION ERROR! ' + E.Message);
            btn_connect.Enabled := True;
        end;
    end;
end;

procedure TFClient.btn_disconnectClick(Sender: TObject);
begin
    // ... is connected?
    if IdTCPClient.Connected then begin
        // ... disconnect from Server
        IdTCPClient.Disconnect;

        // ... set buttons
        btn_connect.Enabled       := True;
        btn_disconnect.Enabled    := False;
        btn_send.Enabled          := False;
        messageToSend.Enabled     := False;
    end;
end;
procedure TFClient.IdTCPClientConnected(Sender: TObject);
begin

    // ... messages log
    Display('CLIENT', 'CONNECTED!');

    // ... after connection is ok, run the Thread ... waiting messages from server
    IdThreadComponent.Active  := True;

    // ... set buttons
    btn_connect.Enabled       := False;
    btn_disconnect.Enabled    := True;
    btn_send.Enabled          := True;

    // ... enable message to send
    messageToSend.Enabled     := True;

end;



procedure TFClient.IdTCPClientDisconnected(Sender: TObject);
begin
    // ... message log
    Display('CLIENT', 'DISCONNECTED!');
end;


procedure TFClient.IdThreadComponentRun(Sender: TIdThreadComponent);
var
    msgFromServer : string;
begin
    // ... read message from server
    msgFromServer := IdTCPClient.IOHandler.ReadLn();

    // ... messages log
    Display('SERVER', msgFromServer);
end;


procedure TFClient.Display(p_sender : String; p_message : string);
begin
  TThread.Queue(nil, procedure
                     begin
                         MessagesLog.Lines.Add('[' + p_sender + '] - '
                         + GetNow() + ': ' + p_message);
                     end
               );
end;


function TFClient.getNow() : String;
begin
    Result := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ': ';
end;

end.

Это целая программа, к сожалению, я должен поместить весь этот текст, потому что он не позволит мне публиковать без более подробного текста.

Спасибо за любую помощь, KimHJ

1 Ответ

0 голосов
/ 29 мая 2019

Как предложил Реми после того, как вы уронили компонент в форму и использовали его, все работало нормально.

...