Napotkałem się na pewien problem. Prosta aplikacja klient-serwer. Poniżej przedstawiam kod:
KOD SERWERA
{ Zwraca liste użytkowników }
function TServerMethods.GetListUsers: TStringList;
var
X: Integer;
MyData: TMyQuery;
begin
Result := TStringList.Create;
MyData := TMyQuery.Create(nil);
try
MyData.Connection := FServer.MyConnection;
MyData.SQL.Text := ('SELECT ' + raf_login + ' FROM ' + Key_RafloUser);
MyData.Active := True;
MyData.First;
while not MyData.Eof do
begin
Result.Add(MyData.FieldByName(raf_login).AsString);
MyData.Next;
end;
finally
MyData.Free;
end;
end;
KOD KLIENTA
procedure TForm4.Button1Click(Sender: TObject);
var
Temp: TServerMethodsClient;
begin
if not DataSnapConnection.Connected then
DataSnapConnection.Open;
Temp := TServerMethodsClient.Create(DataSnapConnection.DBXConnection);
try
ComboBox1.Items := Temp.GetListUsers;
finally
Temp.Free;
DataSnapConnection.Close;
end;
end;
Opis problemu:
Klient łączy się z serwerem i otrzymuje listę użytkowników. Jednakże po kilku wywołaniach procedury klienta dostaję AV lub błąd przy zamykaniu aplikacji klienta "Runtime error 216 at 00409EB8".
Natomiast aplikacja serwera zamyka się prawidłowo a FastMM4 nie wykrywa żadnych wycieków.
Próbowałem przerobić tak procedurę aby zwracać wartość przez referencję tzn.
procedure TServerMethods.GetListUsers(var ListUser:TStringList);
Jednakże to generowało mi jeszcze większe błędy.
Co robię źle, że dostaje AV?