Skip to Content

Использование компонента StringGrid

Использование компонента StringGrid

Для ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional (рис. 5.2).


Рис. 5.2. Компонент StringGrid

Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 5.1 перечислены некоторые свойства компонента StringGrid.

Таблица 5.1. Свойства компонента StringGrid

Свойство Определяет
Name Имя компонента. Используется в программе для доступа к свойствам компонента
ColCount Количество колонок таблицы
RowCount Количество строк таблицы
Cells Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом cells [col, row]
FixedCols Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте
FixedRows Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте
Options.goEditing Признак допустимости редактирования содержимого ячеек таблицы. True — редактирование разрешено, False — запрещено
Options.goTab Разрешает (True) или запрещает (False) использование клавиши <Таb> для перемещения курсора в следующую ячейку таблицы
Options.GoAlways-ShowEditor Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу или сделать щелчок мышью
DefaultColWidth Ширину колонок таблицы
DefaultRowHeight Высоту строк таблицы
GridLineWi-dth Ширину линий, ограничивающих ячейки таблицы
Left Расстояние от левой границы поля таблицы до левой границы формы
Top Расстояние от верхней границы поля таблицы до верхней границы формы
Height Высоту поля таблицы
Width Ширину поля таблицы
Font Шрифт, используемый для отображения содержимого ячеек таблицы
ParentFont Признак наследования характеристик шрифта формы

В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 5.3. Компонент stringGrid используется для ввода массива, компоненты Label1 и Label2 — для вывода пояснительного текста и результата расчета, Buttoni — для запуска процесса расчета.


Рис. 5.3. Диалоговое окно программы Ввод и обработка массива

Добавляется компонент stringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 5.2. Значения свойств Height и width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.

Текст программы приведен в листинге 5.2.

Таблица 5.2. Значения свойств компонента StringGrid1

Свойство Значение
ColCount 5
FixedCols 0
RowCount 1
DefaultRowHeight 24
Height 24
DefaultColWidth 64
Width 328
Options.goEditing True
Options.AlwaysShowEditing True
Options.goTabs True

