Как правильно записать это
TIdContext(Clients[0]).Data := 'Client3';
И как потом её можно прочесть?
upd
пробую так, выдаёт access violation
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
ResString := Creator.TcpResCreate(ReqString);
....
function PCreator.TcpResCreate(ClientReq : String) : String; // функция в другом юните
begin
if login then
begin
if not Assigned(Form1.IdTCPServer1.Contexts) then exit;
Clients := Form1.IdTCPServer1.Contexts.LockList;
TIdContext(Clients[Clients.Count - 1]).Data := TStringHolder.Create(Req.sessionKey.xPlayer);
Form1.IdTCPServer1.Contexts.UnlockList;
Result := xxx;
....
procedure TForm1.Button1Click(Sender: TObject);
begin
TIdContext(Clients[0]).Connection.Socket.Write('message');
IdTCPServer1.Contexts.UnlockList;
....
может дело в создаваемом классе?
upd
перестало выдавать ошибку после того как я убрал,
Clients := TLists.Create; Clients.Free;
Видимо их не надо создавать. А с классом вроде норм все.
Ответ
type
TStringHolder = class
private
fValue: string;
function GetValue: string;
public
constructor Create(aValue: string);
property Value: string read GetValue write fValue;
end;
constructor TStringHolder.Create(aValue: string);
begin
fValue := aValue;
end;
function TStringHolder.GetValue: string;
begin
if self <> nil then
result := fValue
else
result := '';
end;
Записать:
TIdContext(IdTCPServer1.Contexts.LockList[0]).Data := TStringHolder.Create('Client3');
Прочитать:
... := TStringHolder(TIdContext(IdTCPServer1.Contexts.LockList[0]).Data).Value;
Не забудьте потом вызвать:
TIdContext(IdTCPServer1.Contexts.LockList[0]).Data.Free;
TIdContext(IdTCPServer1.Contexts.LockList[0]).Data := nil;
Комментариев нет:
Отправить комментарий