Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

Как в переменную типа TObject сохранить строку?

Как правильно записать это
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;

Комментариев нет:

Отправить комментарий