SCRN2DBF.MOD 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. IMPLEMENTATION MODULE Scrn2DBF;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1986 - 1991 Donald G. Fletcher
  6. * (c) Copyright 1986 - 1991 PMI
  7. * P.O. Box 8402
  8. * Green Bay Wi 53308
  9. * All Rights Reserved
  10. *
  11. * Contributed by John McMonagle of McMonagle Software
  12. * Green Bay, Wisconsin.
  13. *)
  14. (* 12/23/88 replaced LeftJustify with LeftJust to save leading blanks *)
  15. (* increased memosize limit to 4k *)
  16. (* 6/22/89 @DELETED,@RECNUM,@RECOUNT TO Frame to DBF *)
  17. IMPORT DateFunctions;
  18. IMPORT DBFields;
  19. IMPORT ErrorManager;
  20. IMPORT FieldTypes;
  21. IMPORT GenLists;
  22. IMPORT LowLevel;
  23. IMPORT MemoFunctions;
  24. IMPORT ModBase3;
  25. IMPORT PosUtils;
  26. IMPORT ScrnTypes;
  27. IMPORT ScrnUtl1;
  28. IMPORT StrConv;
  29. IMPORT StrEdit;
  30. IMPORT StringIO;
  31. IMPORT M2Strings;
  32. IMPORT SYSTEM;
  33. FROM VStorage IMPORT
  34. DosAlloc, DosDealloc;
  35. CONST
  36. MemoSize=4000;
  37. PROCEDURE DEALLOCATE(VAR loc:SYSTEM.ADDRESS;size:CARDINAL);
  38. BEGIN
  39. DosDealloc(loc,size);
  40. END DEALLOCATE;
  41. PROCEDURE ALLOCATE(VAR loc:SYSTEM.ADDRESS;size:CARDINAL);
  42. BEGIN
  43. DosAlloc(loc,size);
  44. END ALLOCATE;
  45. PROCEDURE LeftJust( VAR TheStr: ARRAY OF CHAR;
  46. RequiredLength: CARDINAL );
  47. VAR strlength: CARDINAL;
  48. BEGIN
  49. strlength := M2Strings.Length( TheStr );
  50. IF strlength > RequiredLength THEN
  51. StrEdit.SetLength( TheStr, RequiredLength );
  52. ELSE
  53. WHILE strlength < RequiredLength DO
  54. StrEdit.Append( TheStr, ' ' );
  55. INC( strlength );
  56. END;
  57. END;
  58. END LeftJust;
  59. PROCEDURE FrameToDBF
  60. ( VAR DBF : ModBase3.DBFile;
  61. VAR TheFrame : ScrnTypes.DisplayFrame) : BOOLEAN;
  62. VAR
  63. string : ARRAY[ 0 .. 128 ] OF CHAR;
  64. TotalFields,
  65. size,
  66. i,
  67. FieldCount,
  68. k,
  69. J : CARDINAL;
  70. offby : INTEGER;
  71. dumbool : BOOLEAN;
  72. date : DateFunctions.Date;
  73. list : GenLists.GenList;
  74. text : POINTER TO ARRAY[ 0 .. MemoSize-1 ] OF CHAR;
  75. FieldPtr : ScrnTypes.InputFieldPtr;
  76. ImagePtr : ScrnTypes.ImageElmtPtr;
  77. fldptr : ModBase3.DBFieldPtr;
  78. BEGIN
  79. TotalFields := ScrnUtl1.FieldListTotal( TheFrame );
  80. fldptr:=ModBase3.FieldList(DBF);
  81. FieldCount := 1;
  82. REPEAT
  83. ScrnUtl1.GetFieldPtr( TheFrame, FieldCount, FieldPtr );
  84. IF M2Strings.Length( FieldPtr^.fnam ) # 0 THEN
  85. ScrnUtl1.GetFieldImagePtr( TheFrame, FieldCount, ImagePtr );
  86. i := ModBase3.PosOfField( DBF, FieldPtr^.fnam );
  87. IF i # 0 THEN
  88. CASE fldptr^[i].fldtype OF
  89. 'C' :
  90. M2Strings.Assign( ImagePtr^.text, string );
  91. DBFields.Replace( DBF, i, string ); |
  92. 'D' :
  93. (* as dates are to be checked in userops count and errorcheck
  94. are to be dropped *)
  95. (* should modify to use fieldptr variables *)
  96. IF NOT PosUtils.IsBlank( ImagePtr^.text ) THEN
  97. DateFunctions.StrToDate( ImagePtr^.text, date, dumbool );
  98. IF NOT dumbool THEN
  99. RETURN FALSE
  100. END (* if *);
  101. DBFields.ReplaceD( DBF, i, date );
  102. ELSE
  103. DBFields.Replace( DBF, i, ' ' );
  104. END (* if *); |
  105. 'L' :
  106. (* should work fine for both group and boolean fields *)
  107. DBFields.ReplaceL( DBF, i, FieldPtr^.selected ); |
  108. 'M' :
  109. IF FieldPtr^.typ = FieldTypes.TypeCode( 'EDITOR' ) THEN
  110. dumbool := ScrnUtl1.ListFromEdField( TheFrame, FieldCount,
  111. list );
  112. size := GenLists.ListLength( list );
  113. (* cludge because empty list has 1 element !!!*)
  114. IF size=1 THEN
  115. GenLists.GetElmt( list, 1, string, k );
  116. END;
  117. NEW(text);
  118. text^ := '';
  119. IF (size # 0 ) AND NOT ((size =1) AND (string[0]=0C)) THEN
  120. FOR J := 1 TO size DO
  121. GenLists.GetElmt( list, J, string, k );
  122. StrEdit.Append( text^, string );
  123. StrEdit.Append( text^, StringIO.CrLf );
  124. (* for *)
  125. END (* for J *);
  126. END (* if size *);
  127. MemoFunctions.ReplaceM( DBF, i, text^ );
  128. DISPOSE(text);
  129. END (* if FieldPtr *);
  130. |
  131. 'N' :
  132. M2Strings.Assign( ImagePtr^.text, string );
  133. StrEdit.DeleteChar( ' ', string );
  134. IF M2Strings.Pos( '.', string ) > HIGH( string ) THEN
  135. StrEdit.Append( string, '.' );
  136. (* no decimal point *)
  137. END (* if M2Strings.Pos *);
  138. (* if *)
  139. offby := -INTEGER( fldptr^[i].decplaces ) + INTEGER(
  140. M2Strings.Length( string ) )
  141. - INTEGER( M2Strings.Pos( '.', string ) + 1 );
  142. IF offby < 0 THEN
  143. REPEAT
  144. StrEdit.Append( string, '0' );
  145. INC( offby );
  146. UNTIL offby = 0;
  147. ELSE
  148. StrEdit.SetLength( string, M2Strings.Length( string ) -
  149. CARDINAL( offby ) );
  150. END (* if offby *);
  151. (* if *)
  152. IF fldptr^[i].decplaces = 0 THEN
  153. StrEdit.SetLength( string, M2Strings.Pos( '.', string ) );
  154. END (* if DBF.fieldlist^ *);
  155. (* if *)
  156. (* Right justify *)
  157. WHILE M2Strings.Length( string ) < fldptr^[i].size DO
  158. M2Strings.Concat( ' ', string, string );
  159. (* while *)
  160. END (* while M2Strings.Length *);
  161. DBFields.Replace( DBF, i, string );
  162. ELSE
  163. END (* case DBF.fieldlist^ *);
  164. END (* if i *);
  165. END (* if M2Strings.Length *);
  166. INC( FieldCount );
  167. UNTIL FieldCount > TotalFields;
  168. RETURN TRUE;
  169. END FrameToDBF;
  170. PROCEDURE DBFToFrame
  171. ( VAR DBF : ModBase3.DBFile;
  172. VAR TheFrame : ScrnTypes.DisplayFrame);
  173. VAR
  174. string : ARRAY[ 0 .. 79 ] OF CHAR;
  175. TotalFields,
  176. size,
  177. FieldCount,
  178. i : CARDINAL;
  179. ok : BOOLEAN;
  180. date : DateFunctions.Date;
  181. list : GenLists.GenList;
  182. FieldPtr : ScrnTypes.InputFieldPtr;
  183. ImagePtr : ScrnTypes.ImageElmtPtr;
  184. Block : SYSTEM.ADDRESS;
  185. fldptr : ModBase3.DBFieldPtr;
  186. text : POINTER TO ARRAY[ 0 .. MemoSize-1 ] OF CHAR;
  187. BEGIN
  188. fldptr:=ModBase3.FieldList(DBF);
  189. TotalFields := ScrnUtl1.FieldListTotal( TheFrame );
  190. FieldCount := 1;
  191. REPEAT
  192. ScrnUtl1.GetFieldPtr( TheFrame, FieldCount, FieldPtr );
  193. IF M2Strings.Length( FieldPtr^.fnam ) # 0 THEN
  194. ScrnUtl1.GetFieldImagePtr( TheFrame, FieldCount, ImagePtr );
  195. i := ModBase3.PosOfField( DBF, FieldPtr^.fnam );
  196. IF i # 0 THEN
  197. CASE fldptr^[i].fldtype OF
  198. 'C' :
  199. ModBase3.GetField( DBF, i, string );
  200. size := M2Strings.Length( ImagePtr^.text );
  201. LeftJust( string, size );
  202. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  203. size);
  204. (* if *) |
  205. 'N' :
  206. ModBase3.GetField( DBF, i, string );
  207. size := M2Strings.Length( ImagePtr^.text );
  208. StrEdit.RightJustify( string, size );
  209. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  210. size);
  211. (* if *) |
  212. 'D' :
  213. (* should add code to initalize date paramaters in
  214. fieldptr *)
  215. DBFields.GetDateField( DBF, i, date );
  216. DateFunctions.DateToStr( date, string, ok );
  217. IF NOT ok THEN
  218. string:='';
  219. END (* if ok *);
  220. size := M2Strings.Length( ImagePtr^.text );
  221. LeftJust( string, size );
  222. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  223. size);
  224. (* if *) |
  225. 'L' :
  226. DBFields.GetLogicalField( DBF, i, FieldPtr^.selected );
  227. IF (FieldPtr^.typ = FieldTypes.TypeCode('BOOLEAN') ) THEN
  228. IF FieldPtr^.selected THEN
  229. (* if boolean code mark *)
  230. ImagePtr^.text[0]:=CHR(251);(* û *)
  231. ELSE
  232. ImagePtr^.text[0]:=' ';
  233. END;
  234. END; |
  235. 'M' :
  236. IF FieldPtr^.typ = FieldTypes.TypeCode( 'EDITOR' ) THEN
  237. NEW( text );
  238. (* LowLevel.Fill( text, HIGH( text^ )+1, 0 );*)
  239. (* to clear block for block to list*)
  240. MemoFunctions.GetMemoField( DBF, i, text^ );
  241. GenLists.NewList(list);
  242. size:=M2Strings.Length( text^ );
  243. IF size # 0
  244. THEN
  245. (* check to see ends with crlf *)
  246. IF NOT ((text^[size-2]=StringIO.CrLf[0]) AND
  247. (text^[size-1]=StringIO.CrLf[1]))
  248. THEN
  249. StrEdit.Append(text^,StringIO.CrLf);
  250. INC(size,2);
  251. END;
  252. (* do this so that only enough memory is kept *)
  253. ALLOCATE(Block,size);
  254. LowLevel.Move(text,Block,size);
  255. GenLists.BlockToList( Block, size,
  256. StringIO.CrLf, StringIO.CrLf, 0,
  257. GenLists.StrCode, list );
  258. END (* if M2Strings.Length *);
  259. DISPOSE( text );
  260. ok := ScrnUtl1.ListToEdField( list, TheFrame, FieldCount );
  261. END (* if FieldPtr *);
  262. ELSE
  263. END (* case DBF.fieldlist^ *);
  264. (* case *)
  265. ELSIF PosUtils.Equal('@DELETED',FieldPtr^.fnam)
  266. THEN
  267. IF ModBase3.Deleted(DBF)
  268. THEN
  269. string:='DELETED'
  270. ELSE
  271. string:='';
  272. END;
  273. size := M2Strings.Length( ImagePtr^.text );
  274. LeftJust( string, size );
  275. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  276. size);
  277. ELSIF PosUtils.Equal('@RECNO',FieldPtr^.fnam)
  278. THEN
  279. size := M2Strings.Length( ImagePtr^.text );
  280. StrConv.LongIntegerToStr(ModBase3.Record(DBF),size,string);
  281. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  282. size);
  283. ELSIF PosUtils.Equal('@RECCOUNT',FieldPtr^.fnam)
  284. THEN
  285. size := M2Strings.Length( ImagePtr^.text );
  286. StrConv.LongIntegerToStr(ModBase3.NumberRecords(DBF),size,string);
  287. LowLevel.Move(SYSTEM.ADR(string),SYSTEM.ADR(ImagePtr^.text),
  288. size);
  289. END (* if i *);
  290. (* IF*)
  291. END (* if M2Strings.Length *);
  292. INC( FieldCount );
  293. UNTIL FieldCount > TotalFields;
  294. END DBFToFrame;
  295. BEGIN
  296. END Scrn2DBF.
  297.