This is a companion to my previous question on oject lists. This one however attempts to use a different approach to reading a list of objects. It has a problem that I can't figure out.
This demo program is built from two units. (Most of the main unit is display.)
Here's the main unit:
unit MainFormUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, InsUnit, fgl;
type
TInsList = specialize TFPGObjectList<TIns>;
type
{ TForm1 }
TForm1 = class(TForm)
ShowListButton: TButton;
ShowObjectsButton: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure ShowListButtonClick(Sender: TObject);
procedure ShowObjectsButtonClick(Sender: TObject);
private
public
end;
const
I_NUM_ENTRIES : integer = 4;
var
Form1: TForm1;
InsList : TInsList;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ShowObjectsButtonClick(Sender: TObject);
var
i : integer = 0;
InsObj : TIns;
begin
InsList := TInsList.Create;
for i := 0 to I_NUM_ENTRIES do
begin
InsObj := TIns.Create;
InsObj.Init();
InsObj.RunTimeInsNumber := i;
InsObj.InsSerial := 'testSerialNum' + IntToStr(i);
InsObj.InsName := 'Name ' + IntToStr(i);
InsList.add(InsObj);
Memo1.Lines.Add(IntToStr(InsObj.RunTimeInsNumber));
Memo1.Lines.Add(InsObj.InsSerial);
Memo1.Lines.Add(InsObj.InsName);
Memo1.Lines.Add(' ');
InsObj.Free;
end;
ShowListButton.Enabled:=true;
end;
procedure TForm1.ShowListButtonClick(Sender: TObject);
var
i : integer = 0;
InsObj : TIns;
var p : pointer;
begin
i := InsList.Count;
Memo1.Lines.Add('--------------- ');
Memo1.Lines.Add('Items from list ');
Memo1.Lines.Add('--------------- ');
Memo1.Lines.Add(' ');
for i := 0 to I_NUM_ENTRIES do
begin
InsObj := TIns.Create;
InsObj.Init();
InsObj.RunTimeInsNumber:= InsList[i].RunTimeInsNumber;
InsObj.InsSerial := InsList[i].InsSerial;
InsObj.InsName:=InsList[i].InsName;
Memo1.Lines.Add(IntToStr(InsObj.RunTimeInsNumber));
Memo1.Lines.Add(InsObj.InsSerial);
Memo1.Lines.Add(InsObj.InsName);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowListButton.Enabled:=false;
end;
end.
Here's the unit that contains the class from which I want to build a list:
unit InsUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
TIns = Class
public
RunTimeInsNumber : integer;
SortOrderInsNumber : integer;
InsName : string;
InsSerial : string;
DBFeatureStr : string;
constructor Init();
private const
defaultSpecLoad = 'Testing Private';
public
const SpecDefaults = 'test';
end;
implementation
constructor TIns.Init();
begin
RuntimeInsNumber := 0;
SortOrderInsNumber :=0;
InsName :='';
InsSerial :='';
DBFeatureStr :='';
end;
end.
The program dies on the line
InsObj.InsSerial := InsList.InsSerial; in the section that attempts to display the values after they've been loaded to the list. I'm guessing this is a pointer/value problem but I don't get why or how to get this demo to work.
If it would help, I can upload the entire project. Let me know how to so/what you'd prefer if you're interested.
EDIT: Ooops, this throws the SIGSEGV error with stack trace.
Thanks in advance.