t3form.pp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. {
  2. Author: Vitaliy Trifonov
  3. }
  4. program form_test_3;
  5. {$MODE OBJFPC}
  6. uses
  7. ncurses, form;
  8. {$linklib c}
  9. procedure setlocale(cat : integer; p : pchar); cdecl; external 'c';
  10. const
  11. LC_ALL = 6;
  12. function st_middle(scrlen, itemlen: Smallint): Smallint; inline;
  13. begin
  14. st_middle := (scrlen - itemlen) div 2;
  15. end;
  16. procedure draw;
  17. function randomchar: chtype;
  18. var
  19. ch: Char = #0;
  20. begin
  21. while not (ch in ['0'..'9','A'..'Z','a'..'z']) do
  22. ch := Char(Random(123));
  23. randomchar := chtype(ch);
  24. end;
  25. function randompair: longint;
  26. var
  27. pair: longint = 0;
  28. begin
  29. while not (pair in [1..5]) do
  30. pair := Random(6);
  31. randompair := pair;
  32. end;
  33. var
  34. y, x: Smallint;
  35. begin
  36. for y := 0 to LINES - 1 do
  37. for x := 0 to COLS - 1 do
  38. mvaddch(y, x, randomchar OR COLOR_PAIR(randompair));
  39. end;
  40. const
  41. enumval: array[0..2] of PChar = ('one', 'two', 'three');
  42. desc: array[0..5] of PChar =
  43. (
  44. 'TYPE_ALPHA Char data, a min width 8',
  45. 'TYPE_ENUM one, two, three',
  46. 'TYPE_INTEGER -300 .. 300',
  47. 'TYPE_NUMERIC -30.0 .. 30.0',
  48. 'TYPE_REGEXP ^http://.+\.(ru|net|com)\s*$',
  49. 'TYPE_IPV4 An IP Version 4 address.'
  50. );
  51. var
  52. my_bg: Smallint = COLOR_BLACK;
  53. form_win: PWINDOW;
  54. pair: Smallint;
  55. field: array[0..6] of PFIELD;
  56. my_form: PFORM;
  57. i, frows, fcols, ch: Longint;
  58. begin
  59. try
  60. setlocale(LC_ALL, '');
  61. (* Initialize curses *)
  62. initscr();
  63. cbreak();
  64. noecho();
  65. keypad(stdscr, TRUE);
  66. (* Initialize colors *)
  67. if has_colors() then
  68. begin
  69. start_color();
  70. if (use_default_colors() = OK) then
  71. my_bg := -1
  72. else
  73. my_bg := COLOR_BLACK;
  74. init_pair(1, COLOR_YELLOW, my_bg);
  75. init_pair(2, COLOR_MAGENTA, my_bg);
  76. init_pair(3, COLOR_WHITE, my_bg);
  77. init_pair(4, COLOR_CYAN, my_bg);
  78. init_pair(5, COLOR_GREEN, my_bg);
  79. init_pair(6, COLOR_WHITE, COLOR_BLUE);
  80. init_pair(7, COLOR_BLACK, COLOR_CYAN);
  81. end;
  82. for i := 0 to 5 do
  83. begin
  84. field[i] := new_field(1, 30, 2 + i * 3, 10, 0, 0);
  85. field_opts_off(field[i], O_AUTOSKIP);
  86. if i AND 1 = 0 then
  87. pair := 7
  88. else
  89. pair := 6;
  90. set_field_fore(field[i], COLOR_PAIR(pair));
  91. set_field_back(field[i], A_UNDERLINE OR COLOR_PAIR(pair));
  92. //set_field_pad(field[i],chtype(' '));
  93. end;
  94. draw;
  95. refresh();
  96. field[6] := nil;
  97. set_field_type(field[0],TYPE_ALPHA,8);
  98. set_field_type(field[1],TYPE_ENUM,PPChar(enumval),0,0);
  99. set_field_type(field[2],TYPE_INTEGER,3,-300,300);
  100. set_field_type(field[3],TYPE_NUMERIC,8,-30.0,30.0);
  101. set_field_type(field[4],TYPE_REGEXP,'^http://.+\.(ru|net|com)\s*$');
  102. set_field_type(field[5],TYPE_IPV4);
  103. my_form := new_form(field);
  104. (* Calculate the area required for the form *)
  105. scale_form(my_form, @frows, @fcols);
  106. (* Create the window to be associated with the form *)
  107. //form_win := newwin(rows + 4, cols + 4, 4, 4);
  108. form_win := newwin(frows + 4, fcols + 4, st_middle(LINES,frows+4), st_middle(COLS,fcols+4));
  109. keypad(form_win, TRUE);
  110. (* Set main window and sub window *)
  111. set_form_win(my_form, form_win);
  112. set_form_sub(my_form, derwin(form_win, frows, fcols, 2, 2));
  113. (* Print a border around the main window and print a title *)
  114. box(form_win, 0, 0);
  115. //print_in_middle(my_form_win, 1, 0, cols + 4, "My Form", COLOR_PAIR(1));
  116. post_form(my_form);
  117. wrefresh(form_win);
  118. for i := 0 to 5 do
  119. mvwaddstr(form_win, 3 + i * 3, 1,desc[i]);
  120. wrefresh(form_win);
  121. //set_field_buffer(field[0], 0, 'Test Field');
  122. //refresh();
  123. (* Loop through to get user requests *)
  124. ch := wgetch(form_win);
  125. while (ch <> KEY_F(1)) AND (ch <> 27) do
  126. begin
  127. case ch of
  128. 9: { TAB }
  129. begin
  130. if form_driver(my_form, REQ_NEXT_WORD) <> E_OK then
  131. begin
  132. form_driver(my_form, REQ_VALIDATION);
  133. form_driver(my_form, REQ_NEXT_FIELD);
  134. form_driver(my_form, REQ_END_LINE);
  135. end;
  136. end;
  137. KEY_NPAGE:
  138. (* Go to next field *)
  139. begin
  140. form_driver(my_form, REQ_VALIDATION);
  141. form_driver(my_form, REQ_NEXT_FIELD);
  142. { Go to the end of the present buffer
  143. Leaves nicely at the last character }
  144. form_driver(my_form, REQ_END_LINE);
  145. end;
  146. KEY_PPAGE:
  147. (* Go to previous field *)
  148. begin
  149. form_driver(my_form, REQ_VALIDATION);
  150. form_driver(my_form, REQ_PREV_FIELD);
  151. form_driver(my_form, REQ_END_LINE);
  152. end;
  153. KEY_DOWN:
  154. if form_driver(my_form, REQ_DOWN_CHAR) <> E_OK then
  155. begin
  156. form_driver(my_form, REQ_VALIDATION);
  157. form_driver(my_form, REQ_DOWN_FIELD);
  158. end;
  159. KEY_UP:
  160. if form_driver(my_form, REQ_UP_CHAR) <> E_OK then
  161. begin
  162. form_driver(my_form, REQ_VALIDATION);
  163. form_driver(my_form, REQ_UP_FIELD);
  164. end;
  165. KEY_LEFT:
  166. if form_driver(my_form, REQ_LEFT_CHAR) <> E_OK then
  167. begin
  168. form_driver(my_form, REQ_VALIDATION);
  169. form_driver(my_form, REQ_LEFT_FIELD);
  170. form_driver(my_form, REQ_END_LINE);
  171. end;
  172. KEY_RIGHT:
  173. if form_driver(my_form, REQ_RIGHT_CHAR) <> E_OK then
  174. begin
  175. form_driver(my_form, REQ_VALIDATION);
  176. form_driver(my_form, REQ_RIGHT_FIELD);
  177. end;
  178. KEY_BACKSPACE: form_driver(my_form, REQ_DEL_PREV);
  179. 10: { ENTER }
  180. begin
  181. form_driver(my_form, 10);
  182. if form_driver(my_form, REQ_NEXT_LINE) <> E_OK then
  183. begin
  184. form_driver(my_form, REQ_VALIDATION);
  185. form_driver(my_form, REQ_NEXT_FIELD);
  186. form_driver(my_form, REQ_END_LINE);
  187. end;
  188. end;
  189. else
  190. { If this is a normal character, it gets
  191. Printed }
  192. form_driver(my_form, ch);
  193. end;
  194. ch := wgetch(form_win);
  195. end;
  196. finally
  197. unpost_form(my_form);
  198. free_form(my_form);
  199. delwin(form_win);
  200. endwin();
  201. for i := 0 to 5 do
  202. begin
  203. if field_status(field[i]) then
  204. begin
  205. writeln;
  206. writeln('Value ', i,':');
  207. writeln(field_buffer(field[i], 0));
  208. end;
  209. free_field(field[i]);
  210. end
  211. end;
  212. end.