Index: oup/current/FileClasses/ABNA.pas
===================================================================
--- oup/current/FileClasses/ABNA.pas	(revision 232)
+++ oup/current/FileClasses/ABNA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AGDB.pas
===================================================================
--- oup/current/FileClasses/AGDB.pas	(revision 232)
+++ oup/current/FileClasses/AGDB.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AGQC.pas
===================================================================
--- oup/current/FileClasses/AGQC.pas	(revision 232)
+++ oup/current/FileClasses/AGQC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AGQG.pas
===================================================================
--- oup/current/FileClasses/AGQG.pas	(revision 232)
+++ oup/current/FileClasses/AGQG.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AGQM.pas
===================================================================
--- oup/current/FileClasses/AGQM.pas	(revision 232)
+++ oup/current/FileClasses/AGQM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AGQR.pas
===================================================================
--- oup/current/FileClasses/AGQR.pas	(revision 232)
+++ oup/current/FileClasses/AGQR.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AISA.pas
===================================================================
--- oup/current/FileClasses/AISA.pas	(revision 232)
+++ oup/current/FileClasses/AISA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AITR.pas
===================================================================
--- oup/current/FileClasses/AITR.pas	(revision 232)
+++ oup/current/FileClasses/AITR.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AIWA.pas
===================================================================
--- oup/current/FileClasses/AIWA.pas	(revision 232)
+++ oup/current/FileClasses/AIWA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKAA.pas
===================================================================
--- oup/current/FileClasses/AKAA.pas	(revision 232)
+++ oup/current/FileClasses/AKAA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKBA.pas
===================================================================
--- oup/current/FileClasses/AKBA.pas	(revision 232)
+++ oup/current/FileClasses/AKBA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKBP.pas
===================================================================
--- oup/current/FileClasses/AKBP.pas	(revision 232)
+++ oup/current/FileClasses/AKBP.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKDA.pas
===================================================================
--- oup/current/FileClasses/AKDA.pas	(revision 232)
+++ oup/current/FileClasses/AKDA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKEV.pas
===================================================================
--- oup/current/FileClasses/AKEV.pas	(revision 232)
+++ oup/current/FileClasses/AKEV.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKOT.pas
===================================================================
--- oup/current/FileClasses/AKOT.pas	(revision 232)
+++ oup/current/FileClasses/AKOT.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/AKVA.pas
===================================================================
--- oup/current/FileClasses/AKVA.pas	(revision 232)
+++ oup/current/FileClasses/AKVA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/BINA.pas
===================================================================
--- oup/current/FileClasses/BINA.pas	(revision 232)
+++ oup/current/FileClasses/BINA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/CBPI.pas
===================================================================
--- oup/current/FileClasses/CBPI.pas	(revision 232)
+++ oup/current/FileClasses/CBPI.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/CBPM.pas
===================================================================
--- oup/current/FileClasses/CBPM.pas	(revision 232)
+++ oup/current/FileClasses/CBPM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/CONS.pas
===================================================================
--- oup/current/FileClasses/CONS.pas	(revision 232)
+++ oup/current/FileClasses/CONS.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/CRSA.pas
===================================================================
--- oup/current/FileClasses/CRSA.pas	(revision 232)
+++ oup/current/FileClasses/CRSA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/DOOR.pas
===================================================================
--- oup/current/FileClasses/DOOR.pas	(revision 232)
+++ oup/current/FileClasses/DOOR.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/DPge.pas
===================================================================
--- oup/current/FileClasses/DPge.pas	(revision 232)
+++ oup/current/FileClasses/DPge.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/EDIA.pas
===================================================================
--- oup/current/FileClasses/EDIA.pas	(revision 232)
+++ oup/current/FileClasses/EDIA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ENVP.pas
===================================================================
--- oup/current/FileClasses/ENVP.pas	(revision 232)
+++ oup/current/FileClasses/ENVP.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/FILM.pas
===================================================================
--- oup/current/FileClasses/FILM.pas	(revision 232)
+++ oup/current/FileClasses/FILM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/FXLR.pas
===================================================================
--- oup/current/FileClasses/FXLR.pas	(revision 232)
+++ oup/current/FileClasses/FXLR.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/GMAN.pas
===================================================================
--- oup/current/FileClasses/GMAN.pas	(revision 232)
+++ oup/current/FileClasses/GMAN.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/HPge.pas
===================================================================
--- oup/current/FileClasses/HPge.pas	(revision 232)
+++ oup/current/FileClasses/HPge.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IDXA.pas
===================================================================
--- oup/current/FileClasses/IDXA.pas	(revision 232)
+++ oup/current/FileClasses/IDXA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IGHH.pas
===================================================================
--- oup/current/FileClasses/IGHH.pas	(revision 232)
+++ oup/current/FileClasses/IGHH.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IGPA.pas
===================================================================
--- oup/current/FileClasses/IGPA.pas	(revision 232)
+++ oup/current/FileClasses/IGPA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IGPG.pas
===================================================================
--- oup/current/FileClasses/IGPG.pas	(revision 232)
+++ oup/current/FileClasses/IGPG.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IGSA.pas
===================================================================
--- oup/current/FileClasses/IGSA.pas	(revision 232)
+++ oup/current/FileClasses/IGSA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IGSt.pas
===================================================================
--- oup/current/FileClasses/IGSt.pas	(revision 232)
+++ oup/current/FileClasses/IGSt.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/IPge.pas
===================================================================
--- oup/current/FileClasses/IPge.pas	(revision 232)
+++ oup/current/FileClasses/IPge.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/Impt.pas
===================================================================
--- oup/current/FileClasses/Impt.pas	(revision 232)
+++ oup/current/FileClasses/Impt.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/KeyI.pas
===================================================================
--- oup/current/FileClasses/KeyI.pas	(revision 232)
+++ oup/current/FileClasses/KeyI.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/M3GA.pas
===================================================================
--- oup/current/FileClasses/M3GA.pas	(revision 232)
+++ oup/current/FileClasses/M3GA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/M3GM.pas
===================================================================
--- oup/current/FileClasses/M3GM.pas	(revision 232)
+++ oup/current/FileClasses/M3GM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/M3TA.pas
===================================================================
--- oup/current/FileClasses/M3TA.pas	(revision 232)
+++ oup/current/FileClasses/M3TA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/Mtrl.pas
===================================================================
--- oup/current/FileClasses/Mtrl.pas	(revision 232)
+++ oup/current/FileClasses/Mtrl.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/NMSA.pas
===================================================================
--- oup/current/FileClasses/NMSA.pas	(revision 232)
+++ oup/current/FileClasses/NMSA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OBAN.pas
===================================================================
--- oup/current/FileClasses/OBAN.pas	(revision 232)
+++ oup/current/FileClasses/OBAN.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OBDC.pas
===================================================================
--- oup/current/FileClasses/OBDC.pas	(revision 232)
+++ oup/current/FileClasses/OBDC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OBLS.pas
===================================================================
--- oup/current/FileClasses/OBLS.pas	(revision 232)
+++ oup/current/FileClasses/OBLS.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OBOA.pas
===================================================================
--- oup/current/FileClasses/OBOA.pas	(revision 232)
+++ oup/current/FileClasses/OBOA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OFGA.pas
===================================================================
--- oup/current/FileClasses/OFGA.pas	(revision 232)
+++ oup/current/FileClasses/OFGA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONCC.pas
===================================================================
--- oup/current/FileClasses/ONCC.pas	(revision 232)
+++ oup/current/FileClasses/ONCC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONCP.pas
===================================================================
--- oup/current/FileClasses/ONCP.pas	(revision 232)
+++ oup/current/FileClasses/ONCP.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONCV.pas
===================================================================
--- oup/current/FileClasses/ONCV.pas	(revision 232)
+++ oup/current/FileClasses/ONCV.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONFA.pas
===================================================================
--- oup/current/FileClasses/ONFA.pas	(revision 232)
+++ oup/current/FileClasses/ONFA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONGS.pas
===================================================================
--- oup/current/FileClasses/ONGS.pas	(revision 232)
+++ oup/current/FileClasses/ONGS.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONIA.pas
===================================================================
--- oup/current/FileClasses/ONIA.pas	(revision 232)
+++ oup/current/FileClasses/ONIA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONLD.pas
===================================================================
--- oup/current/FileClasses/ONLD.pas	(revision 232)
+++ oup/current/FileClasses/ONLD.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONLV.pas
===================================================================
--- oup/current/FileClasses/ONLV.pas	(revision 232)
+++ oup/current/FileClasses/ONLV.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONMA.pas
===================================================================
--- oup/current/FileClasses/ONMA.pas	(revision 232)
+++ oup/current/FileClasses/ONMA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONOA.pas
===================================================================
--- oup/current/FileClasses/ONOA.pas	(revision 232)
+++ oup/current/FileClasses/ONOA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONSA.pas
===================================================================
--- oup/current/FileClasses/ONSA.pas	(revision 232)
+++ oup/current/FileClasses/ONSA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONSK.pas
===================================================================
--- oup/current/FileClasses/ONSK.pas	(revision 232)
+++ oup/current/FileClasses/ONSK.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONTA.pas
===================================================================
--- oup/current/FileClasses/ONTA.pas	(revision 232)
+++ oup/current/FileClasses/ONTA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONVL.pas
===================================================================
--- oup/current/FileClasses/ONVL.pas	(revision 232)
+++ oup/current/FileClasses/ONVL.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/ONWC.pas
===================================================================
--- oup/current/FileClasses/ONWC.pas	(revision 232)
+++ oup/current/FileClasses/ONWC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OPge.pas
===================================================================
--- oup/current/FileClasses/OPge.pas	(revision 232)
+++ oup/current/FileClasses/OPge.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OSBD.pas
===================================================================
--- oup/current/FileClasses/OSBD.pas	(revision 232)
+++ oup/current/FileClasses/OSBD.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OTIT.pas
===================================================================
--- oup/current/FileClasses/OTIT.pas	(revision 232)
+++ oup/current/FileClasses/OTIT.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/OTLF.pas
===================================================================
--- oup/current/FileClasses/OTLF.pas	(revision 232)
+++ oup/current/FileClasses/OTLF.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/PLEA.pas
===================================================================
--- oup/current/FileClasses/PLEA.pas	(revision 232)
+++ oup/current/FileClasses/PLEA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/PNTA.pas
===================================================================
--- oup/current/FileClasses/PNTA.pas	(revision 232)
+++ oup/current/FileClasses/PNTA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/PSUI.pas
===================================================================
--- oup/current/FileClasses/PSUI.pas	(revision 232)
+++ oup/current/FileClasses/PSUI.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/PSpL.pas
===================================================================
--- oup/current/FileClasses/PSpL.pas	(revision 232)
+++ oup/current/FileClasses/PSpL.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/PSpc.pas
===================================================================
--- oup/current/FileClasses/PSpc.pas	(revision 232)
+++ oup/current/FileClasses/PSpc.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/QTNA.pas
===================================================================
--- oup/current/FileClasses/QTNA.pas	(revision 232)
+++ oup/current/FileClasses/QTNA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/QUDA.pas
===================================================================
--- oup/current/FileClasses/QUDA.pas	(revision 232)
+++ oup/current/FileClasses/QUDA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/SNDD.pas
===================================================================
--- oup/current/FileClasses/SNDD.pas	(revision 232)
+++ oup/current/FileClasses/SNDD.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/SUBT.pas
===================================================================
--- oup/current/FileClasses/SUBT.pas	(revision 232)
+++ oup/current/FileClasses/SUBT.pas	(revision 233)
@@ -16,5 +16,5 @@
 
 uses
