Delphi:TList创建,内存错误
我试图创建3个TList,但在创建它们时出错Delphi:TList创建,内存错误,delphi,tlist,Delphi,Tlist,我试图创建3个TList,但在创建它们时出错 unit ipname; interface uses System.Generics.Collections; type IpNameData = class private ips : TList<String>; ports : TList<integer>; names : TList<String>; public procedure Add(ip:s
unit ipname;
interface
uses
System.Generics.Collections;
type
IpNameData = class
private
ips : TList<String>;
ports : TList<integer>;
names : TList<String>;
public
procedure Add(ip:string; port:integer; name:string);
procedure Del(ip:string; port:integer; name:string);
procedure Clear();
function GetName(i:integer):string;
function GetIp(i:integer):string;
function GetPort(i:integer):integer;
function GetSize(i:integer):integer;
published
constructor Create;
end;
implementation
constructor IpNameData.Create;
begin
ips := TList<String>.Create();
ports := TList<integer>.Create();
names := TList<String>.Create();
end;
...
我不知道我做错了什么:\
编辑
对我来说有点乱
但我有3个文件,ipname是上面的,第二个是名为ServerData的数据模块
unit ServerData;
interface
uses
System.SysUtils, System.Classes, IdBaseComponent, IdComponent,
IdCustomTCPServer, IdTCPServer, IdContext,FMX.Dialogs, ipname;
type
TDataModule2 = class(TDataModule)
TCPServer: TIdTCPServer;
procedure TCPServerConnect(AContext: TIdContext);
procedure TCPServerDisconnect(AContext: TIdContext);
procedure TCPServerExecute(AContext: TIdContext);
private
{ Private declarations }
procedure CMDToDo(cmd,ip:string; p:integer);
public
{ Public declarations }
Logs:TStrings;
IPs:TStrings;
Data : IpNameData;
procedure SendMSG(IP,msg : string; port : integer);
end;
var
DataModule2: TDataModule2;
最后一个是ServerGUI
unit ServerGUI;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
FMX.Memo, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit, FMX.ListBox;
type
TForm1 = class(TForm)
Options: TGroupBox;
Power: TSwitch;
PortField: TEdit;
Port_label: TLabel;
Power_label: TLabel;
LogM: TMemo;
Logs: TGroupBox;
IPBox: TListBox;
IPBox_label: TLabel;
LogM_label: TLabel;
procedure PowerSwitch(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses ServerData;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerData.DataModule2.Data.Create;
end;
我真的不知道应该在哪里调用构造函数,所以我在创建表单时调用了它 问题中的代码很好。错误的代码是调用构造函数的代码。我敢打赌它是这样写的:
var
Data: IpNameData;
....
Data.Create;
应改为:
Data := IpNameData.Create;
根据David的回复+评论,您应该替换
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerData.DataModule2.Data.Create;
end;
与
更新
IpNameData = class
private
ips : TList<String>;
ports : TList<integer>;
names : TList<String>;
改变
constructor IpNameData.Create;
begin
ips := TList<String>.Create();
ports := TList<integer>.Create();
names := TList<String>.Create();
end;
构造函数IpNameData.Create;
开始
ips:=TList.Create();
端口:=TList.Create();
名称:=TList.Create();
结束;
到
构造函数IpNameData.Create;
开始
继承创造;
ips:=TList.Create();
端口:=TList.Create();
名称:=TList.Create();
结束;
请随意为David的回复打上“复选标记”——我只是详细说明了他的回复。Create真的会被()调用吗?我已经多年没有编写Delphi代码了,但我想记住,您只需调用TList.Create;不带()。请显示调用IpNameData构造函数的代码。@Nidhoegger无所谓。
()
可以包含,也可以省略。您对问题的编辑证明了我的猜测是正确的。问题中的代码未能正确创建对象,与我回答中的代码相同。至于如何创建数据
,您在错误的位置创建了它。您的数据模块中需要一个重写的构造函数和析构函数来处理数据的生存期。您不应该从外部这样做。即使在这种情况下这不是错误,我也会调用IpNameData
构造函数中的Inherited
,以避免混淆。@LURD我同意。然后覆盖销毁
并销毁这三个列表。谢谢!我将尝试以下操作:)数据应该由数据模块创建和销毁
IpNameData = class
private
ips : TList<String>;
ports : TList<integer>;
names : TList<String>;
IpNameData = class
private
ips : TList<String>;
ports : TList<integer>;
names : TList<String>;
destructor Destroy; override;
destructor IpNameData.Destroy;
begin
ips.Free;
ports.Free;
Name.Free;
inherited Destroy;
end;
constructor IpNameData.Create;
begin
ips := TList<String>.Create();
ports := TList<integer>.Create();
names := TList<String>.Create();
end;
constructor IpNameData.Create;
begin
inherited Create;
ips := TList<String>.Create();
ports := TList<integer>.Create();
names := TList<String>.Create();
end;