Я создал автономный TCP/IP-сервер Datasnap с помощью мастера. Я выбрал примеры методов (echostring и reversestring). Я сохранил сервер и запустил его. Затем я создал клиентское приложение и, используя file-new-other, добавил ClientModule в этот клиентский проект вместе с модулем ClientClasses. На основной форме. Я добавил кнопку. В обработчик события onclick кнопки я добавил следующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
Цель здесь состоит в том, чтобы смоделировать ситуацию, когда клиент регулярно входит в систему и выходит из сервера, а не поддерживает соединение. Это особенно важно для приложений, развернутых на мобильных устройствах.
Как видите, я закомментировал Connection.Open, потому что первый вызов ServerMethods1client открывает соединение. Сгенерированный код показан здесь:
function TClientModule1.GetServerMethods1Client: TServerMethods1Client;
begin
if FServerMethods1Client = nil then
begin
SQLConnection1.Open;
FServerMethods1Client := TServerMethods1Client.Create(SQLConnection1.DBXConnection, FInstanceOwner);
end;
Result := FServerMethods1Client;
end;
Теперь возникает проблема. При первом нажатии на кнопку открывается соединение и вызывается метод. При втором нажатии на кнопку соединение закрывается. При третьем щелчке возникает исключение «Операция не удалась. Соединение было закрыто» с кодом TDBXCommand.
В качестве обходного пути я попробовал это:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
ClientModule1.ServerMethods1Client := nil;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
Это вроде как решает проблему, поскольку экземпляр FServerMethods1Client ClientModule1 сбрасывается, поэтому код создания запускается снова, как и при первом запуске.
Единственная другая проблема сейчас (я использую Eurekalog) создает утечку памяти.
Что я делаю неправильно? Как правильно повторно подключаться/отключаться от сервера Datasnap без перезапуска приложения?