Subversion Repositories delphiutils

Rev

Rev 93 | Rev 95 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 93 Rev 94
Line 1... Line 1...
1
unit AsciiTable;
1
unit AsciiTable;
2
 
2
 
-
 
3
// Download:
-
 
4
// https://github.com/danielmarschall/delphiutils/blob/master/Units/AsciiTable.pas
-
 
5
 
3
(*
6
(*
4
 * ASCII Table and CSV Generator Delphi Unit
7
 * ASCII Table and CSV Generator Delphi Unit
5
 * Revision 2022-07-15
8
 * Revision 2023-12-08
6
 *
9
 *
7
 * (C) 2022 Daniel Marschall, HickelSOFT, ViaThinkSoft
10
 * (C) 2022 Daniel Marschall, HickelSOFT, ViaThinkSoft
8
 * Licensed under the terms of Apache 2.0
11
 * Licensed under the terms of Apache 2.0
9
 *)
12
 *)
10
 
13
 
Line 19... Line 22...
19
var
22
var
20
  VirtTable: TVtsAsciiTable;
23
  VirtTable: TVtsAsciiTable;
21
  objLine: TVtsAsciiTableLine;
24
  objLine: TVtsAsciiTableLine;
22
begin
25
begin
23
  VirtTable := TVtsAsciiTable.Create(true);
26
  VirtTable := TVtsAsciiTable.Create(true);
24
  VirtTable.Clear;
27
  try
25
 
-
 
26
  // Create Test data
-
 
27
  objLine := TVtsAsciiTableLine.Create;
-
 
28
  objLine.SetVal(0, 'Fruit', taCenter);
-
 
29
  objLine.SetVal(1, 'Amount', taCenter);
-
 
30
  VirtTable.Add(objLine);
-
 
31
 
-
 
32
  VirtTable.AddSeparator;
-
 
33
 
-
 
34
  objLine := TVtsAsciiTableLine.Create;
-
 
35
  objLine.SetVal(0, 'Apple', taLeftJustify);
-
 
36
  objLine.SetVal(1, '123', taRightJustify);
-
 
37
  VirtTable.Add(objLine);
-
 
38
 
-
 
39
  objLine := TVtsAsciiTableLine.Create;
-
 
40
  objLine.SetVal(0, 'Kiwi', taLeftJustify);
-
 
41
  objLine.SetVal(1, '1', taRightJustify);
-
 
42
  VirtTable.Add(objLine);
-
 
43
 
-
 
44
  objLine := TVtsAsciiTableLine.Create;
-
 
45
  objLine.SetVal(0, 'Asparagus (green)', taLeftJustify);
-
 
46
  objLine.SetVal(1, '9999', taRightJustify);
-
 
47
  VirtTable.Add(objLine);
-
 
48
 
-
 
49
  objLine := TVtsAsciiTableLine.Create;
-
 
50
  objLine.SetVal(0, 'Asparagus (white)', taLeftJustify);
-
 
51
  objLine.SetVal(1, '999', taRightJustify);
-
 
52
  VirtTable.Add(objLine);
-
 
53
 
-
 
54
  VirtTable.AddSeparator;
28
    VirtTable.Clear;
55
  VirtTable.AddSumLine;
-
 
56
 
-
 
57
  // Create ASCII table
-
 
58
  Memo1.Clear;
-
 
59
  VirtTable.GetASCIITable(Memo1.Lines);
-
 
60
 
-
 
61
  // Save ASCII table
-
 
62
  VirtTable.SaveASCIITable('Order.txt');
-
 
63
 
-
 
64
  // Create CSV
-
 
65
  Memo2.Clear;
-
 
66
  VirtTable.GetCSV(Memo2.Lines);
-
 
67
 
29
 
-
 
30
    // Create Test data
-
 
31
    objLine := TVtsAsciiTableLine.Create;
-
 
32
    objLine.SetVal(0, 'Fruit', taCenter);
