msgbox.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. { $Id$ }
  2. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  3. { }
  4. { System independent GRAPHICAL clone of MSGBOX.PAS }
  5. { }
  6. { Interface Copyright (c) 1992 Borland International }
  7. { }
  8. { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
  9. { [email protected] - primary e-mail addr }
  10. { [email protected] - backup e-mail addr }
  11. { }
  12. {****************[ THIS CODE IS FREEWARE ]*****************}
  13. { }
  14. { This sourcecode is released for the purpose to }
  15. { promote the pascal language on all platforms. You may }
  16. { redistribute it and/or modify with the following }
  17. { DISCLAIMER. }
  18. { }
  19. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  20. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  21. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  22. { }
  23. {*****************[ SUPPORTED PLATFORMS ]******************}
  24. { 16 and 32 Bit compilers }
  25. { DOS - Turbo Pascal 7.0 + (16 Bit) }
  26. { DPMI - Turbo Pascal 7.0 + (16 Bit) }
  27. { - FPC 0.9912+ (GO32V2) (32 Bit) }
  28. { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
  29. { - Delphi 1.0+ (16 Bit) }
  30. { WIN95/NT - Delphi 2.0+ (32 Bit) }
  31. { - Virtual Pascal 2.0+ (32 Bit) }
  32. { - Speedsoft Sybil 2.0+ (32 Bit) }
  33. { OS2 - Virtual Pascal 1.0+ (32 Bit) }
  34. { - Speedsoft Sybil 2.0+ (32 Bit) }
  35. { }
  36. {******************[ REVISION HISTORY ]********************}
  37. { Version Date Fix }
  38. { ------- --------- --------------------------------- }
  39. { 1.00 12 Jun 96 Initial DOS/DPMI code released. }
  40. { 1.10 18 Oct 97 Code converted to GUI & TEXT mode. }
  41. { 1.20 18 Jul 97 Windows conversion added. }
  42. { 1.30 29 Aug 97 Platform.inc sort added. }
  43. { 1.40 22 Oct 97 Delphi3 32 bit code added. }
  44. { 1.50 05 May 98 Virtual pascal 2.0 code added. }
  45. { 1.60 30 Sep 99 Complete recheck preformed }
  46. {**********************************************************}
  47. UNIT MsgBox;
  48. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  49. INTERFACE
  50. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  51. {====Include file to sort compiler platform out =====================}
  52. {$I Platform.inc}
  53. {====================================================================}
  54. {==== Compiler directives ===========================================}
  55. {$IFNDEF PPC_FPC}{ FPC doesn't support these switches }
  56. {$F-} { Near calls are okay }
  57. {$A+} { Word Align Data }
  58. {$B-} { Allow short circuit boolean evaluations }
  59. {$O+} { This unit may be overlaid }
  60. {$G+} { 286 Code optimization - if you're on an 8088 get a real computer }
  61. {$P-} { Normal string variables }
  62. {$N-} { No 80x87 code generation }
  63. {$E+} { Emulation is on }
  64. {$ENDIF}
  65. {$X+} { Extended syntax is ok }
  66. {$R-} { Disable range checking }
  67. {$S-} { Disable Stack Checking }
  68. {$I-} { Disable IO Checking }
  69. {$Q-} { Disable Overflow Checking }
  70. {$V-} { Turn off strict VAR strings }
  71. {====================================================================}
  72. USES Objects; { Standard GFV unit }
  73. {***************************************************************************}
  74. { PUBLIC CONSTANTS }
  75. {***************************************************************************}
  76. {---------------------------------------------------------------------------}
  77. { MESSAGE BOX CLASSES }
  78. {---------------------------------------------------------------------------}
  79. CONST
  80. mfWarning = $0000; { Display a Warning box }
  81. mfError = $0001; { Dispaly a Error box }
  82. mfInformation = $0002; { Display an Information Box }
  83. mfConfirmation = $0003; { Display a Confirmation Box }
  84. mfInsertInApp = $0080; { Insert message box into }
  85. { app instead of the Desktop }
  86. {---------------------------------------------------------------------------}
  87. { MESSAGE BOX BUTTON FLAGS }
  88. {---------------------------------------------------------------------------}
  89. CONST
  90. mfYesButton = $0100; { Yes button into the dialog }
  91. mfNoButton = $0200; { No button into the dialog }
  92. mfOKButton = $0400; { OK button into the dialog }
  93. mfCancelButton = $0800; { Cancel button into the dialog }
  94. mfYesNoCancel = mfYesButton + mfNoButton + mfCancelButton;
  95. { Yes, No, Cancel dialog }
  96. mfOKCancel = mfOKButton + mfCancelButton;
  97. { Standard OK, Cancel dialog }
  98. {***************************************************************************}
  99. { INTERFACE ROUTINES }
  100. {***************************************************************************}
  101. procedure InitMsgBox;
  102. procedure DoneMsgBox;
  103. { Init initializes the message box display system's text strings. Init is
  104. called by TApplication.Init after a successful call to Resource.Init or
  105. Resource.Load. }
  106. {-MessageBox---------------------------------------------------------
  107. MessageBox displays the given string in a standard sized dialog box.
  108. Before the dialog is displayed the Msg and Params are passed to FormatStr.
  109. The resulting string is displayed as a TStaticText view in the dialog.
  110. 30Sep99 LdB
  111. ---------------------------------------------------------------------}
  112. FUNCTION MessageBox (Const Msg: String; Params: Pointer;
  113. AOptions: Word): Word;
  114. {-MessageBoxRect-----------------------------------------------------
  115. MessageBoxRec allows the specification of a TRect for the message box
  116. to occupy.
  117. 30Sep99 LdB
  118. ---------------------------------------------------------------------}
  119. FUNCTION MessageBoxRect (Var R: TRect; Const Msg: String; Params: Pointer;
  120. AOptions: Word): Word;
  121. {-InputBox-----------------------------------------------------------
  122. InputBox displays a simple dialog that allows user to type in a string
  123. 30Sep99 LdB
  124. ---------------------------------------------------------------------}
  125. FUNCTION InputBox (Const Title, ALabel: String; Var S: String;
  126. Limit: Byte): Word;
  127. {-InputBoxRect-------------------------------------------------------
  128. InputBoxRect is like InputBox but allows the specification of a rectangle.
  129. 30Sep99 LdB
  130. ---------------------------------------------------------------------}
  131. FUNCTION InputBoxRect (Var Bounds: TRect; Const Title, ALabel: String;
  132. Var S: String; Limit: Byte): Word;
  133. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  134. IMPLEMENTATION
  135. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  136. USES Drivers, Views, App, Dialogs, Resource; { Standard GFV units }
  137. {***************************************************************************}
  138. { INTERFACE ROUTINES }
  139. {***************************************************************************}
  140. const
  141. Commands: array[0..3] of word =
  142. (cmYes, cmNo, cmOK, cmCancel);
  143. var
  144. ButtonName: array[0..3] of string[40];
  145. Titles: array[0..3] of string[40];
  146. {---------------------------------------------------------------------------}
  147. { MessageBox -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Sep99 LdB }
  148. {---------------------------------------------------------------------------}
  149. FUNCTION MessageBox(Const Msg: String; Params: Pointer; AOptions: Word): Word;
  150. VAR R: TRect;
  151. BEGIN
  152. R.Assign(0, 0, 40, 9); { Assign area }
  153. If (AOptions AND mfInsertInApp = 0) Then { Non app insert }
  154. R.Move((Desktop^.Size.X - R.B.X) DIV 2,
  155. (Desktop^.Size.Y - R.B.Y) DIV 2) Else { Calculate position }
  156. R.Move((Application^.Size.X - R.B.X) DIV 2,
  157. (Application^.Size.Y - R.B.Y) DIV 2); { Calculate position }
  158. MessageBox := MessageBoxRect(R, Msg, Params,
  159. AOptions); { Create message box }
  160. END;
  161. {---------------------------------------------------------------------------}
  162. { MessageBoxRect -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Sep99 LdB }
  163. {---------------------------------------------------------------------------}
  164. FUNCTION MessageBoxRect(Var R: TRect; Const Msg: String; Params: Pointer;
  165. AOptions: Word): Word;
  166. VAR I, X, ButtonCount: Integer; S: String; Dialog: PDialog; Control: PView;
  167. ButtonList: Array[0..4] Of PView;
  168. BEGIN
  169. Dialog := New(PDialog, Init(R, Titles[AOptions
  170. AND $3])); { Create dialog }
  171. With Dialog^ Do Begin
  172. R.Assign(3, 2, Size.X - 2, Size.Y - 3); { Assign screen area }
  173. FormatStr(S, Msg, Params^); { Format the message }
  174. Control := New(PStaticText, Init(R, S)); { Create static text }
  175. Insert(Control); { Insert the text }
  176. X := -2; { Set initial value }
  177. ButtonCount := 0; { Clear button count }
  178. For I := 0 To 3 Do
  179. If (AOptions AND ($0100 SHL I) <> 0) Then Begin
  180. R.Assign(0, 0, 10, 2); { Assign screen area }
  181. Control := New(PButton, Init(R, ButtonName[I],
  182. Commands[i], bfNormal)); { Create button }
  183. Inc(X, Control^.Size.X + 2); { Adjust position }
  184. ButtonList[ButtonCount] := Control; { Add to button list }
  185. Inc(ButtonCount); { Inc button count }
  186. End;
  187. X := (Size.X - X) SHR 1; { Calc x position }
  188. If (ButtonCount > 0) Then
  189. For I := 0 To ButtonCount - 1 Do Begin { For each button }
  190. Control := ButtonList[I]; { Transfer button }
  191. Insert(Control); { Insert button }
  192. Control^.MoveTo(X, Size.Y - 3); { Position button }
  193. Inc(X, Control^.Size.X + 2); { Adjust position }
  194. End;
  195. SelectNext(False); { Select first button }
  196. End;
  197. If (AOptions AND mfInsertInApp = 0) Then
  198. MessageBoxRect := DeskTop^.ExecView(Dialog) Else { Execute dialog }
  199. MessageBoxRect := Application^.ExecView(Dialog); { Execute dialog }
  200. Dispose(Dialog, Done); { Dispose of dialog }
  201. END;
  202. {---------------------------------------------------------------------------}
  203. { InputBox -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Sep99 LdB }
  204. {---------------------------------------------------------------------------}
  205. FUNCTION InputBox(Const Title, ALabel: String; Var S: String;
  206. Limit: Byte): Word;
  207. VAR R: TRect;
  208. BEGIN
  209. R.Assign(0, 0, 60, 8); { Assign screen area }
  210. R.Move((Desktop^.Size.X - R.B.X) DIV 2,
  211. (Desktop^.Size.Y - R.B.Y) DIV 2); { Position area }
  212. InputBox := InputBoxRect(R, Title, ALabel, S,
  213. Limit); { Create input box }
  214. END;
  215. {---------------------------------------------------------------------------}
  216. { InputBoxRect -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Sep99 LdB }
  217. {---------------------------------------------------------------------------}
  218. FUNCTION InputBoxRect(Var Bounds: TRect; Const Title, ALabel: String;
  219. Var S: String; Limit: Byte): Word;
  220. VAR C: Word; R: TRect; Control: PView; Dialog: PDialog;
  221. BEGIN
  222. Dialog := New(PDialog, Init(Bounds, Title)); { Create dialog }
  223. With Dialog^ Do Begin
  224. R.Assign(4 + CStrLen(ALabel), 2, Size.X - 3, 3); { Assign screen area }
  225. Control := New(PInputLine, Init(R, Limit)); { Create input line }
  226. Insert(Control); { Insert input line }
  227. R.Assign(2, 2, 3 + CStrLen(ALabel), 3); { Assign screen area }
  228. Insert(New(PLabel, Init(R, ALabel, Control))); { Insert label }
  229. R.Assign(Size.X - 24, Size.Y - 4, Size.X - 14,
  230. Size.Y - 2); { Assign screen area }
  231. Insert(New(PButton, Init(R, 'O~K~', cmOk,
  232. bfDefault))); { Insert okay button }
  233. Inc(R.A.X, 12); { New start x position }
  234. Inc(R.B.X, 12); { New end x position }
  235. Insert(New(PButton, Init(R, 'Cancel', cmCancel,
  236. bfNormal))); { Insert cancel button }
  237. Inc(R.A.X, 12); { New start x position }
  238. Inc(R.B.X, 12); { New end x position }
  239. SelectNext(False); { Select first button }
  240. End;
  241. Dialog^.SetData(S); { Set data in dialog }
  242. C := DeskTop^.ExecView(Dialog); { Execute the dialog }
  243. If (C <> cmCancel) Then Dialog^.GetData(S); { Get data from dialog }
  244. Dispose(Dialog, Done); { Dispose of dialog }
  245. InputBoxRect := C; { Return execute result }
  246. END;
  247. procedure InitMsgBox;
  248. begin
  249. ButtonName[0] := Labels^.Get(slYes);
  250. ButtonName[1] := Labels^.Get(slNo);
  251. ButtonName[2] := Labels^.Get(slOk);
  252. ButtonName[3] := Labels^.Get(slCancel);
  253. Titles[0] := Labels^.Get(sWarning);
  254. Titles[1] := Labels^.Get(sError);
  255. Titles[2] := Labels^.Get(sInformation);
  256. Titles[3] := Labels^.Get(sConfirm);
  257. end;
  258. procedure DoneMsgBox;
  259. begin
  260. end;
  261. END.
  262. {
  263. $Log$
  264. Revision 1.4 2002-09-07 15:06:38 peter
  265. * old logs removed and tabs fixed
  266. }