-  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, StdCtrls;
+  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, StdCtrls, Grids;
 
 procedure TFile_SUBT.InitDataFields;
@@ -42,4 +42,6 @@
     end;
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
@@ -47,14 +49,10 @@
 procedure TFile_SUBT.InitEditor;
 var
-  lab: TLabel;
+  grid: TStringGrid;
 begin
   FEditor := TFrame.Create(nil);
-  lab := TLabel.Create(FEditor);
-  lab.Left := 0;
-  lab.Top := 0;
-  lab.Caption := 'Hello World';
-  FEditor.InsertControl(lab);
+  grid := TStringGrid.Create(FEditor);
+  grid.Parent := FEditor;
 end;
 
 end.
-
Index: oup/current/FileClasses/StNA.pas
===================================================================
--- oup/current/FileClasses/StNA.pas	(revision 232)
+++ oup/current/FileClasses/StNA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TMFA.pas
===================================================================
--- oup/current/FileClasses/TMFA.pas	(revision 232)
+++ oup/current/FileClasses/TMFA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TMRA.pas
===================================================================
--- oup/current/FileClasses/TMRA.pas	(revision 232)
+++ oup/current/FileClasses/TMRA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRAC.pas
===================================================================
--- oup/current/FileClasses/TRAC.pas	(revision 232)
+++ oup/current/FileClasses/TRAC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRAM.pas
===================================================================
--- oup/current/FileClasses/TRAM.pas	(revision 232)
+++ oup/current/FileClasses/TRAM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRAS.pas
===================================================================
--- oup/current/FileClasses/TRAS.pas	(revision 232)
+++ oup/current/FileClasses/TRAS.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRBS.pas
===================================================================
--- oup/current/FileClasses/TRBS.pas	(revision 232)
+++ oup/current/FileClasses/TRBS.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRCM.pas
===================================================================
--- oup/current/FileClasses/TRCM.pas	(revision 232)
+++ oup/current/FileClasses/TRCM.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRFT.pas
===================================================================
--- oup/current/FileClasses/TRFT.pas	(revision 232)
+++ oup/current/FileClasses/TRFT.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRGA.pas
===================================================================
--- oup/current/FileClasses/TRGA.pas	(revision 232)
+++ oup/current/FileClasses/TRGA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRGE.pas
===================================================================
--- oup/current/FileClasses/TRGE.pas	(revision 232)
+++ oup/current/FileClasses/TRGE.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRIA.pas
===================================================================
--- oup/current/FileClasses/TRIA.pas	(revision 232)
+++ oup/current/FileClasses/TRIA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRIG.pas
===================================================================
--- oup/current/FileClasses/TRIG.pas	(revision 232)
+++ oup/current/FileClasses/TRIG.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRMA.pas
===================================================================
--- oup/current/FileClasses/TRMA.pas	(revision 232)
+++ oup/current/FileClasses/TRMA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRSC.pas
===================================================================
--- oup/current/FileClasses/TRSC.pas	(revision 232)
+++ oup/current/FileClasses/TRSC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TRTA.pas
===================================================================
--- oup/current/FileClasses/TRTA.pas	(revision 232)
+++ oup/current/FileClasses/TRTA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TSFF.pas
===================================================================
--- oup/current/FileClasses/TSFF.pas	(revision 232)
+++ oup/current/FileClasses/TSFF.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TSFL.pas
===================================================================
--- oup/current/FileClasses/TSFL.pas	(revision 232)
+++ oup/current/FileClasses/TSFL.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TSFT.pas
===================================================================
--- oup/current/FileClasses/TSFT.pas	(revision 232)
+++ oup/current/FileClasses/TSFT.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TSGA.pas
===================================================================
--- oup/current/FileClasses/TSGA.pas	(revision 232)
+++ oup/current/FileClasses/TSGA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TStr.pas
===================================================================
--- oup/current/FileClasses/TStr.pas	(revision 232)
+++ oup/current/FileClasses/TStr.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TURR.pas
===================================================================
--- oup/current/FileClasses/TURR.pas	(revision 232)
+++ oup/current/FileClasses/TURR.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TXAN.pas
===================================================================
--- oup/current/FileClasses/TXAN.pas	(revision 232)
+++ oup/current/FileClasses/TXAN.pas	(revision 233)
@@ -20,4 +20,5 @@
 var
   tempi: Integer;
