t2form.pp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. program form_test_2;
  2. {$MODE OBJFPC}
  3. uses
  4. ncurses, form;
  5. {$linklib c}
  6. procedure setlocale(cat : integer; p : pchar); cdecl; external 'c';
  7. const
  8. LC_ALL = 6;
  9. var
  10. my_bg: Smallint = COLOR_BLACK;
  11. field: array[0..5] of PFIELD;
  12. my_form: PFORM;
  13. i, ch: Longint;
  14. begin
  15. try
  16. setlocale(LC_ALL, ''); { Tested with Russian UTF-8 locale }
  17. (* Initialize curses *)
  18. initscr();
  19. cbreak();
  20. noecho();
  21. keypad(stdscr, TRUE);
  22. (* Initialize colors *)
  23. if has_colors() then
  24. begin
  25. start_color();
  26. if (use_default_colors() = OK) then
  27. my_bg := -1
  28. else
  29. my_bg := COLOR_BLACK;
  30. init_pair(1, COLOR_YELLOW, my_bg);
  31. init_pair(2, COLOR_MAGENTA, my_bg);
  32. init_pair(3, COLOR_WHITE, my_bg);
  33. init_pair(4, COLOR_WHITE, COLOR_BLUE);
  34. init_pair(5, COLOR_WHITE, COLOR_GREEN);
  35. init_pair(6, COLOR_YELLOW, COLOR_GREEN);
  36. init_pair(7, COLOR_BLACK, COLOR_CYAN);
  37. end;
  38. (* Initialize the fields *)
  39. for i := 0 to 3 do
  40. begin
  41. field[i] := new_field(1, 30, 2 + i * 2, 10, 0, 0);
  42. field_opts_off(field[i], O_AUTOSKIP);
  43. end;
  44. field[4] := new_field(7, 30, 2, 42, 0, 0);
  45. field[5] := nil;
  46. (* Set field options *)
  47. set_field_fore(field[0], COLOR_PAIR(2));
  48. set_field_back(field[0], A_UNDERLINE OR COLOR_PAIR(3));
  49. set_field_fore(field[1], COLOR_PAIR(1));
  50. set_field_back(field[1], A_UNDERLINE OR COLOR_PAIR(1));
  51. field_opts_off(field[1], O_ACTIVE);
  52. set_field_fore(field[2], COLOR_PAIR(4));
  53. set_field_back(field[2], A_UNDERLINE OR COLOR_PAIR(4));
  54. field_opts_off(field[2], O_PUBLIC);
  55. set_field_fore(field[3], COLOR_PAIR(5));
  56. set_field_back(field[3], A_UNDERLINE OR COLOR_PAIR(5));
  57. field_opts_off(field[3], O_STATIC);
  58. set_field_fore(field[4], COLOR_PAIR(7));
  59. set_field_back(field[4], COLOR_PAIR(7));
  60. (* Create the form and post it *)
  61. my_form := new_form(field);
  62. post_form(my_form);
  63. (* Center Justification *)
  64. set_field_just(field[0], JUSTIFY_CENTER);
  65. set_field_buffer(field[0], 0, 'This is a static Field');
  66. set_field_just(field[1], JUSTIFY_CENTER);
  67. set_field_buffer(field[1], 0, 'This is a inactive Field');
  68. (* Set focus to the blue field *)
  69. set_current_field(my_form, field[0]);
  70. for i := 0 to 3 do
  71. mvprintw(2 + i * 2, 2, 'Value %d:', i + 1);
  72. mvaddstr(LINES - 2, 0, 'F1 to Exit');
  73. refresh();
  74. (* Loop through to get user requests *)
  75. ch := getch();
  76. while (ch <> KEY_F(1)) AND (ch <> 27) do
  77. begin
  78. case ch of
  79. 9: { TAB }
  80. begin
  81. if form_driver(my_form, REQ_NEXT_WORD) <> E_OK then
  82. begin
  83. form_driver(my_form, REQ_VALIDATION);
  84. form_driver(my_form, REQ_NEXT_FIELD);
  85. form_driver(my_form, REQ_END_LINE);
  86. end;
  87. end;
  88. KEY_NPAGE:
  89. (* Go to next field *)
  90. begin
  91. form_driver(my_form, REQ_VALIDATION);
  92. form_driver(my_form, REQ_NEXT_FIELD);
  93. { Go to the end of the present buffer
  94. Leaves nicely at the last character }
  95. form_driver(my_form, REQ_END_LINE);
  96. end;
  97. KEY_PPAGE:
  98. (* Go to previous field *)
  99. begin
  100. form_driver(my_form, REQ_VALIDATION);
  101. form_driver(my_form, REQ_PREV_FIELD);
  102. form_driver(my_form, REQ_END_LINE);
  103. end;
  104. KEY_DOWN:
  105. if form_driver(my_form, REQ_DOWN_CHAR) <> E_OK then
  106. begin
  107. form_driver(my_form, REQ_VALIDATION);
  108. form_driver(my_form, REQ_DOWN_FIELD);
  109. form_driver(my_form, REQ_END_LINE);
  110. end;
  111. KEY_UP:
  112. if form_driver(my_form, REQ_UP_CHAR) <> E_OK then
  113. begin
  114. form_driver(my_form, REQ_VALIDATION);
  115. form_driver(my_form, REQ_UP_FIELD);
  116. form_driver(my_form, REQ_END_LINE);
  117. end;
  118. KEY_LEFT:
  119. if form_driver(my_form, REQ_LEFT_CHAR) <> E_OK then
  120. begin
  121. form_driver(my_form, REQ_VALIDATION);
  122. form_driver(my_form, REQ_LEFT_FIELD);
  123. form_driver(my_form, REQ_END_LINE);
  124. end;
  125. KEY_RIGHT:
  126. if form_driver(my_form, REQ_RIGHT_CHAR) <> E_OK then
  127. begin
  128. form_driver(my_form, REQ_VALIDATION);
  129. form_driver(my_form, REQ_RIGHT_FIELD);
  130. end;
  131. KEY_BACKSPACE: form_driver(my_form, REQ_DEL_PREV);
  132. 10: { ENTER }
  133. begin
  134. form_driver(my_form, 10);
  135. if form_driver(my_form, REQ_NEXT_LINE) <> E_OK then
  136. begin
  137. form_driver(my_form, REQ_VALIDATION);
  138. form_driver(my_form, REQ_NEXT_FIELD);
  139. form_driver(my_form, REQ_END_LINE);
  140. end;
  141. end;
  142. else
  143. { If this is a normal character, it gets
  144. Printed }
  145. form_driver(my_form, ch);
  146. end;
  147. ch := getch();
  148. end;
  149. refresh();
  150. finally
  151. unpost_form(my_form);
  152. free_form(my_form);
  153. endwin();
  154. for i := 0 to 4 do
  155. begin
  156. if field_status(field[i]) then
  157. begin
  158. writeln;
  159. writeln('Value ', i,':');
  160. writeln(field_buffer(field[i], 0));
  161. end;
  162. free_field(field[i]);
  163. end
  164. end;
  165. end.