-
 
33
    objLine.SetVal(1, 'Amount', taCenter);
-
 
34
    VirtTable.Add(objLine);
-
 
35
 
-
 
36
    VirtTable.AddSeparator;
-
 
37
 
-
 
38
    objLine := TVtsAsciiTableLine.Create;
-
 
39
    objLine.SetVal(0, 'Apple', taLeftJustify);
-
 
40
    objLine.SetVal(1, '123', taRightJustify);
-
 
41
    VirtTable.Add(objLine);
-
 
42
 
-
 
43
    objLine := TVtsAsciiTableLine.Create;
-
 
44
    objLine.SetVal(0, 'Kiwi', taLeftJustify);
-
 
45
    objLine.SetVal(1, '1', taRightJustify);
-
 
46
    VirtTable.Add(objLine);
-
 
47
 
-
 
48
    objLine := TVtsAsciiTableLine.Create;
-
 
49
    objLine.SetVal(0, 'Asparagus (green)', taLeftJustify);
-
 
50
    objLine.SetVal(1, '9999', taRightJustify);
-
 
51
    VirtTable.Add(objLine);
-
 
52
 
-
 
53
    objLine := TVtsAsciiTableLine.Create;
-
 
54
    objLine.SetVal(0, 'Asparagus (white)', taLeftJustify);
-
 
55
    objLine.SetVal(1, '999', taRightJustify);
-
 
56
    VirtTable.Add(objLine);
-
 
57
 
-
 
58
    VirtTable.AddSeparator;
-
 
59
    VirtTable.AddSumLine;
-
 
60
 
-
 
61
    // Create ASCII table
-
 
62
    Memo1.Clear;
-
 
63
    VirtTable.GetASCIITable(Memo1.Lines);
-
 
64
 
-
 
65
    // Save ASCII table
-
 
66
    VirtTable.SaveASCIITable('Order.txt');
-
 
67
 
68
  // Save CSV
68
    // Create CSV
-
 
69
    Memo2.Clear;
69
  VirtTable.SaveCSV('Order.csv');
70
    VirtTable.GetCSV(Memo2.Lines);
70
 
71
 
-
 
72
    // Save CSV
71
  VirtTable.Free;
73
    VirtTable.SaveCSV('Order.csv');
-
 
74
  finally
-
 
75
    FreeAndNil(VirtTable);
-
 
76
  end;
72
end;
77
end;
73
 
78
 
74
}
79
}
75
 
80
 
76
interface
81
interface
Line 97... Line 102...
97
  end;
102
  end;
98
 
103
 
99
  TVtsAsciiTableAnalysis = record
104
  TVtsAsciiTableAnalysis = record
100
    MaxLen: array[0..VTS_ASCII_TABLE_COLS-1] of integer;
105
    MaxLen: array[0..VTS_ASCII_TABLE_COLS-1] of integer;
101
    Used: array[0..VTS_ASCII_TABLE_COLS-1] of boolean;
106
    Used: array[0..VTS_ASCII_TABLE_COLS-1] of boolean;
102
    Sum: array[0..VTS_ASCII_TABLE_COLS-1] of integer;
107
    Sum: array[0..VTS_ASCII_TABLE_COLS-1] of extended;
103
  end;
108
  end;
104
 
109
 
105
  TVtsAsciiTable = class(TObjectList{<TVtsAsciiTableLine>})
110
  TVtsAsciiTable = class(TObjectList{<TVtsAsciiTableLine>})
106
  private
111
  private
107
    function GetItem(Index: Integer): TVtsAsciiTableLine;
112
    function GetItem(Index: Integer): TVtsAsciiTableLine;
Line 123... Line 128...
123
    procedure Insert(Index: Integer; AObject: TVtsAsciiTableLine); reintroduce;
128
    procedure Insert(Index: Integer; AObject: TVtsAsciiTableLine); reintroduce;
124
  end;
129
  end;
125
 
