Menu

[r660]: / trunk / Src / UNews.pas  Maximize  Restore  History

Download this file

287 lines (247 with data), 7.9 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
{
* UNews.pas
*
* Maintains a list of news items for display by program and reads list from
* formatted data stream.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is UNews.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2006-2010 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit UNews;
interface
uses
// Delphi
Classes,
// Project
UDataStreamIO, ULists;
type
{
TNewsItem:
Encapsulates a news item. Provides properties to describe it and a means
of creating object from a formatted data stream.
}
TNewsItem = class(TObject)
strict private
var
fId: SmallInt; // Value of Id property
fDate: TDateTime; // Value of Date property
fHTML: string; // Value of HTML property
public
constructor Create(const Reader: TDataStreamReader);
{Class constructor. Creates news item object from a data stream.
@param Reader [in] Object used to read/parse data stream.
}
property Id: SmallInt read fId;
{Unique identifier of news item}
property Date: TDateTime read fDate;
{Date news item published}
property HTML: string read fHTML;
{News item content as HTML}
end;
{
TNews:
Stores news items for display in application. Parses news items from a
data stream supplied to constructor.
}
TNews = class(TObject)
strict private
type
TEnumerator = class(TObject)
strict private
var
fNews: TNews; // Reference to object being enumerated
fIndex: Integer; // Index of current object in enumeration
public
constructor Create(const News: TNews);
{Class constructor. Initialises enumeration.
@param News [in] Object to be enurmerated.
}
function GetCurrent: TNewsItem;
{Gets current news item.
@return Required name.
}
function MoveNext: Boolean;
{Moves to next item in enumeration.
@return True if there is a next item, False if beyond last item.
}
property Current: TNewsItem read GetCurrent;
{Current news item}
end;
var
fNewsItems: TObjectListEx; // Stores list of news items
procedure Parse(const NewsData: TStream);
{Creates list of news items from a data stream.
@param NewsData [in] Data stream containing news items.
}
function GetCount: Integer;
{Read accessor for Count property.
@return Number of news items in list.
}
function GetItem(Idx: Integer): TNewsItem;
{Read accessor for Items[] property.
@param Idx [in] Index of required item.
@return Requested news item.
}
public
constructor Create(const NewsData: TStream);
{Class constructor. Creates list of news items described by a data stream.
@param NewsData [in] Stream containing news items.
}
destructor Destroy; override;
{Class destructor. Tears down object.
}
function GetEnumerator: TEnumerator;
{Creates an enumerator for this object.
@return Reference to new enumerator. Caller is repsonsible for freeing
this object.
}
property Count: Integer read GetCount;
{Number of news items in list}
property Items[Idx: Integer]: TNewsItem read GetItem; default;
{Array of news items}
end;
implementation
uses
// Delphi
SysUtils,
// Project
UUtils;
{
News data stream format
-----------------------
Stream compriises text characters. Numbers are encoded in hex format.
File format is:
Item-count: SmallInt - number of news items in stream
followed by Item-count news item records:
Id: SmallInt - unique item identifier
Date: SizedString - publication date as MySQL date (YYYY-MM-DD)
Content: SizedString - news item content as HTML
Data types are:
SmallInt - 16 bit integer encoded as 4 hex digits
SizedString - SmallInt specifying string length followed by specified
number of characters
}
{ TNews }
constructor TNews.Create(const NewsData: TStream);
{Class constructor. Creates list of news items described by a data stream.
@param NewsData [in] Stream containing news items.
}
begin
inherited Create;
fNewsItems := TObjectListEx.Create(True);
Parse(NewsData);
end;
destructor TNews.Destroy;
{Class destructor. Tears down object.
}
begin
FreeAndNil(fNewsItems); // frees news items in list
inherited;
end;
function TNews.GetCount: Integer;
{Read accessor for Count property.
@return Number of news items in list.
}
begin
Result := fNewsItems.Count;
end;
function TNews.GetEnumerator: TEnumerator;
{Creates an enumerator for this object.
@return Reference to new enumerator. Caller is repsonsible for freeing this
object.
}
begin
Result := TEnumerator.Create(Self);
end;
function TNews.GetItem(Idx: Integer): TNewsItem;
{Read accessor for Items[] property.
@param Idx [in] Index of required item.
@return Requested news item.
}
begin
Result := fNewsItems[Idx] as TNewsItem;
end;
procedure TNews.Parse(const NewsData: TStream);
{Creates list of news items from a data stream.
@param NewsData [in] Data stream containing news items.
}
var
Reader: TDataStreamReader; // object used to interpret data stream
NumItems: SmallInt; // number of news items to create
Idx: Integer; // loops thru news items
begin
Reader := TDataStreamReader.Create(NewsData);
try
// Get number of items in data stream
NumItems := Reader.ReadSmallInt;
// Create required number of news items from stream
for Idx := 1 to NumItems do
fNewsItems.Add(TNewsItem.Create(Reader))
finally
FreeAndNil(Reader);
end;
end;
{ TNews.TEnumerator }
constructor TNews.TEnumerator.Create(const News: TNews);
{Class constructor. Initialises enumeration.
@param News [in] Object to be enurmerated.
}
begin
inherited Create;
fIndex := -1;
fNews := News;
end;
function TNews.TEnumerator.GetCurrent: TNewsItem;
{Gets current news item.
@return Required name.
}
begin
Result := fNews[fIndex];
end;
function TNews.TEnumerator.MoveNext: Boolean;
{Moves to next item in enumeration.
@return True if there is a next item, False if beyond last item.
}
begin
Result := fIndex < Pred(fNews.Count);
if Result then
Inc(fIndex);
end;
{ TNewsItem }
constructor TNewsItem.Create(const Reader: TDataStreamReader);
{Class constructor. Creates news item object from a data stream.
@param Reader [in] Object used to read/parse data stream.
}
begin
inherited Create;
// Get property values from stream. Order is important
fId := Reader.ReadSmallInt;
fDate := MySQLDateToDateTime(string(Reader.ReadSizedString));
fHTML := string(Reader.ReadSizedString);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.