gpt4 book ai didi

delphi - 这段代码中的构造函数不好。有人可以帮我管理这个代码吗?

转载 作者:行者123 更新时间:2023-12-02 17:06:02 25 4
gpt4 key购买 nike

我有一个项目、两个单元和主程序第一个单元在这里,这是该类的构造函数的主要问题:

unit dl_tPA_MailJournal;

interface
uses
Windows,
Generics.Collections,
SysUtils,
uInterfaces;
type
TtPA_MailJournal = class(TInterfacedObject ,ITable)
public
function GetanQId: integer;
procedure SetanQId(const Value: integer);
function GetadDate: TDateTime;
procedure SetadDate(const Value: TDateTime);

function toList: TList<string>;

constructor Create(aId : Integer; aDate : TDateTime);


private
property anQId : integer read GetanQId write SetanQId;
property adDate : TDateTime read GetadDate write SetadDate;


end;

implementation

{ TtPA_MailJournal }

constructor TtPA_MailJournal.Create(aId : Integer; aDate : TDateTime);
begin
SetanQId(aId);
SetadDate(aDate);
end;

function TtPA_MailJournal.GetadDate: TDateTime;
begin
Result := adDate;
end;

function TtPA_MailJournal.GetanQId: integer;
begin
Result := anQId ;
end;

procedure TtPA_MailJournal.SetadDate(const Value: TDateTime);
begin
adDate := Value;
end;

procedure TtPA_MailJournal.SetanQId(const Value: integer);
begin
anQId := Value;
end;
function TtPA_MailJournal.toList: TList<string>;
var aListTable: TList<TtPA_MailJournal>;
var aTable: TtPA_MailJournal;
var aListString: TList<String>;
begin
aTable.Create(1,now);
aListTable.Add(aTable);
aTable.Create(2,now);
aListTable.Add(aTable);
aListString.Add(aListTable.ToString);

Result := aListString;
end;
end.

第二个单元是一个界面,这里没什么可看的

unit uInterfaces; 

interface
uses Generics.Collections;
type

ITable = Interface
['{6CED8DCE-9CC7-491F-8D93-996BE8E4D388}']
function toList: TList<String>;
End;

implementation

end.

主类,在这里我想获取字符串列表泛型并放入网格中:

unit MainUnit;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
dl_tPA_MailJournal,uInterfaces, Vcl.StdCtrls,
Generics.Collections, Vcl.Grids;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var MyTable: TtPA_MailJournal;
MyList: TList<String>;
AStringList: TStrings;
StrDate : string;
Fmt: TFormatSettings;
begin

//fmt.ShortDateFormat:='dd/mm/yyyy';
// fmt.DateSeparator :='/';
// StrDate:='23/02/2011' ;


MyTable := TtPA_MailJournal.Create(1,now); //strtodate(strdate,fmt)

MyList := MyTable.toList;

AStringList := TStringList.Create;
AStringList.Add(MyList.ToString);
StringGrid1.Cols[1].Add(MyList.ToString);
FreeAndNil(MyTable);




end;

end.

当我单击按钮时,程序崩溃了。当我评论这两个的时候构造函数 SetanQId(aId) 的行;和 SetadDate(aDate);没关系我做错了什么有人可以告诉我如何管理此代码以在网格中显示。

最佳答案

声明属性不会为该属性分配任何存储空间。它只是一个指向值存储位置的指针。虽然您可以声明 getter 和 setter 函数来访问属性值,但最终属性值必须由某个字段支持。

TtPA_MailJournal = class(TInterfacedObject ,ITable)
public
FanId: integer;
FadDate: TDateTime;
function GetanQId: integer;
procedure SetanQId(const Value: integer);
function GetadDate: TDateTime;
procedure SetadDate(const Value: TDateTime);

function toList: TList<string>;

constructor Create(aId : Integer; aDate : TDateTime);
private
property anQId : integer read GetanQId write SetanQId;
property adDate : TDateTime read GetadDate write SetadDate;
end;

function TtPA_MailJournal.GetadDate: TDateTime;
begin
Result := FadDate;
end;

function TtPA_MailJournal.GetanQId: integer;
begin
Result := FanQId ;
end;

procedure TtPA_MailJournal.SetadDate(const Value: TDateTime);
begin
FadDate := Value;
end;

procedure TtPA_MailJournal.SetanQId(const Value: integer);
begin
FanQId := Value;
end;

如果您对 getter 和 setter 方法没有任何特殊需求,您可以声明您的属性以直接访问其存储字段:

  property anQId : integer read FanQId write FanQId;
property adDate : TDateTime read FadDate write FadDate;

此外,只有当您在 getter 和/或 setter 方法中实现了一些附加逻辑时,拥有私有(private)属性才有意义。在这种特殊情况下,它们没有多大意义,因此您可以完全删除属性声明,并直接使用字段。

constructor TtPA_MailJournal.Create(aId : Integer; aDate : TDateTime);
begin
inherited Create;
FanQId := aId;
FadDate := aDate;
end;
<小时/>

首先您需要初始化 Result 和 aListTable 变量。那么您以错误的方式使用构造函数而不是 aTable.Create(1, now) 您应该使用 aTable := TtPA_MailJournal.Create(1,now)

这里遇到的另一个问题是,您混合了对象和接口(interface)引用,从而泄漏了对象。因此,您应该使用 ITable 来存储对 TtPA_MailJournal 对象实例的引用。

function TtPA_MailJournal.toList: TList<string>;
var
aListTable: TList<ITable>;
aTable: ITable;
begin
Result := TList<String>.Create;
try
aListTable := TList<ITable>.Create;
aTable := TtPA_MailJournal.Create(1,now);
aListTable.Add(aTable);

aTable := TtPA_MailJournal.Create(2,now);
aListTable.Add(aTable);
Result.Add(aListTable.ToString);
finally
aListTable.Free;
end;
end;

使用完 MyList 对象后,您还应该释放它,否则会泄漏内存。

关于delphi - 这段代码中的构造函数不好。有人可以帮我管理这个代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32033603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com