130
 
126
implementation
131
implementation
127
 
132
 
-
 
133
uses
-
 
134
  Math;
-
 
135
 
128
{ TVtsAsciiTable }
136
{ TVtsAsciiTable }
129
 
137
 
130
function TVtsAsciiTable.Add(AObject: TVtsAsciiTableLine): Integer;
138
function TVtsAsciiTable.Add(AObject: TVtsAsciiTableLine): Integer;
131
begin
139
begin
132
  result := Inherited Add(AObject);
140
  result := Inherited Add(AObject);
Line 150... Line 158...
150
  found := false;
158
  found := false;
151
  for j := 0 to VTS_ASCII_TABLE_COLS-1 do
159
  for j := 0 to VTS_ASCII_TABLE_COLS-1 do
152
  begin
160
  begin
153
    if analysis.Sum[j] <> 0 then
161
    if analysis.Sum[j] <> 0 then
154
    begin
162
    begin
155
      objLine.SetVal(j, IntToStr(analysis.Sum[j]), taRightJustify, ' ');
163
      objLine.SetVal(j, FloatToStr(RoundTo(analysis.Sum[j],2)), taRightJustify, ' ');
156
      found := true;
164
      found := true;
157
    end;
165
    end;
158
  end;
166
  end;
159
  if found then
167
  if found then
160
    Inherited Add(objLine)
168
    Inherited Add(objLine)
161
  else
169
  else
162
    objLine.Free;
170
    FreeAndNil(objLine);
163
end;
171
end;
164
 
172
 
165
function TVtsAsciiTable.GetAnalysis: TVtsAsciiTableAnalysis;
173
function TVtsAsciiTable.GetAnalysis: TVtsAsciiTableAnalysis;
166
var
174
var
167
  j: Integer;
175
  j: Integer;
168
  i: Integer;
176
  i: Integer;
169
  objLine: TVtsAsciiTableLine;
177
  objLine: TVtsAsciiTableLine;
170
  len: Integer;
178
  len: Integer;
171
  itmp: integer;
179
  itmp: extended;
172
begin
180
begin
173
  for j := 0 to VTS_ASCII_TABLE_COLS-1 do
181
  for j := 0 to VTS_ASCII_TABLE_COLS-1 do
174
  begin
182
  begin
175
    result.MaxLen[j] := 0;
183
    result.MaxLen[j] := 0;
176
    result.Used[j] := false;
184
    result.Used[j] := false;
Line 182... Line 190...
182
    if objLine <> nil then
190
    if objLine <> nil then
183
    begin
191
    begin
184
      for j := 0 to VTS_ASCII_TABLE_COLS-1 do
192
      for j := 0 to VTS_ASCII_TABLE_COLS-1 do
185
      begin
193
      begin
186
        len := Length(objLine.Cont[j]);
194
        len := Length(objLine.Cont[j]);
187
        if TryStrToInt(objLine.Cont[j], itmp) and objLine.DoSum[j] then
195
        if TryStrToFloat(RoundTo(objLine.Cont[j],2), itmp) and objLine.DoSum[j] then
188
          result.Sum[j] := result.Sum[j] + itmp;
196
          result.Sum[j] := result.Sum[j] + itmp;
189
        if len > result.MaxLen[j] then
197
        if len > result.MaxLen[j] then
190
          result.MaxLen[j] := len;
198
          result.MaxLen[j] := len;
191
        if len > 0 then
199
        if len > 0 then
192
          result.Used[j] := true;
200
          result.Used[j] := true;
Line 390... Line 398...
390
  Self.Align[index] := AAlign;
398
  Self.Align[index] := AAlign;
391
  Self.PadChar[index] := APadChar;
399
  Self.PadChar[index] := APadChar;
392
  Self.DoSum[index] := ADoSum;
400
  Self.DoSum[index] := ADoSum;
393
end;
401
end;
394
 
402
 
395
end.
403
end.
396
 
404