+  arrargs: TArrayArgs;
 begin
   inherited;
@@ -44,13 +45,15 @@
     AddField(TUnused, $1A, 'Unused', '', @tempi);
 
-    tempi := 2;
-    with AddField(TArray, $1C, 'AnimTextures array', '', @tempi) do
+    arrargs.CounterSize := 2;
+    arrargs.BlockLength := 4;
+    with AddField(TArray, $1C, 'AnimTextures array', '', @arrargs) do
     begin
       AddField(TLinkByID, $00, 'Texture', '', nil);
     end;
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TXCA.pas
===================================================================
--- oup/current/FileClasses/TXCA.pas	(revision 232)
+++ oup/current/FileClasses/TXCA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TXMA.pas
===================================================================
--- oup/current/FileClasses/TXMA.pas	(revision 232)
+++ oup/current/FileClasses/TXMA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TXMB.pas
===================================================================
--- oup/current/FileClasses/TXMB.pas	(revision 232)
+++ oup/current/FileClasses/TXMB.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TXMP.pas
===================================================================
--- oup/current/FileClasses/TXMP.pas	(revision 232)
+++ oup/current/FileClasses/TXMP.pas	(revision 233)
@@ -16,5 +16,5 @@
 
 uses
-  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, ExtCtrls, StdCtrls, 
+  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, ExtCtrls, StdCtrls,
   Controls, Forms;
 
@@ -105,4 +105,6 @@
   end;
   templist.Free;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
@@ -137,3 +139,2 @@
 
 end.
-
Index: oup/current/FileClasses/TXPC.pas
===================================================================
--- oup/current/FileClasses/TXPC.pas	(revision 232)
+++ oup/current/FileClasses/TXPC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/TxtC.pas
===================================================================
--- oup/current/FileClasses/TxtC.pas	(revision 232)
+++ oup/current/FileClasses/TxtC.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/UUEA.pas
===================================================================
--- oup/current/FileClasses/UUEA.pas	(revision 232)
+++ oup/current/FileClasses/UUEA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/UVDL.pas
===================================================================
--- oup/current/FileClasses/UVDL.pas	(revision 232)
+++ oup/current/FileClasses/UVDL.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/VCRA.pas
===================================================================
--- oup/current/FileClasses/VCRA.pas	(revision 232)
+++ oup/current/FileClasses/VCRA.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/WMCL.pas
===================================================================
--- oup/current/FileClasses/WMCL.pas	(revision 232)
+++ oup/current/FileClasses/WMCL.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/WMDD.pas
===================================================================
--- oup/current/FileClasses/WMDD.pas	(revision 232)
+++ oup/current/FileClasses/WMDD.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/WMMB.pas
===================================================================
--- oup/current/FileClasses/WMMB.pas	(revision 232)
+++ oup/current/FileClasses/WMMB.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/WMM_.pas
===================================================================
--- oup/current/FileClasses/WMM_.pas	(revision 232)
+++ oup/current/FileClasses/WMM_.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/WPge.pas
===================================================================
--- oup/current/FileClasses/WPge.pas	(revision 232)
+++ oup/current/FileClasses/WPge.pas	(revision 233)
@@ -28,7 +28,8 @@
     AddField(TLevelID, $04, 'LevelID', '', nil);
   end;
+  FFileStream.Free;
+  FFileStream := nil;
 end;
 
 
 end.
-
Index: oup/current/FileClasses/_DataTypes.pas
===================================================================
--- oup/current/FileClasses/_DataTypes.pas	(revision 232)
+++ oup/current/FileClasses/_DataTypes.pas	(revision 233)
@@ -4,8 +4,11 @@
 
 uses
-  Classes;
+  Classes, _TreeElement;
 
 type
-  TDataField = class
+  TDataField = class(TTreeElement)
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
     protected
       FOffset: Integer;
@@ -36,15 +39,14 @@
     private
       FDataFields: array of TDataField;
+      FBlockLength: Integer;
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
       function GetFieldByOffset(Offset: Integer): TDataField;
