Delphi中TQueue<TWorkData>泛型队列如何直接传参入队记录类型
解决方案
该需求完全可以实现,以下是三种常用实现方式:
方案1:给记录添加参数化构造函数(最通用规范)
Delphi 2006及以上版本支持记录定义带参数的构造函数,你可以修改TWorkData的定义:
type TWorkOwner = (woClient,woServer); TWorkData = record Owner : TWorkOwner; AMessage : string; MsgID : integer; // 新增参数化构造函数 constructor Create(AOwner: TWorkOwner; const AMessageStr: string; AMsgID: Integer); end; // 构造函数实现 constructor TWorkData.Create(AOwner: TWorkOwner; const AMessageStr: string; AMsgID: Integer); begin Owner := AOwner; AMessage := AMessageStr; MsgID := AMsgID; end;
入队时直接调用构造函数即可,写法和你预期的非常接近:
WorkFlow.Enqueue(TWorkData.Create(woClient, 'LogOn', MsgID));
方案2:封装辅助入队方法(完全匹配你想要的调用写法)
如果你不想修改原有TWorkData的定义,可以在当前类中封装一个私有辅助方法:
// 类的私有段新增方法声明 procedure EnqueueWorkItem(AOwner: TWorkOwner; const AMessage: string; AMsgID: Integer); // 方法实现 procedure T你的类名.EnqueueWorkItem(AOwner: TWorkOwner; const AMessage: string; AMsgID: Integer); var LWorkData: TWorkData; begin LWorkData.Owner := AOwner; LWorkData.AMessage := AMessage; LWorkData.MsgID := AMsgID; WorkFlow.Enqueue(LWorkData); end;
调用时完全符合你给出的伪代码写法:
EnqueueWorkItem(woClient, 'LogOn', MsgID);
方案3:用内联记录常量赋值(无需修改现有定义,适合高版本Delphi)
如果你使用的是Delphi 10.3 Rio及以上版本,支持内联变量和记录常量的简化写法,可以直接写:
WorkFlow.Enqueue( ( Owner: woClient; AMessage: 'LogOn'; MsgID: MsgID ) );
这种方式不需要额外新增构造函数或者辅助方法,直接在入队时完成记录字段赋值。
内容的提问来源于stack exchange,提问作者user1937012
相关产品推荐
相关产品推荐

