Универсальные очереди с записью , Прямая запись в очередь

#delphi #generics

Вопрос:

Закрытая секция :

 type
  TWorkOwner = (woClient,woServer);

  TWorkData = record
    Owner : TWorkOwner;
    AMessage : string;
    MsgID : integer;
  end;

  WorkFlow : TQueue<TWorkData>;
  WorkData : TWorkData;
 

Затем я хочу добавить элементы типа WorkData в эту очередь следующим образом :

   WorkData.Owner:=woClient;
  WorkData.AMessage:='LogOn';
  WorkData.MsgID:=MsgID;

  WorkFlow.Enqueue(WorkData);
 

Это работает, но я хотел бы (если возможно) напрямую ставить рабочие данные в очередь, как это (псевдокод) :

 WorkFlow.Enqueue(woClient,'LogOn',MsgID);
 

Это , очевидно, не работает, я попробовал несколько разных подходов, но я не могу понять, как это установить, если это вообще возможно.

Спасибо.

Ответ №1:

Самый простой подход-добавить конструктор в запись, которая принимает эти параметры:

 type
  TWorkData = record
    Owner: TWorkOwner;
    AMessage: string;
    MsgID: integer;
  public
    constructor Create(AOwner: TWorkOwner; const AAMessage: string; AMsgID:
        integer);
  end;

constructor TWorkData.Create(AOwner: TWorkOwner; const AAMessage: string;
    AMsgID: integer);
begin
  Owner := AOwner;
  AMessage := AAMessage;
  MsgID := AMsgID;
end;

WorkFlow.Enqueue(TWorkData.Create(woClient,'LogOn',MsgID));
 

Ответ №2:

Вы можете определить конструктор вашей записи, что-то вроде этого:

 constructor Create(AOwner: TWorkOwner; AMessage: string; AMsgID: integer);
 

А потом Enqueue вот так:

 WorkFlow.Enqueue(TWorkData.Create(woClient,'LogOn',MsgID));
 

P.S. Никогда не пробовал этого, я использую классы в таких сценариях.

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

1. оба ответа верны и пригодны для использования 🙂 спасибо. К сожалению, я могу отметить только один ответ в качестве ответа.