-      function GetFieldByIndex(ID: Integer): TDataField;
-      function GetFieldCount: Integer;
-    public
-      // ExtraArgs: keine
+    public
+      // ExtraArgs: Pointer auf Integer: BlockLength
       constructor Create(ParentFile: TObject; ParentField: TDataField;
           Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
       procedure Update(Offset, Length: Integer); override;
       property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
-      property FieldByIndex[ID: Integer]: TDataField read GetFieldByIndex;
-      property FieldCount: Integer read GetFieldCount;
 
       function AddField(fieldtype: TFieldType; Offset: Integer;
@@ -103,4 +105,6 @@
 
   TLinkByID = class(TDataField)
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
     private
       FFileID: Integer;
@@ -127,18 +131,20 @@
 
 
+  TArrayArgs = packed record
+    CounterSize: Integer;
+    BlockLength: Integer;
+    BlockCount:  Integer;
+  end;
   TArray = class(TDataField)
     private
-      FDataFields: array of TDataField;
+      FDataFields: array of TBlock;
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
       function GetFieldByOffset(Offset: Integer): TDataField;
-      function GetFieldByIndex(ID: Integer): TDataField;
-      function GetFieldCount: Integer;
-    public
-      // ExtraArgs: Pointer auf 2 Integer: Length+Count (packed record...)
-      constructor Create(ParentFile: TObject; ParentField: TDataField;
-          Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
-      procedure Update(Offset, Length: Integer); override;
-      property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
-      property FieldByIndex[ID: Integer]: TDataField read GetFieldByIndex;
-      property FieldCount: Integer read GetFieldCount;
+    public
+      // ExtraArgs: Pointer auf 3 Integer: CounterSize+Length+Count (packed record...)
+      constructor Create(ParentFile: TObject; ParentField: TDataField;
+          Offset: Integer; Name, Description: String; ExtraArgs: Pointer); override;
+      procedure Update(Offset, Length: Integer); override;
 
       function AddField(fieldtype: TFieldType; Offset: Integer;
@@ -190,4 +196,20 @@
   FParentFile := ParentFile;
   FParentField := ParentField;
+  FConnectionID := TFile(ParentFile).ConnectionID;
+end;
+
+function TDataField.GetCaption: String;
+begin
+  Result := FName;
+end;
+
+function TDataField.GetChild(ID: Integer): TTreeElement;
+begin
+  Result := nil;
+end;
+
+function TDataField.GetChildCount: Integer;
+begin
+  Result := 0;
 end;
 
@@ -265,35 +287,42 @@
 constructor TArray.Create(ParentFile: TObject; ParentField: TDataField;
     Offset: Integer; Name, Description: String; ExtraArgs: Pointer);
-begin
-  inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
-end;
-
-function TArray.GetFieldByIndex(ID: Integer): TDataField;
-begin
-  if ID < Length(FDataFields) then
-    Result := FDataFields[ID]
-  else
-    Result := nil;
-end;
-
-function TArray.GetFieldByOffset(Offset: Integer): TDataField;
 var
   i: Integer;
-begin
-  Result := nil;
-
+  args: TArrayArgs;
+  fstream: TMemoryStream;
+begin
+  inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
+  args := TArrayArgs(ExtraArgs^);
+  if args.CounterSize > 0 then
+  begin
+    fstream := TFile(ParentFile).FileStream;
+    fstream.Seek(Offset, soFromBeginning);
+    args.BlockCount := 0;
+    fstream.Read(args.BlockCount, args.CounterSize);
+  end;
+  SetLength(FDataFields, args.BlockCount);
   if Length(FDataFields) > 0 then
   begin
     for i := 0 to High(FDataFields) do
-      if FDataFields[i].Offset = Offset then
-        break;
-    if i < Length(FDataFields) then
-      Result := FDataFields[i];
-  end;
-end;
-
-function TArray.GetFieldCount: Integer;
+    begin
+      FDataFields[i] := TBlock.Create(ParentFile, Self,
+          Offset + args.CounterSize + i * args.BlockLength, Name+'['+IntToStr(i)+']', '', @args.BlockLength);
+    end;
+  end;
+end;
+
+function TArray.GetChildCount: Integer;
 begin
   Result := Length(FDataFields);
+end;
+
+function TArray.GetChild(ID: Integer): TTreeElement;
+begin
+  Result := FDataFields[ID];
+end;
+
+function TArray.GetFieldByOffset(Offset: Integer): TDataField;
+begin
+  Exit;
 end;
 
@@ -333,19 +362,23 @@
 begin
   inherited Create(ParentFile, ParentField, Offset, Name, Description, ExtraArgs);
-end;
-
-function TBlock.GetFieldByIndex(ID: Integer): TDataField;
+  if ExtraArgs <> nil then
+    FBlockLength := Integer(ExtraArgs^)
+  else
+    FBlockLength := -1;
+end;
+
+function TBlock.GetChild(ID: Integer): TTreeElement;
 begin
   Result := FDataFields[ID];
 end;
 
+function TBlock.GetChildCount: Integer;
+begin
+  Result := Length(FDataFields);
+end;
+
 function TBlock.GetFieldByOffset(Offset: Integer): TDataField;
 begin
   Exit;
-end;
-
-function TBlock.GetFieldCount: Integer;
-begin
-  Result := Length(FDataFields);
 end;
 
@@ -433,4 +466,20 @@
 end;
 
+function TLinkByID.GetChild(ID: Integer): TTreeElement;
+begin
+  if FFileID > 0 then
+    Result := ConManager.Connection[FConnectionID].MetaData.FileById[FFileID].Child[ID]
+  else
+    Result := nil;
+end;
+
+function TLinkByID.GetChildCount: Integer;
+begin
+  if FFileID > 0 then
+    Result := ConManager.Connection[FConnectionID].MetaData.FileById[FFileID].ChildCount
+  else
+    Result := 0;
+end;
+
 function TLinkByID.GetValueAsString: String;
 begin
Index: oup/current/FileClasses/_Extensions.pas
===================================================================
--- oup/current/FileClasses/_Extensions.pas	(revision 232)
+++ oup/current/FileClasses/_Extensions.pas	(revision 233)
@@ -4,24 +4,31 @@
 
 uses
-  _FileTypes;
+  _FileTypes, _TreeElement;
 
 type
-  TExtension = class
+  TExtension = class(TTreeElement)
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
     private
-      FConnectionID: Integer;
       FExt: String;
       FFiles: array of Integer;
-      function GetFile(ID: Integer): Integer;
-      function GetFileCount: Integer;
     public
       constructor Create(ConnectionID: Integer; Ext: String); virtual;
       procedure InitList;
-      property Ext: String read FExt;
-      property Files[ID: Integer]: Integer read GetFile;
-      property FileCount: Integer read GetFileCount;
   end;
 
-  TExtensions = array of TExtension;
-                      
+  TExtensions = class(TTreeElement)
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
+    private
+      FExtensions: array of TExtension;
+    public
+      constructor Create(DataAccess: TObject; ConnectionID: Integer);
+      function GetExt(Ext: String): TExtension;
+      procedure AddExt(Ext: String);
+  end;
+
 
 
@@ -29,5 +36,5 @@
 
 uses
-  Classes, StrUtils, SysUtils, ConnectionManager, TypeDefs;
+  Classes, StrUtils, SysUtils, ConnectionManager, TypeDefs, DataAccess, _MetaManager;
 
 { TExtension }
@@ -39,10 +46,19 @@
 end;
 
-function TExtension.GetFile(ID: Integer): Integer;
+function TExtension.GetCaption: String;
 begin
-  Result := FFiles[ID];
+  Result := FExt;
 end;
 
-function TExtension.GetFileCount: Integer;
+function TExtension.GetChild(ID: Integer): TTreeElement;
+var
+  Meta: TMetaManager;
+begin
+  Meta := ConManager.Connection[FConnectionID].MetaData;
+  Meta.InitFile(FFiles[ID]);
+  Result := Meta.FileById[FFiles[ID]];
+end;
+
+function TExtension.GetChildCount: Integer;
 begin
   Result := Length(FFiles);
@@ -57,5 +73,5 @@
 begin
   files := TStringList.Create;
-  files := ConManager.Connection[FConnectionID].GetFilesList(Ext, '', False, ST_NameAsc);
+  files := ConManager.Connection[FConnectionID].GetFilesList(FExt, '', False, ST_NameAsc);
   if files.Count > 0 then
   begin
@@ -74,3 +90,82 @@
 end;
 
+
+{ TExtensions }
+
+function TExtensions.GetCaption: String;
+begin
+  Result := '';
+end;
+
+function TExtensions.GetChild(ID: Integer): TTreeElement;
+begin
+  Result := FExtensions[ID];
+end;
+
+function TExtensions.GetChildCount: Integer;
+begin
+  Result := Length(FExtensions);
+end;
+
+constructor TExtensions.Create(DataAccess: TObject; ConnectionID: Integer);
+var
+  files: TStrings;
+  i: Integer;
+  fid: Integer;
+  finfo: TFileInfo;
+begin
+  FConnectionID := ConnectionID;
+  files := TStringList.Create;
+  files := TDataAccess(DataAccess).GetFilesList('', '', False, ST_IDAsc);
+  SetLength(FExtensions, 0);
+  if files.Count > 0 then
+  begin
+    for i := 0 to files.Count - 1 do
+    begin
+      fid := StrToInt(MidStr(files.Strings[i], 1, 5));
+      finfo := TDataAccess(DataAccess).GetFileInfo(fid);
+      if Length(finfo.Name) > 0 then
+        if not Assigned(GetExt(finfo.Extension)) then
+          AddExt(finfo.Extension);
+    end;
+  end;
+  files.Free;
+end;
+
+
+function TExtensions.GetExt(Ext: String): TExtension;
+var
+  i: Integer;
+begin
+  Result := nil;
+  if Length(FExtensions) > 0 then
+    for i := 0 to High(FExtensions) do
+      if FExtensions[i].GetCaption = Ext then
+      begin
+        Result := FExtensions[i];
+        Break;
+      end;
+end;
+
+procedure TExtensions.AddExt(Ext: String);
+var
+  i: Integer;
+begin
+  SetLength(FExtensions, Length(FExtensions) + 1);
+  for i := High(FExtensions) downto 1 do
+  begin
+    if FExtensions[i-1].GetCaption < Ext then
+    begin
+      FExtensions[i] := TExtension.Create(FConnectionID, Ext);
+      Break;
+    end
+    else
+      FExtensions[i] := FExtensions[i-1];
+  end;
+  if i = 0 then
+    FExtensions[0] := TExtension.Create(FConnectionID, Ext);
+end;
+
+
+
 end.
Index: oup/current/FileClasses/_FileTypes.pas
===================================================================
--- oup/current/FileClasses/_FileTypes.pas	(revision 232)
+++ oup/current/FileClasses/_FileTypes.pas	(revision 233)
@@ -4,11 +4,15 @@
 
 uses
-  TypeDefs, _DataTypes, Classes, Forms;
+  TypeDefs, _DataTypes, _TreeElement, Classes, Forms;
 
 
 type
-  TFile = class
+  TFile = class(TTreeElement)
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
+  private
+    FConnectionID: Integer;
     protected
-      FConnectionID: Integer;
       FFileInfo: TFileInfo;
       FFileStream: TMemoryStream;
@@ -17,22 +21,11 @@
       FChanged: Boolean;
 
-      FDatLinks: TDatLinkList;
       FDataFields: TBlock;
-      FRawParts: TRawDataList;
 
       FEditor: TFrame;
       FOpened: Boolean;
 
-      procedure InitDatLinks;
-      procedure InitRawList;
-
-      function GetDatLinkByOffset(Offset: Integer): TDatLink;
-      function GetDatLinkByIndex(ID: Integer): TDatLink;
       function GetFieldByOffset(Offset: Integer): TDataField;
-      function GetFieldByIndex(ID: Integer): TDataField;
-      function GetRawPartByOffset(Offset: Integer): TRawDataInfo;
-      function GetRawPartByIndex(ID: Integer): TRawDataInfo;
-      function GetChildCount: Integer;
-      function GetRawCount: Integer;
+  published
     public
       constructor Create(ConnectionID, FileID: Integer); virtual;
@@ -52,14 +45,5 @@
       property Opened: Boolean read FOpened write FOpened;
 
-      property ChildCount: Integer read GetChildCount;
-      property LinkByOffset[Offset: Integer]: TDatLink read GetDatLinkByOffset;
-      property LinkByIndex[ID: Integer]: TDatLink read GetDatLinkByIndex;
-
       property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
-      property FieldByIndex[ID: Integer]: TDataField read GetFieldByIndex;
-
-      property RawCount: Integer read GetRawCount;
-      property RawPartByOffset[Offset: Integer]: TRawDataInfo read GetRawPartByOffset;
-      property RawPartByIndex[ID: Integer]: TRawDataInfo read GetRawPartByIndex;
   end;
 
@@ -68,12 +52,9 @@
 
 
-function GetDatLinkValue(stream: TStream; offset: Integer): Integer;
-
-
 
 implementation
 
 uses
-  DatLinks, RawList, ConnectionManager, Dialogs, _EmptyFile;
+  DatLinks, RawList, ConnectionManager, Dialogs, _MetaTypes, _MetaManager;
 
 { TFileType }
@@ -89,13 +70,10 @@
   if not (Self is TFile_Empty) then
   begin
-    InitDatLinks();
-    InitRawList();
     FDataFields := nil;
+    InitDataFields;
     FEditor := nil;
   end
   else
   begin
-    SetLength(FDatLinks, 0);
-    SetLength(FRawParts, 0);
     FEditor := nil;
   end;
@@ -108,54 +86,4 @@
 end;
 
-function TFile.GetDatLinkByIndex(ID: Integer): TDatLink;
-var
-  i: Integer;
-  valids: Integer;
-begin
-  if ID < GetChildCount then
-  begin
-    valids := 0;
-    i := 0;
-    repeat
-      if FDatLinks[i].DestID >= 0 then
-      begin
-        Inc(valids);
-      end;
-      Inc(i);
-    until valids > ID;
-    Result := FDatLinks[i - 1];
-  end
-  else
-    with Result do
-    begin
-      SrcOffset := -1;
-      DestID := -1;
-      PosDestExts := '';
-    end;
-end;
-
-function TFile.GetDatLinkByOffset(Offset: Integer): TDatLink;
-var
-  i: Integer;
-begin
-  Result.SrcOffset := -1;
-  Result.DestID := -1;
-  Result.PosDestExts := '';
-  
-  if Length(FDatLinks) > 0 then
-  begin
-    for i := 0 to High(FDatLinks) do
-      if FDatLinks[i].SrcOffset = Offset then
-        break;
-    if i < Length(FDatLinks) then
-      Result := FDatLinks[i];
-  end;
-end;
-
-
-function TFile.GetFieldByIndex(ID: Integer): TDataField;
-begin
-  Result := FDataFields.FieldByIndex[ID];
-end;
 
 function TFile.GetFieldByOffset(Offset: Integer): TDataField;
@@ -165,82 +93,21 @@
 
 
-function TFile.GetChildCount: Integer;
-var
-  i: Integer;
+function TFile.GetCaption: String;
 begin
-  Result := Length(FDatLinks);
-  if Result > 0 then
-  begin
-    Result := 0;
-    for i := 0 to High(FDatLinks) do
-      if FDatLinks[i].DestID >= 0 then
-        Inc(Result);
-  end;
+  Result := FFileInfo.Name;
+  if Result = '' then
+    Result := 'Unnamed';
 end;
 
-function TFile.GetRawCount: Integer;
-var
-  i: Integer;
+function TFile.GetChild(ID: Integer): TTreeElement;
 begin
-  Result := Length(FRawParts);
-  if Result > 0 then
-  begin
-    Result := 0;
-    for i := 0 to High(FRawParts) do
-      if FRawParts[i].RawSize > 0 then
-        Inc(Result);
-  end;
+  Result := FDataFields.Child[ID];
 end;
 
-function TFile.GetRawPartByIndex(ID: Integer): TRawDataInfo;
-var
-  i: Integer;
-  valids: Integer;
+function TFile.GetChildCount: Integer;
 begin
-  if ID < GetRawCount then
-  begin
-    valids := 0;
-    i := 0;
-    repeat
-      if FRawParts[i].RawSize > 0 then
-      begin
-        Inc(valids);
-      end;
-      Inc(i);
-    until valids > ID;
-    Result := FRawParts[i - 1];
-  end
-  else
-    with Result do
-    begin
-      SrcID := -1;
-      SrcOffset := -1;
-      RawAddr := -1;
-      RawSize := -1;
-    end;
+  if FDataFields <> nil then
+    Result := FDataFields.ChildCount;
 end;
-
-function TFile.GetRawPartByOffset(Offset: Integer): TRawDataInfo;
-var
-  i: Integer;
-begin
-  with Result do
-  begin
-    SrcID := -1;
-    SrcOffset := -1;
-    RawAddr := -1;
-    RawSize := -1;
-  end;
-
-  if Length(FRawParts) > 0 then
-  begin
-    for i := 0 to High(FRawParts) do
-      if FRawParts[i].SrcOffset = Offset then
-        break;
-    if i < Length(FRawParts) then
-      Result := FRawParts[i];
-  end;
-end;
-
 
 
@@ -249,10 +116,8 @@
   if Assigned(FDataFields) then
     Exit;
+  FFileStream := TMemoryStream.Create;
+  ConManager.Connection[FConnectionID].LoadDatFile(FFileInfo.ID, TStream(FFileStream));
 end;
 
-procedure TFile.InitDatLinks;
-begin
-  FDatLinks := ConManager.Connection[FConnectionID].GetDatLinks(FFileInfo.ID);
-end;
 
 procedure TFile.InitEditor;
@@ -261,18 +126,4 @@
 end;
 
-procedure TFile.InitRawList;
-begin
-  FRawParts := ConManager.Connection[FConnectionID].GetRawList(FFileInfo.ID);
-end;
-
-function GetDatLinkValue(stream: TStream; offset: Integer): Integer;
-begin
-  stream.Seek(Offset, soFromBeginning);
-  stream.Read(Result, 4);
-  if Result > 0 then
-    Result := Result div 256
-  else
-    Result := -1;
-end;
 
 end.
Index: oup/current/FileClasses/_MetaManager.pas
===================================================================
--- oup/current/FileClasses/_MetaManager.pas	(revision 232)
+++ oup/current/FileClasses/_MetaManager.pas	(revision 233)
@@ -13,16 +13,11 @@
       function GetFileCount: Integer;
       function GetFileById(Id: Integer): TFile;
-      function GetExt(Ext: String): TExtension;
-      procedure AddExt(Ext: String);
     private
-      procedure InitExts;
     public
       constructor Create(ConnectionID: Integer; DataAccess: TObject);
-      procedure InitExtFiles(Ext: String);
       procedure InitFile(id: Integer);
       procedure InitFileFields(id: Integer);
 
       property Root: TExtensions read FRoot;
-      property RootExt[Ext: String]: TExtension read GetExt;
       property FileCount: Integer read GetFileCount;
       property FileById[Id: Integer]: TFile read GetFileById;
@@ -33,5 +28,5 @@
 uses
   Classes, ConnectionManager, Access_OniArchive, TypeDefs,
-  Dialogs, SysUtils, StrUtils, DataAccess;
+  Dialogs, SysUtils, StrUtils, DataAccess, _Extensions;
 
 { TFileManager }
@@ -42,42 +37,11 @@
   FDataAccess := DataAccess;
   SetLength(FFiles, TDataAccess(DataAccess).GetFileCount);
-  InitExts;
+  FRoot := TExtensions.Create(DataAccess, ConnectionID);
 end;
 
-function TMetaManager.GetExt(Ext: String): TExtension;
-var
-  i: Integer;
-begin
-  Result := nil;
-  if Length(FRoot) > 0 then
-    for i := 0 to High(FRoot) do
-      if FRoot[i].Ext = Ext then
-      begin
-        Result := FRoot[i];
-        Break;
-      end;
-end;
-
-procedure TMetaManager.AddExt(Ext: String);
-var
-  i: Integer;
-begin
-  SetLength(FRoot, Length(FRoot) + 1);
-  for i := High(FRoot) downto 1 do
-  begin
-    if FRoot[i-1].Ext < Ext then
-    begin
-      FRoot[i] := TExtension.Create(FConnectionID, Ext);
-      Break;
-    end
-    else
-      FRoot[i] := FRoot[i-1];
-  end;
-  if i = 0 then
-    FRoot[0] := TExtension.Create(FConnectionID, Ext);
-end;
 
 function TMetaManager.GetFileById(Id: Integer): TFile;
 begin
+  InitFile(Id);
   Result := FFiles[Id];
 end;
@@ -130,71 +94,3 @@
 end;
 
-procedure TMetaManager.InitExtFiles(Ext: String);
-var
-  files: TStrings;
-  i: Integer;
-  typei: Integer;
-  fid: Integer;
-  finfo: TFileInfo;
-begin
-  if ConManager.Connection[FConnectionID] is TAccess_OniArchive then
-    TAccess_OniArchive(ConManager.Connection[FConnectionID]).UnloadWhenUnused := False;
-  files := TStringList.Create;
-  files := ConManager.Connection[FConnectionID].GetFilesList('', '', False, ST_IDAsc);
-  SetLength(FFiles, ConManager.Connection[FConnectionID].GetFileCount);
-  for i := 0 to High(FFiles) do
-    FFiles[i] := nil;
-  if files.Count > 0 then
-  begin
-    for i := 0 to files.Count - 1 do
-    begin
-      fid := StrToInt(MidStr(files.Strings[i], 1, 5));
-      finfo := ConManager.Connection[FConnectionID].GetFileInfo(fid);
-      if Length(finfo.Name) > 0 then
-      begin
-        if finfo.Size > 0 then
-        begin
-          for typei := 0 to High(FileDescs) do
-          begin
-            if FileDescs[typei].ext = finfo.Extension then
-            begin
-              FFiles[fid] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, fid);
-              Break;
-            end;
-          end;
-        end
-        else
-          FFiles[fid] := TFile_Empty.Create(FConnectionID, fid);
-      end;
-    end;
-  end;
-  files.Free;
-  if ConManager.Connection[FConnectionID] is TAccess_OniArchive then
-    TAccess_OniArchive(ConManager.Connection[FConnectionID]).UnloadWhenUnused := True;
-end;
-
-procedure TMetaManager.InitExts;
-var
-  files: TStrings;
-  i: Integer;
-  fid: Integer;
-  finfo: TFileInfo;
-begin
-  files := TStringList.Create;
-  files := TDataAccess(FDataAccess).GetFilesList('', '', False, ST_IDAsc);
-  SetLength(FRoot, 0);
-  if files.Count > 0 then
-  begin
-    for i := 0 to files.Count - 1 do
-    begin
-      fid := StrToInt(MidStr(files.Strings[i], 1, 5));
-      finfo := TDataAccess(FDataAccess).GetFileInfo(fid);
-      if Length(finfo.Name) > 0 then
-        if not Assigned(GetExt(finfo.Extension)) then
-          AddExt(finfo.Extension);
-    end;
-  end;
-  files.Free;
-end;
-
 end.
Index: oup/current/FileClasses/_MetaTypes.pas
===================================================================
--- oup/current/FileClasses/_MetaTypes.pas	(revision 232)
+++ oup/current/FileClasses/_MetaTypes.pas	(revision 233)
@@ -4,5 +4,5 @@
 
 uses
-  _FileTypes, _EmptyFile, _DataTypes, _Extensions,
+  _FileTypes, _EmptyFile, _Unlinked, _DataTypes, _Extensions, _TreeElement,
   ABNA, AGDB, AGQC, AGQG, AGQM, AGQR, AISA, AITR, AIWA, AKAA, AKBA, AKBP, AKDA,
   AKEV, AKOT, AKVA, BINA, CBPI, CBPM, CONS, CRSA, DOOR, DPge, EDIA, ENVP, FILM,
@@ -16,6 +16,8 @@
 
 type
+  TTreeElement = _TreeElement.TTreeElement;
   TFile = _FileTypes.TFile;
   TFile_Empty = _EmptyFile.TFile_Empty;
+  TFile_Unlinked = _Unlinked.TFile_Unlinked;
   TExtension = _Extensions.TExtension;
   TExtensions = _Extensions.TExtensions;
Index: oup/current/FileClasses/_TreeElement.pas
===================================================================
--- oup/current/FileClasses/_TreeElement.pas	(revision 233)
+++ oup/current/FileClasses/_TreeElement.pas	(revision 233)
@@ -0,0 +1,20 @@
+unit _TreeElement;
+interface
+
+
+type
+  TTreeElement = class
+      FConnectionID: Integer;
+      function GetChildCount: Integer; virtual; abstract;
+      function GetChild(ID: Integer): TTreeElement; virtual; abstract;
+      function GetCaption: String; virtual; abstract;
+    private
+    public
+      property ChildCount: Integer read GetChildCount;
+      property Child[ID: Integer]: TTreeElement read GetChild;
+      property Caption: String read GetCaption;
+  end;
+
+implementation
+
+end.
Index: oup/current/OniUnPacker.dpr
===================================================================
--- oup/current/OniUnPacker.dpr	(revision 232)
+++ oup/current/OniUnPacker.dpr	(revision 233)
@@ -152,5 +152,7 @@
   FileManager in 'Tools\FileManager.pas' {Form_FileManager},
   _Extensions in 'FileClasses\_Extensions.pas',
-  _MetaTypes in 'FileClasses\_MetaTypes.pas';
+  _MetaTypes in 'FileClasses\_MetaTypes.pas',
+  _TreeElement in 'FileClasses\_TreeElement.pas',
+  _Unlinked in 'FileClasses\_Unlinked.pas';
 
 {$R *.res}
Index: oup/current/Tools/MetaEditor.dfm
===================================================================
--- oup/current/Tools/MetaEditor.dfm	(revision 232)
+++ oup/current/Tools/MetaEditor.dfm	(revision 233)
@@ -12,5 +12,5 @@
     ExplicitTop = 25
     ExplicitWidth = 598
-    ExplicitHeight = 532
+    ExplicitHeight = 424
     object splitter: TSplitter
       Left = 190
@@ -48,6 +48,4 @@
       OnPaintText = VSTPaintText
       OnInitChildren = VSTInitChildren
-      ExplicitWidth = 502
-      ExplicitHeight = 532
       Columns = <
         item
@@ -80,11 +78,11 @@
         Caption = 'Meta Edit'
         ImageIndex = 1
-        ExplicitWidth = 192
-        ExplicitHeight = 504
+        ExplicitLeft = 0
+        ExplicitTop = 0
+        ExplicitWidth = 0
+        ExplicitHeight = 0
       end
       object tab_hex: TTabSheet
         Caption = 'Binary Edit'
-        ExplicitWidth = 192
-        ExplicitHeight = 504
         object splitter_hex_1: TSplitter
           Left = 0
@@ -102,5 +100,5 @@
         object splitter_hex_2: TSplitter
           Left = 0
-          Top = 250
+          Top = 256
           Width = 392
           Height = 8
@@ -115,14 +113,27 @@
         object panel_hex_actions: TPanel
           Left = 0
-          Top = 355
-          Width = 392
-          Height = 41
+          Top = 361
+          Width = 392
+          Height = 35
           Align = alBottom
           BevelOuter = bvNone
           Caption = 'panel_hex_actions'
           TabOrder = 0
-          ExplicitLeft = 3
-          ExplicitTop = 354
-          ExplicitWidth = 192
+          object btn_export: TButton
+            Left = 2
+            Top = 6
+            Width = 117
+            Height = 25
+            Caption = 'Export to file...'
+            TabOrder = 0
+          end
+          object btn_import: TButton
+            Left = 125
+            Top = 6
+            Width = 117
+            Height = 25
+            Caption = 'Import from file...'
+            TabOrder = 1
+          end
         end
         object hex: TMPHexEditor
@@ -151,5 +162,5 @@
           Colors.EvenColumn = clNavy
           Colors.CurrentOffsetBackground = clBtnShadow
-          Colors.OffsetBackground = clBtnFace
+          Colors.OffsetBackGround = clBtnFace
           Colors.CurrentOffset = clBtnHighlight
           Colors.Grid = clBtnFace
@@ -160,7 +171,6 @@
           AllowInsertMode = False
           DrawGridLines = False
-          Version = 'december 06, 2006; '#169' markus stephany, vcl[at]mirkes[dot]de'
+          Version = 'May 23, 2005; '#169' markus stephany, vcl[at]mirkes[dot]de'
           ShowPositionIfNotFocused = True
-          ExplicitWidth = 192
         end
         object value_viewer: TWrapGrid
@@ -168,5 +178,5 @@
           Top = 108
           Width = 392
-          Height = 142
+          Height = 148
           Align = alClient
           ColCount = 1
@@ -179,11 +189,8 @@
           ScrollBars = ssVertical
           TabOrder = 2
-          ExplicitTop = 363
-          ExplicitWidth = 192
-          ExplicitHeight = 0
         end
         object structviewer: TVirtualStringTree
           Left = 0
-          Top = 258
+          Top = 264
           Width = 392
           Height = 97
@@ -225,7 +232,4 @@
           OnFocusChanged = VSTFocusChanged
           OnGetText = VSTGetText
-          ExplicitLeft = -6
-          ExplicitTop = 161
-          ExplicitWidth = 192
           Columns = <
             item
@@ -280,3 +284,31 @@
     end
   end
+  object value_viewer_context: TPopupMenu
+    AutoHotkeys = maManual
+    AutoLineReduction = maManual
+    Left = 300
+    Top = 196
+    object value_viewer_context_copy: TMenuItem
+      Caption = 'Copy to &clipboard'
+    end
+    object value_viewer_context_copyasdec: TMenuItem
+      Caption = 'Copy to clipboard (as &dec)'
+    end
+    object value_viewer_context_copyasfloat: TMenuItem
+      Caption = 'Copy to clipboard (as &float)'
+    end
+    object value_viewer_context_copyasbitset: TMenuItem
+      Caption = 'Copy to clipboard (as &bitset)'
+    end
+    object value_viewer_context_copyasstring: TMenuItem
+      Caption = 'Copy to clipboard (as &string)'
+    end
+    object value_viewer_context_copyashex: TMenuItem
+      Caption = 'Copy to clipboard (as &hex)'
+    end
+  end
+  object VTHPopup: TVTHeaderPopupMenu
+    Left = 292
+    Top = 340
+  end
 end
Index: oup/current/Tools/MetaEditor.pas
===================================================================
--- oup/current/Tools/MetaEditor.pas	(revision 232)
+++ oup/current/Tools/MetaEditor.pas	(revision 233)
@@ -6,5 +6,5 @@
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, _BaseTemplate, ExtCtrls, VirtualTrees, StdCtrls, ComCtrls, Grids,
-  MPHexEditor, Wrapgrid;
+  MPHexEditor, Wrapgrid, VTHeaderPopup, Menus, _TreeElement;
 
 type
@@ -21,4 +21,14 @@
     splitter_hex_2: TSplitter;
     structviewer: TVirtualStringTree;
+    value_viewer_context: TPopupMenu;
+    value_viewer_context_copy: TMenuItem;
+    value_viewer_context_copyasdec: TMenuItem;
+    value_viewer_context_copyasfloat: TMenuItem;
+    value_viewer_context_copyasbitset: TMenuItem;
+    value_viewer_context_copyasstring: TMenuItem;
+    value_viewer_context_copyashex: TMenuItem;
+    VTHPopup: TVTHeaderPopupMenu;
+    btn_export: TButton;
+    btn_import: TButton;
     procedure FormCreate(Sender: TObject);
     procedure VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode;
@@ -36,4 +46,5 @@
       TextType: TVSTTextType);
   private
+    root: TTreeElement;
     procedure NewCon(ID: Integer);
   public
@@ -49,5 +60,5 @@
 
   TNodeData = record
-    Field: TObject;
+    Field: TTreeElement;
   end;
 
@@ -70,5 +81,5 @@
   node: PVirtualNode;
   Meta: TMetaManager;
-  root: TExtensions;
+  root: TTreeElement;
 begin
   if ID >= 0 then
@@ -78,7 +89,7 @@
     VST.BeginUpdate;
     root := ConManager.Connection[FConnectionID].MetaData.Root;
-    for i := 0 to High(root) do
-    begin
-      data.Field := root[i];
+    for i := 0 to root.ChildCount - 1 do
+    begin
+      data.Field := root.Child[i];
       node := AddVSTEntry(VST, nil, data);
       VST.HasChildren[node] := True;
@@ -96,42 +107,19 @@
   newnode: PVirtualNode;
   i: Integer;
-  id: Integer;
   Meta: TMetaManager;
 begin
   data := Sender.GetNodeData(node);
   Meta := ConManager.Connection[ConnectionID].MetaData;
-  if data.Field is TFile then
-  begin
-    if TFile(data.Field).ChildCount > 0 then
-    begin
-      for i := 0 to TFile(data.Field).ChildCount - 1 do
-      begin
-        id := TFile(data.Field).LinkByIndex[i].DestID;
-        Meta.InitFile(id);
-        newdata.Field := Meta.FileById[id];
-        newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata);
-        if Meta.FileById[id].ChildCount > 0 then
-          Sender.HasChildren[newnode] := True;
-      end;
-    end;
-    if TFile(data.Field).RawCount > 0 then
-    begin
-      for i := 0 to TFile(data.Field).RawCount - 1 do
-      begin
-//        Exit;
-      end;
-    end;
-  end;
   if data.Field is TExtension then
-  begin
-    if TExtension(data.Field).FileCount = 0 then
+    if TExtension(data.Field).ChildCount = 0 then
       TExtension(data.Field).InitList;
-    for i := 0 to TExtension(data.Field).FileCount - 1 do
-    begin
-      id := TExtension(data.Field).Files[i];
-      Meta.InitFile(id);
-      newdata.Field := Meta.FileById[id];
+
+  if data.Field.ChildCount > 0 then
+  begin
+    for i := 0 to data.Field.ChildCount - 1 do
+    begin
+      newdata.Field := data.Field.Child[i];
       newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata);
