source: oup/current/FileClasses/_DataTypes.pas@ 206

Last change on this file since 206 was 206, checked in by alloc, 18 years ago
File size: 11.8 KB
Line 
1unit _DataTypes;
2
3interface
4
5type
6 TDataField = class
7 private
8 FOffset: Integer;
9 FName: String;
10 FDescription: String;
11 FDataLength: Integer;
12 FParentFile: TObject;
13 FChanged: Boolean;
14 function GetValueAsString: String; virtual; abstract;
15 public
16 constructor Create(ParentFile: TObject; Offset: Integer;
17 Name, Description: String; ExtraArgs: Pointer); virtual;
18
19 procedure Update(Offset, Length: Integer); virtual; abstract;
20
21 property Offset: Integer read FOffset;
22 property Name: String read FName;
23 property Description: String read FDescription;
24 property DataLength: Integer read FDataLength;
25 property ValueAsString: String read GetValueAsString;
26 end;
27
28 TFieldType = class of TDataField;
29
30 TBlock = class(TDataField)
31 private
32 FDataFields: array of TDataField;
33 function GetFieldByOffset(Offset: Integer): TDataField;
34 function GetFieldByIndex(ID: Integer): TDataField;
35 function GetFieldCount: Integer;
36 public
37 // ExtraArgs: Pointer auf 2 Integer: Length+Count
38 constructor Create(ParentFile: TObject; Offset: Integer;
39 Name, Description: String; ExtraArgs: Pointer); override;
40 procedure Update(Offset, Length: Integer); override;
41 property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
42 property FieldByIndex[ID: Integer]: TDataField read GetFieldByIndex;
43 property FieldCount: Integer read GetFieldCount;
44
45 procedure AddField(fieldtype: TFieldType; Offset: Integer;
46 Name, Description: String; ExtraArgs: Pointer);
47 end;
48
49
50 TInt = class(TDataField)
51 private
52 FInt: Integer;
53 function GetValueAsString: String; override;
54 public
55 // ExtraArgs: Pointer auf Integer: Bytes of TInt
56 constructor Create(ParentFile: TObject; Offset: Integer;
57 Name, Description: String; ExtraArgs: Pointer); override;
58 procedure Update(Offset, Length: Integer); override;
59 end;
60
61
62 TLevelID = class(TDataField)
63 private
64 FLevelID: Integer;
65 function GetValueAsString: String; override;
66 public
67 // ExtraArgs: keine
68 constructor Create(ParentFile: TObject; Offset: Integer;
69 Name, Description: String; ExtraArgs: Pointer); override;
70 procedure Update(Offset, Length: Integer); override;
71 end;
72
73
74 TFileID = class(TDataField)
75 private
76 FFileID: Integer;
77 function GetValueAsString: String; override;
78 public
79 // ExtraArgs: keine
80 constructor Create(ParentFile: TObject; Offset: Integer;
81 Name, Description: String; ExtraArgs: Pointer); override;
82 procedure Update(Offset, Length: Integer); override;
83 end;
84
85
86 TLinkByID = class(TDataField)
87 private
88 FFileID: Integer;
89 FPosExts: String;
90 function GetValueAsString: String; override;
91 public
92 // ExtraArgs: Pointer auf String: Possible Exts
93 constructor Create(ParentFile: TObject; Offset: Integer;
94 Name, Description: String; ExtraArgs: Pointer); override;
95 procedure Update(Offset, Length: Integer); override;
96 end;
97
98
99 TString = class(TDataField)
100 private
101 FString: String;
102 function GetValueAsString: String; override;
103 public
104 // ExtraArgs: Pointer auf Integer: Length
105 constructor Create(ParentFile: TObject; Offset: Integer;
106 Name, Description: String; ExtraArgs: Pointer); override;
107 procedure Update(Offset, Length: Integer); override;
108 end;
109
110
111 TArray = class(TDataField)
112 private
113 FDataFields: array of TDataField;
114 function GetFieldByOffset(Offset: Integer): TDataField;
115 function GetFieldByIndex(ID: Integer): TDataField;
116 function GetFieldCount: Integer;
117 public
118 // ExtraArgs: Pointer auf 2 Integer: Length+Count
119 constructor Create(ParentFile: TObject; Offset: Integer;
120 Name, Description: String; ExtraArgs: Pointer); override;
121 procedure Update(Offset, Length: Integer); override;
122 property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
123 property FieldByIndex[ID: Integer]: TDataField read GetFieldByIndex;
124 property FieldCount: Integer read GetFieldCount;
125
126 procedure AddField(fieldtype: TFieldType; Offset: Integer;
127 Name, Description: String; ExtraArgs: Pointer);
128 end;
129
130
131 TRawLink = class(TDataField)
132 private
133 FRawAddress: Integer;
134 function GetValueAsString: String; override;
135 public
136 // ExtraArgs: keine
137 constructor Create(ParentFile: TObject; Offset: Integer;
138 Name, Description: String; ExtraArgs: Pointer); override;
139 procedure Update(Offset, Length: Integer); override;
140 end;
141
142
143 TUnused = class(TDataField)
144 private
145 function GetValueAsString: String; override;
146 public
147 // ExtraArgs: Pointer auf Integer: Length
148 constructor Create(ParentFile: TObject; Offset: Integer;
149 Name, Description: String; ExtraArgs: Pointer); override;
150 procedure Update(Offset, Length: Integer); override;
151 end;
152
153
154implementation
155
156uses
157 SysUtils, Dialogs, _FileTypes, Classes, ConnectionManager;
158
159
160{ TDataType }
161
162constructor TDataField.Create(ParentFile: TObject; Offset: Integer;
163 Name, Description: String; ExtraArgs: Pointer);
164begin
165 FOffset := Offset;
166 FName := Name;
167 FDescription := Description;
168 FParentFile := ParentFile;
169end;
170
171
172
173{ TInt32 }
174
175constructor TInt.Create(ParentFile: TObject; Offset: Integer;
176 Name, Description: String; ExtraArgs: Pointer);
177var
178 fstream: TMemoryStream;
179begin
180 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
181 FDataLength := Integer(ExtraArgs^);
182 FInt := 0;
183 fstream := TFile(ParentFile).FileStream;
184 fstream.Seek(Offset, soFromBeginning);
185 fstream.Read(FInt, FDataLength);
186end;
187
188function TInt.GetValueAsString: String;
189begin
190 Result := IntToStr(FInt);
191end;
192
193procedure TInt.Update(Offset, Length: Integer);
194begin
195 Exit;
196end;
197
198
199
200{ TString }
201
202constructor TString.Create(ParentFile: TObject; Offset: Integer;
203 Name, Description: String; ExtraArgs: Pointer);
204var
205 fstream: TMemoryStream;
206 i: Integer;
207begin
208 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
209 FDataLength := Integer(ExtraArgs^);
210 fstream := TFile(ParentFile).FileStream;
211 fstream.Seek(Offset, soFromBeginning);
212 SetLength(FString, FDataLength);
213 fstream.Read(FString[1], FDataLength);
214 for i := 1 to FDataLength do
215 if FString[i] = Chr(0) then
216 begin
217 SetLength(FString, i - 1);
218 Break;
219 end;
220end;
221
222function TString.GetValueAsString: String;
223begin
224 Result := FString;
225end;
226
227procedure TString.Update(Offset, Length: Integer);
228begin
229 Exit;
230end;
231
232
233
234{ TArray }
235
236procedure TArray.AddField(fieldtype: TFieldType; Offset: Integer;
237 Name, Description: String; ExtraArgs: Pointer);
238begin
239 Exit;
240end;
241
242constructor TArray.Create(ParentFile: TObject; Offset: Integer;
243 Name, Description: String; ExtraArgs: Pointer);
244begin
245 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
246end;
247
248function TArray.GetFieldByIndex(ID: Integer): TDataField;
249begin
250 if ID < Length(FDataFields) then
251 Result := FDataFields[ID]
252 else
253 Result := nil;
254end;
255
256function TArray.GetFieldByOffset(Offset: Integer): TDataField;
257var
258 i: Integer;
259begin
260 Result := nil;
261
262 if Length(FDataFields) > 0 then
263 begin
264 for i := 0 to High(FDataFields) do
265 if FDataFields[i].Offset = Offset then
266 break;
267 if i < Length(FDataFields) then
268 Result := FDataFields[i];
269 end;
270end;
271
272function TArray.GetFieldCount: Integer;
273begin
274 Result := Length(FDataFields);
275end;
276
277procedure TArray.Update(Offset, Length: Integer);
278begin
279 Exit;
280end;
281
282
283
284{ TBlock }
285
286procedure TBlock.AddField(fieldtype: TFieldType; Offset: Integer; Name,
287 Description: String; ExtraArgs: Pointer);
288var
289 i: Integer;
290begin
291 if Length(FDataFields) > 0 then
292 begin
293 for i := 0 to High(FDataFields) do
294 if FDataFields[i].FOffset = Offset then
295 Break;
296 if i < Length(FDataFields) then
297 begin
298 ShowMessage('Field exists');
299 Exit;
300 end;
301 end;
302 SetLength(FDataFields, Length(FDataFields) + 1);
303 FDataFields[High(FDataFields)] := TFieldType(fieldtype).Create(
304 FParentFile, Offset, Name, Description, ExtraArgs);
305end;
306
307constructor TBlock.Create(ParentFile: TObject; Offset: Integer;
308 Name, Description: String; ExtraArgs: Pointer);
309begin
310 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
311end;
312
313function TBlock.GetFieldByIndex(ID: Integer): TDataField;
314begin
315 Result := FDataFields[ID];
316end;
317
318function TBlock.GetFieldByOffset(Offset: Integer): TDataField;
319begin
320 Exit;
321end;
322
323function TBlock.GetFieldCount: Integer;
324begin
325 Result := Length(FDataFields);
326end;
327
328procedure TBlock.Update(Offset, Length: Integer);
329begin
330 Exit;
331end;
332
333
334
335{ TLevelID }
336
337constructor TLevelID.Create(ParentFile: TObject; Offset: Integer;
338 Name, Description: String; ExtraArgs: Pointer);
339var
340 fstream: TMemoryStream;
341begin
342 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
343 FDataLength := 4;
344 fstream := TFile(ParentFile).FileStream;
345 fstream.Seek(Offset, soFromBeginning);
346 fstream.Read(FLevelID, 4);
347 FLevelID := FLevelID div 256 div 256 div 256 div 2;
348end;
349
350function TLevelID.GetValueAsString: String;
351begin
352 Result := IntToStr(FLevelID);
353end;
354
355procedure TLevelID.Update(Offset, Length: Integer);
356begin
357 Exit;
358end;
359
360
361
362{ TFileID }
363
364constructor TFileID.Create(ParentFile: TObject; Offset: Integer;
365 Name, Description: String; ExtraArgs: Pointer);
366var
367 fstream: TMemoryStream;
368begin
369 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
370 FDataLength := 4;
371 fstream := TFile(ParentFile).FileStream;
372 fstream.Seek(Offset, soFromBeginning);
373 fstream.Read(FFileID, 4);
374 if FFileID > 0 then
375 FFileID := FFileID div 256
376 else
377 FFileID := -1;
378end;
379
380function TFileID.GetValueAsString: String;
381begin
382 Result := IntToStr(FFileID);
383end;
384
385procedure TFileID.Update(Offset, Length: Integer);
386begin
387 Exit;
388end;
389
390
391
392{ TLinkByID }
393
394constructor TLinkByID.Create(ParentFile: TObject; Offset: Integer; Name,
395 Description: String; ExtraArgs: Pointer);
396var
397 fstream: TMemoryStream;
398begin
399 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
400 FDataLength := 4;
401 FPosExts := String(ExtraArgs^);
402 fstream := TFile(ParentFile).FileStream;
403 fstream.Seek(Offset, soFromBeginning);
404 fstream.Read(FFileID, 4);
405 if FFileID > 0 then
406 FFileID := FFileID div 256
407 else
408 FFileID := -1;
409end;
410
411function TLinkByID.GetValueAsString: String;
412begin
413 Result := IntToStr(FFileID);
414end;
415
416procedure TLinkByID.Update(Offset, Length: Integer);
417begin
418 Exit;
419end;
420
421
422
423{ TRawLink }
424
425constructor TRawLink.Create(ParentFile: TObject; Offset: Integer; Name,
426 Description: String; ExtraArgs: Pointer);
427var
428 fstream: TMemoryStream;
429begin
430 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
431 FDataLength := 4;
432 fstream := TFile(ParentFile).FileStream;
433 fstream.Seek(Offset, soFromBeginning);
434 fstream.Read(FRawAddress, 4);
435end;
436
437function TRawLink.GetValueAsString: String;
438begin
439 Result := IntToStr(FRawAddress);
440end;
441
442procedure TRawLink.Update(Offset, Length: Integer);
443begin
444 Exit;
445end;
446
447
448
449{ TUnused }
450
451constructor TUnused.Create(ParentFile: TObject; Offset: Integer; Name,
452 Description: String; ExtraArgs: Pointer);
453begin
454 inherited Create(ParentFile, Offset, Name, Description, ExtraArgs);
455 FDataLength := Integer(ExtraArgs^);
456end;
457
458function TUnused.GetValueAsString: String;
459begin
460 Result := '';
461end;
462
463procedure TUnused.Update(Offset, Length: Integer);
464begin
465 Exit;
466end;
467
468end.
Note: See TracBrowser for help on using the repository browser.