Листинг 5.2. Ввод и обработка массива целых чисел

  1. unit getar_;
  2. interface
  3.  
  4. uses
  5. Windows, Messages, SysUtils, Variants,
  6. Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
  7.  
  8. type
  9.  
  10. TForm1 = class(TForm)
  11. Label1: TLabel;
  12. StringGridl: TStringGrid;
  13. Button1: TButton;
  14. Label2: TLabel;
  15.  
  16. procedure ButtonlClick(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. var
  24. Form1: TForml ;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TForml.ButtonlClick(Sender: TObject);
  31. var
  32.  
  33. a : array[1..5] of integer; // массив
  34. summ: integer; // сумма элементов
  35. sr: real; // среднее арифметическое
  36. i: integer; // индекс
  37.  
  38. begin
  39.  
  40. // ввод массива
  41. // считаем, что если ячейка пустая, то соответствующий
  42. // ей элемент массива равен нулю
  43.  
  44. for i:= 1 to 5 do
  45.  
  46. if Length(StringGridl.Cells[i-1, 0]) <>0
  47. then a[i] := StrToInt(StringGridl.Cells[i-1,0])
  48. else a[i] := 0;
  49.  
  50. // обработка массива
  51.  
  52. summ := 0;
  53.  
  54. for i :=1 to 5 do
  55. summ := summ + a[i];
  56. sr := summ / 5;
  57.  
  58. У вывод результата Label2.Caption :=
  59. 'Сумма элементов: ' + IntToStr(summ)
  60. + #13+ 'Среднее арифметическое: ' + FloatToStr(sr);
  61.  
  62. end;
  63. end.

После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши . Сделать это можно при помощи процедуры обработки события onKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.

Текст процедуры обработки события OnKeyPress приведен в листинге 5.3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.

Листинг 5.3. Процедура обработки события OnKeyPress

  1. procedure TForm1.StringGridlKeyPress(Sender: TObject;
  2. var Key: Char);
  3. begin
  4.  
  5. case Key of
  6. #8,'0'..'9' : ; // цифры и клавиша <Backspace>
  7. #13: // клавиша <Enter>
  8. if StringGridl.Col < StringGridl.ColCount — 1
  9. then StringGridl.Col := StringGridl.Col + 1;
  10. else key := Chr(0); // остальные символы запрещены
  11.  
  12. end;
  13. end;

Если нужно ввести массив дробных чисел (a: array [1. .5] of real), то процедура обработки события OnKeyPress несколько усложнится, т. к. помимо цифр допустимыми символами являются символ-разделитель (запятая или точка — зависит от настройки Windows) и минус. С целью обеспечения некоторой дружественности программы по отношению к пользователю можно применить трюк: подменить вводимый пользователем неверный разделитель верным. Определить, какой символ-разделитель допустим в текущей настройке Windows, можно, обратившись к глобальной переменной Decimaiseparator.

В листинге 5.4 приведен текст модуля приложения ввода и обработки массива дробных чисел. Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов.

Листинг 5.4. Ввод и обработка массива дробных чисел

  1. unit. getar_1;
  2. interface
  3. uses
  4.  
  5. Windows, Messages, SysUtils, Variants, Classes,
  6. Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
  7.  
  8. type
  9.  
  10. TForm1= class(TForm)
  11. Label1: TLabel;
  12. StringGrid1: TStringGrid;
  13. Button1: TButton;
  14. Label2: TLabel;
  15.  
  16. procedure Button1ClicktSender: TObject);
  17. procedure StringGridlKeyPress(Sender: TObject; var Key: Char);
  18.  
  19. private
  20. { Private declarations }
  21. public
  22. { Public declarations }
  23. end;
  24.  
  25. var
  26. Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure TForm1.ButtonlClick(Sender: TObject);
  33. var
  34.  
  35. a : array[1..5] of real; // массив
  36. suram: real; // сумма элементов
  37. sr: real; // среднее арифметическое
  38. i: integer; // индекс
  39.  
  40. begin
  41.  
  42. // ввод массива
  43. // считаем, что если ячейка пустая, то соответствующий
  44. // ей элемент массива равен нулю
  45.  
  46. for i:= 1 to 5 do
  47. if Length(StringGridl.Cells[i-l,0])<>0 then
  48. a[i] := StrToFloat(StringGridl.Cells[i-1, 0]) else a[i] := 0;
  49.  
  50. // обработка массива
  51.  
  52. summ := 0;
  53.  
  54. for i :=1 to 5 do
  55. summ := summ + a[i];
  56. sr := summ / 5;
  57. // вывод результата
  58.  
  59. Label2.Caption :=
  60. 'Сумма элементов: ' + FloatToStr(summ)
  61. + #13+ 'Среднее арифметическое: ' + FloatToStr(sr); end;
  62. // Функция обеспечивает ввод в ячейку только допустимых символов
  63.  
  64. procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
  65. begin
  66.  
  67. case Key of
  68. #8,'0'..'9' : ; // цифры и <Backspace>
  69. #13: // клавиша <Enter>
  70. if StringGridl.Col < StringGridl.ColCount - 1 then
  71. StringGridl.Col := StringGridl.Col + 1; '.',',':
  72. // разделитель целой и дробной частей числа
  73. begin
  74. if Key <> DecimalSeparator then
  75. Key := DecimalSeparator; // заменим разделитель
  76.  
  77. // на допустимый
  78.  
  79. if Pos(StringGridl.Cells[StringGridl.Col,0],DecimalSeparator) <> 0
  80. then Key := Chr(O); // запрет ввода второго
  81.  
  82. // разделителя end;
  83.  
  84. ' -' : // минус можно ввести только первым символом,
  85. // т. е. когда ячейка пустая
  86.  
  87. if Length(StringGrid1.Cells[StringGrid1.Col, 0]) <>0 then
  88. Key := Chr(0) ;
  89. else // остальные символы запрещены
  90. key := Chr(0);
  91.  
  92. end;
  93. end;
  94. end.

Комментарии

free аватар

с натяжкой

=(((((((

katenokcom аватар

Спасибо!

Спасибо!



Delphi Для профессионалов &1   |    Delphi Для профессионалов &2   |    Delphi Для профессионалов &3   |    Иллюстрированный самоучитель &1   |    Иллюстрированный самоучитель &2