-      if Meta.FileById[id].ChildCount > 0 then
+      if newdata.Field.ChildCount > 0 then
         Sender.HasChildren[newnode] := True;
     end;
@@ -205,12 +193,5 @@
       0:
         begin
-          if Data.Field is TFile then
-          begin
-            CellText := TFile(Data.Field).FileInfo.Name;
-            if CellText = '' then
-              CellText := 'Unnamed';
-          end;
-          if Data.Field is TExtension then
-            CellText := TExtension(Data.Field).Ext;
+          CellText := Data.Field.GetCaption;
         end;
       1:
Index: oup/current/Tools/_TemplateFileList.dfm
===================================================================
--- oup/current/Tools/_TemplateFileList.dfm	(revision 232)
+++ oup/current/Tools/_TemplateFileList.dfm	(revision 233)
@@ -269,4 +269,8 @@
           Caption = 'Tree'
           ImageIndex = 1
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
           object filelist_meta: TVirtualStringTree
             Left = 0
Index: oup/current/Tools/_TemplateFileList.pas
===================================================================
--- oup/current/Tools/_TemplateFileList.pas	(revision 232)
+++ oup/current/Tools/_TemplateFileList.pas	(revision 233)
@@ -173,5 +173,5 @@
     filelist_meta.Clear;
     filelist_meta.BeginUpdate;
-    root := ConManager.Connection[FConnectionID].MetaData.Root;
+{    root := ConManager.Connection[FConnectionID].MetaData.Root;
     for i := 0 to High(root) do
     begin
@@ -181,5 +181,5 @@
     end;
     filelist_meta.EndUpdate;
-  end;
+}  end;
 end;
 
@@ -453,5 +453,5 @@
 begin
   inherited;
-  data := Sender.GetNodeData(Node);
+{  data := Sender.GetNodeData(Node);
   if data.Field is TExtension then
   begin
@@ -465,5 +465,5 @@
       CellText := TFile(data.Field).FileInfo.Extension + ': ' + TFile(data.Field).FileInfo.Name;
   end;
-end;
+}end;
 
 
@@ -481,5 +481,5 @@
   Self.Cursor := crHourGlass;
   Application.ProcessMessages;
-  if data.Field is TExtension then
+{  if data.Field is TExtension then
   begin
     if TExtension(data.Field).FileCount = 0 then
@@ -509,5 +509,5 @@
     ChildCount := filelist_meta.ChildCount[node];
   end;
-  Self.Cursor := crDefault;
+}  Self.Cursor := crDefault;
 end;
 
