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 |