Thank you for replying! The KUMatrix refers to a code giving by my professor, where should I adjust the coding?
onstructor TKUStringMatrix.Create(filename: String; delimiter: Char);
var
DataFile: TextFile;
len: Integer;
seencols: Integer;
item: _T;
i: Integer;
delimlist: TStringList;
begin
if not FileExists(filename) then
ShowError('TKUStringMatrix.Create: Matrix bestand bestaat niet', filename, 0, nil, true);
self.Create(0, 0);
ZeroMemory(@item, SizeOf(item));
len := 0;
seencols := 0;
SetLength(self.Items, len);
AssignFile(DataFile, FileName);
Reset(DataFile);
while not EOF(DataFile) do
begin
seencols := 0;
self.Rows := self.Rows + 1;
while not EOLN(DataFile) do
begin
read(DataFile, item);
delimlist := Split(item, delimiter);
for i := 0 to delimlist.Count-1 do
begin
seencols := seencols + 1;
len := len + 1;
SetLength(self.Items, len);
self.Items[len-1] := delimlist;
end;
end;
if self.Cols = 0 then
self.Cols := seencols
else if self.Cols <> seencols then
ShowError('TKUStringMatrix.Create: Matrix bestand bevat ongeldige lijn', filename, 0, nil, true);
readln(DataFile);
end;
CloseFile(DataFile);
if (self.Rows = 0) or (self.Cols = 0) then
begin
self.Rows := 0;
self.Cols := 0;
end;
end;
constructor TKUMatrix.Create(nrrows: Integer; nrcols: Integer);
var item :_T;
begin
ZeroMemory(@item, SizeOf(item));
self.Create(nrrows, nrcols, item);
end;
constructor TKUMatrix.Create(nrrowsorcols : Integer);
begin
self.Create(1,nrrowsorcols);
end;
constructor TKUMatrix.Create(nrrows: Integer; nrcols: Integer; value: _T);
var r, c: Integer;
begin
self.Rows := nrrows;
self.Cols := nrcols;
SetLength(self.Items, nrrows * nrcols);
for r := 1 to self.NrRows() do
for c := 1 to self.NrCols() do
self.SetCell(r, c, value);
end;
function TKUMatrix.IsEqual(othermatrix: TKUMatrix): Boolean;
var
r, c: Integer;
begin
{ Should use Equals() override here but type equality checking is hard... }
result := true;
if othermatrix = nil then result := false
else if self.nrrows <> othermatrix.nrrows then result := false
else if self.nrcols <> othermatrix.nrcols then result := false
else
begin
for r := 1 to self.NrRows() do
begin
for c := 1 to self.NrCols() do
begin
if self.getcell(r,c) <> othermatrix.getcell(r,c) then
begin
result := false;
break;
end;
if result = false then break;
end;
end;
end;
end;
function TKUMatrix.Copy(): TKUMatrix;
var r, c: Integer;
begin
result := TKUMatrix.Create(self.NrRows, self.NrCols);
for r := 1 to self.NrRows() do
for c := 1 to self.NrCols() do
result.SetCell(r, c, self.GetCell(r, c));
end;
function TKUMatrix.NrRows(): Integer;
begin
result := self.Rows;
end;
function TKUMatrix.NrCols(): Integer;
begin
result := self.Cols;
end;
procedure TKUMatrix.SetCell(row: Integer; col: Integer; value: _T);
var
pos: Integer;
begin
if (row < 1) or (row > self.NrRows) then
ShowError('TKUMatrix.SetCell: Ongeldig rijnummer', '', row, self, true);
if (col < 1) or (col > self.NrCols) then
ShowError('TKUMatrix.SetCell: Ongeldig kolomnummer', '', col, self, true);
pos := (row - 1) * self.NrCols() + col - 1;
self.Items[pos] := value;
end;
function TKUMatrix.GetCell(row: Integer; col: Integer): _T;
var
pos: Integer;
begin
if (row < 1) or (row > self.NrRows) then
ShowError('TKUMatrix.GetCell: Ongeldig rijnummer', '', row, self, true);
if (col < 1) or (col > self.NrCols) then
ShowError('TKUMatrix.GetCell: Ongeldig kolomnummer', '', col, self, true);
pos := (row - 1) * self.NrCols() + col - 1;
result := self.Items[pos];
end;
procedure TKUMatrix.SetCell(roworcol: Integer; value: _T);
begin
if (self.NrRows > 1) and (self.NrCols > 1) then
ShowError('TKUMatrix.SetCell: Deze matrix is geen vector (geef rij en kolom mee)', '', roworcol, self, true);
if self.NrRows = 1 then self.SetCell(1, roworcol, value)
else self.SetCell(roworcol, 1, value);
end;
function TKUMatrix.GetCell(roworcol: Integer): _T;
begin
if (self.NrRows > 1) and (self.NrCols > 1) then
ShowError('TKUMatrix.SetCell: Deze matrix is geen vector (geef rij en kolom mee)', '', roworcol, self, true);
if self.NrRows = 1 then result := self.GetCell(1, roworcol)
else result := self.GetCell(roworcol, 1);
end;
procedure TKUMatrix.SwapRows(row1, row2: Integer);
var
i: Integer;
begin
for i := 1 to self.NrCols do
begin
self.SwapCells(row1, i, row2, i);
end;
end;
procedure TKUMatrix.SwapCols(col1, col2: Integer);
var
i: Integer;
begin
for i := 1 to self.NrRows do
begin
self.SwapCells(i, col1, i, col2);
end;
end;
procedure TKUMatrix.SwapCells(row1, col1, row2, col2: Integer);
var
v: _T;
begin
v := self.GetCell(row1, col1);
self.SetCell(row1, col1, self.GetCell(row2, col2));
self.SetCell(row2, col2, v);
end;
procedure TKUMatrix.SwapCells(roworcol1, roworcol2: Integer);
var
v: _T;
begin
v := self.GetCell(roworcol1);
self.SetCell(roworcol1, self.GetCell(roworcol2));
self.SetCell(roworcol2, v);
end;
procedure TKUMatrix.Save(FileName: String);
var
DataFile: TextFile;
r, c: Integer;
begin
AssignFile(DataFile, FileName);
ReWrite(DataFile);
for r := 1 to self.NrRows() do
begin
for c := 1 to self.NrCols do
begin
write(DataFile, self.GetCell(r, c));
if (TypeInfo(_T) <> TypeInfo(Char)) and (c <> self.NrCols) then
write(DataFile, #9);
end;
writeln(DataFile);
end;
CloseFile(DataFile);
end;
function TKUMatrix.ToStr(): String;
var
r, c: Integer;
begin
result := '';
result := result + ' ';
for c := 1 to self.NrCols do
result := result + ' | ' + Format('%5d', [c]);
result := result + #13 + #10;
result := result + '-----';
for c := 1 to self.NrCols do
result := result + '-+-' + '-----';
result := result + #13 + #10;
for r := 1 to self.NrRows do
begin
result := result + Format('%5d', [r]);
for c := 1 to self.NrCols do
begin
result := result + ' | ';
if TypeInfo(_T) = TypeInfo(Char) then result := result + ' ';
result := result + self.GenericFormat(self.GetCell(r, c));
end;
result := result + #13 + #10;
end;
result := result + #13 + #10;
end;
function TKUMatrix.ToShortStr(): String;
var
r, c: Integer;
begin
result := '';
for r := 1 to self.NrRows do
begin
for c := 1 to self.NrCols do
begin
result := result + self.GenericFormat(self.GetCell(r, c));
end;
result := result + #13 + #10;
end;
result := result + #13 + #10;
end;
procedure TKUMatrix.Show();
begin
write(self.ToStr());
end;
procedure TKUMatrix.ShowShort();
begin
write(self.ToShortStr());
end;
end.