Страницы

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

понедельник, 10 февраля 2020 г.

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

#delphi


Как правильно записать это

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;

Видимо их не надо создавать. А с классом вроде норм все.
    


Ответы

Ответ 1



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;

Ответ 2



Минуту, прежде чем мы углубимся в интерфейсы, сборку мусора и утечки памяти. Я почитал про класс TIdTCPServer. У него есть свойство ContextClass - тип контекста, который он будет создавать. Вы можете унаследовать от ТIdContext, добавить свое строковое свойство, назначить class of Вашего наследника IdTCPServer1.ContextClass = class of TMyIdContext; и потом кастить Clients[index] к Вашему типу. http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer.html

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

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