TStringGrid/ru: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | ------------------------------------------------------------------------ | |
| 2 | 2 | ||
| 3 | 3 | --Zoltanleo 00:38, 6 October 2018 (CEST) Ввиду сложности дословного перевода текста с английского на русский слова, требующиеся по смыслу, но отсутствующие в английской версии, указаны в квадратных скобках. | |
| 4 | 4 | ||
| 5 | 5 | ------------------------------------------------------------------------ | |
| 6 | 6 | ||
| 7 | 7 | **TStringGrid**  это компонент с вкладки [[Additional tab/ru|Additional tab]] палитры компонент [[Component Palette/ru|Component Palette]]. Stringgrid обеспечивает табличное представление текстовой информации, которая может быть отредактирована. | |
| 8 | 8 | ||
| 9 | 9 | ## Пример программы StringGrid | |
| 10 | 10 | ||
| 11 | 11 | Чтобы создать этот пример, создайте новый проект в Lazarus. Выберите TStringGrid, чтобы добавить на форму, щелкнув компонент TStringGrid из области меню или окна компонента, затем нажмите на форму. В этом случае, как показано \[на рисунке\], также были выбраны и брошены на форму две кнопки [[TButton/ru|TButton]]. В этом примере также необходимо выбрать компонент [[TOpenDialog/ru|TOpenDialog]] и поместить его в форму.\ | |
| 12 | 12 | ||
| 13 | 13 |  | |
| 14 | 14 | ||
| 15 | 15 | ## Настройка столбцов и изменение их свойств | |
| 16 | 16 | ||
| 17 | 17 | Столбцы могут быть легко добавлены щелчком правой кнопки мыши 'Columns: TGridColumns':\ | |
| 18 | 18 | ||
| 19 | 19 | \ | |
| 20 | 20 | ||
| 21 | 21 | При выборе AddItem, новый столбец отобразится ниже. На вкладке Properties \[в окне\] Object Inspector отображается новый список Properties\[(свойств)\] и Events\[(событий)\], относящихся к этому столбцу. Отсюда имена столбцов задаются вместе с шириной. Когда закончите \[добавлять столбцы\], TreeView будет выглядеть так:\ | |
| 22 | 22 | ||
| 23 | 23 | \ | |
| 24 | 24 | ||
| 25 | 25 | В этом примере имя Button1 было изменено на ButtonAddFiles, а имя Button2 было изменено на ButtonExit. StringGrid1 был растянут и кнопки были выровнены, как показано \[на рисунке\]. Обратите внимание, что есть строка и столбец другого цвета. Это состояние иллюстрирует концепцию, что эта строка и столбец могут быть \[предназначена\] для ярлыков заголовков соответствующего столбца или строки. Конечно, это состояние по умолчанию можно изменить, просто изменив 'FixedCols' или 'FixedRows' в Object Inspector.\ | |
| 26 | 26 | ||
| 27 | 27 | \ | |
| 28 | 28 | ||
| 29 | 29 | В этом случае вы можете увидеть, что строки заголовков изменены, а компонент StringGrid1 привязан \[к краям формы\]. Это было достигнуто путем выполнения двух шагов. ***Первый*** включает в себя просмотр Object Inspector и выбор различных свойств по мере необходимости. Один шаг, который следует предпринять при запуске, - это внимательно посмотреть свойства по умолчанию. Когда вы внесли многочисленные изменения и вам нужно \[отменить изменения\] , \[то сделать\] это намного проще, если вы знаете, каково было их состояние в начале или на различных этапах \[изменений\]. Состояние этих свойств на последнем изображении иллюстрирует только одну фиксированную строку с заголовками столбцов. Это состояние иллюстрируется \[следующим кодом\]\ | |
| 30 | 30 | ||
| 31 | - | ||
| 32 | - | ||
| 33 | - | ||
| 34 | - | ||
| 35 | - | ||
| 36 | - | ||
| 37 | - | ||
| 38 | - | ||
| 39 | - | ||
| 31 | + | ```text | |
| 32 | + | FixedCols[0], | |
| 33 | + | FixedRows[1], | |
| 34 | + | HeaderHotZones[gzFixedCols], | |
| 35 | + | HeaderPushZones[gzFixedCols], | |
| 36 | + | Options[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goSmoothScroll], | |
| 37 | + | TitleFont[Color[clPurple]], | |
| 38 | + | Style[fsBold], and | |
| 39 | + | RowCount = 1. | |
| 40 | + | ``` | |
| 40 | 41 | ||
| 41 | 42 | После просмотра \[результатов\] вашей работы путем нажатия кнопки Run в Lazarus, возможно вы пожелаете изменить эти свойства. В этом случае были выбраны дополнительные свойства ColClickSorts и AlternateColor. | |
| 42 | 43 | ||
| 43 | 44 | ***Второе***, что можно сделать, это использовать Редактор Привязок (View -\> AnchorEditor), чтобы привязать стороны StringGrid к основной формой. | |
| 44 | 45 | ||
| 45 | 46 | ## Использование доступных предопределенных свойств | |
| 46 | 47 | ||
| 47 | 48 | В нижней части Object Inspector вы можете найти полезную информацию о свойствах, показанных в этом примере:\ | |
| 48 | 49 | \ | |
| 49 | 50 | ||
| 50 | 51 | Чтобы внести информацию в компонент StringGrid1, необходимо либо добавить данные из TStream/LoadCVSFile, либо связать сетку с базой данных, либо \[совершить\] другие подобные действия. Если привязываться к базе данных, \[для этих целей лучше использовать\] компоненты, как TDBGrid. Другие компоненты, такие как OpenDialog, также могут помочь в использовании таких методов, как LoadCVSFile. Во многих случаях необходимо напрямую связывать данные либо с указанными ячейками, либо с диапазонами. В нашем примере мы будем использовать метод InsertRowWithValues. Для этого необходимо добавить к ButtonAddFiles событие \[нажатия на кнопку\], щелкнув вкладку 'Events' Object Inspector'а и выбрав событие 'OnClick'.\ | |
| 51 | 52 |  | |
| 52 | 53 | ||
| 53 | 54 | ## Программная блокировка добавления данных в StringGrid | |
| 54 | 55 | ||
| 55 | 56 | При создании обработчика события *OnClick* для кнопки *ButtonAddFilesClick* редактор кода SourceEditor должен создать блок кода для процедуры *ButtonAddFilesClick*. К этому вы должны добавить следующий код: | |
| 56 | 57 | ||
| 57 | 58 | ``` pascal | |
| 58 | 59 | uses | |
| 59 | 60 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, | |
| 60 | 61 | Grids, LazFileUtils, LazUtf8; | |
| 61 | 62 | . . . . | |
| 62 | 63 | types | |
| 63 | 64 | { TForm1 } | |
| 64 | 65 | TForm1 = class(TForm) | |
| 65 | 66 | ButtonAddFiles : TButton; | |
| 66 | 67 | . . . . | |
| 67 | 68 | procedure ButtonAddFilesClick(Sender : TObject); | |
| 68 | 69 | procedure ButtonExitClick(Sender : TObject); | |
| 69 | 70 | . . . . | |
| 70 | 71 | var | |
| 71 | 72 | Form1 : TForm1; | |
| 72 | 73 | implementation | |
| 73 | 74 | {$R *.lfm} | |
| 74 | 75 | { TForm1 } | |
| 75 | 76 | procedure TForm1.ButtonExitClick(Sender : TObject); | |
| 76 | 77 | begin | |
| 77 | 78 | Close; | |
| 78 | 79 | end; | |
| 79 | 80 | ... | |
| 80 | 81 | procedure TForm1.ButtonAddFilesClick(Sender : TObject); | |
| 81 | 82 | var | |
| 82 | 83 | FilePathName : string; | |
| 83 | 84 | begin | |
| 84 | 85 | if OpenDialog1.Execute then | |
| 85 | 86 | FilePathName := OpenDialog1.Filename; | |
| 86 | 87 | AddFilesToList(FilePathName); | |
| 87 | 88 | end; | |
| 88 | 89 | ``` | |
| 89 | 90 | ||
| 90 | 91 | Процедура закрытия приложения показана для полноты. В процедуре *ButtonAddFilesClick* теперь мы используем *OpenDialog1* и выбираем метод *Execute*. Как показано в выражении *if-then*, там проверяется логическое свойство execute. Этот метод по умолчанию имеет значение true, поэтому следующая строка при выполнении дает свойство *OpenDialog1* 'FileName' нашей переменной 'FilePathName'. | |
| 91 | 92 | ||
| 92 | 93 | В последней строке кода показана новая процедура *AddFilesToList*. Теперь нам нужно создать эту процедуру. В объявлении типов в разделе *Public* или *Private* нам нужно добавить эту новую процедуру. В процессе реализации \[(по умолчанию \<Shift\>+\<Ctrl\>+\<C\>)\] создается кодовый блок для процедуры. В этом примере мы будем использовать файлы DVD, как показано на этой иллюстрации:\ | |
| 93 | 94 | ||
| 94 | 95 | \ | |
| 95 | 96 | Мы хотим, чтобы эти файлы были перечислены в StringGrid1. | |
| 96 | 97 | ||
| 97 | 98 | ``` pascal | |
| 98 | 99 | Type | |
| 99 | 100 | . . . . | |
| 100 | 101 | private | |
| 101 | 102 | procedure AddFilesToList(FilePathName : String); | |
| 102 | 103 | . . . . | |
| 103 | 104 | procedure TForm1.AddFilesToList(FilePathName : String); | |
| 104 | 105 | var | |
| 105 | 106 | D, R, K : integer; | |
| 106 | 107 | FileName, FilePath : string; | |
| 107 | 108 | SearchRec1, SearchRec2 : TSearchRec; | |
| 108 | 109 | FileListVideo, FileListVst : TStringList; | |
| 109 | 110 | begin | |
| 110 | 111 | FileListVideo := TStringList.Create; | |
| 111 | 112 | FileListVst := TStringList.Create; | |
| 112 | 113 | FileName := ExtractFileName(FilePathName); | |
| 113 | 114 | FilePath := ExtractFilePath(FilePathName); | |
| 114 | 115 | FileListVideo := FindAllFiles(FilePath,'VIDEO_TS.*',true, faDirectory); | |
| 115 | 116 | R := 1; | |
| 116 | 117 | K := 0; | |
| 117 | 118 | for D := 0 to FileListVideo.Count -1 do | |
| 118 | 119 | begin | |
| 119 | 120 | if FindFirstUtf8(FilePath, faAnyFile and faDirectory, SearchRec1)=0 then | |
| 120 | 121 | begin | |
| 121 | 122 | repeat | |
| 122 | 123 | With SearchRec1 do | |
| 123 | 124 | begin | |
| 124 | 125 | FileName := ExtractFileName(FileListVideo.Strings[D]); | |
| 125 | 126 | K := FileSizeUtf8(FileListVideo.Strings[D]); | |
| 126 | 127 | StringGrid1.InsertRowWithValues(R,['0', FileName, IntToStr(K)]); | |
| 127 | 128 | R := R + 1; | |
| 128 | 129 | end; | |
| 129 | 130 | until FindNextUtf8(SearchRec1) <> 0; | |
| 130 | 131 | end; | |
| 131 | 132 | FindCloseUtf8(SearchRec1); | |
| 132 | 133 | end; | |
| 133 | 134 | . | |
| 134 | 135 | FileListVst := FindAllFiles(FilePath, 'VTS_*.*', true, faDirectory); | |
| 135 | 136 | K := 0; | |
| 136 | 137 | for D := 0 to FileListVst.Count -1 do | |
| 137 | 138 | begin | |
| 138 | 139 | if FindFirstUtf8(FilePath, faAnyFile and faDirectory,SearchRec2)=0 then | |
| 139 | 140 | begin | |
| 140 | 141 | repeat | |
| 141 | 142 | With SearchRec2 do | |
| 142 | 143 | begin | |
| 143 | 144 | FileName := ExtractFileName(FileListVst.Strings[D]); | |
| 144 | 145 | K := FileSizeUtf8(FileListVst.Strings[D]); | |
| 145 | 146 | StringGrid1.InsertRowWithValues(R,['1', FileName, IntToStr(K)]); | |
| 146 | 147 | R := R + 1; | |
| 147 | 148 | end; | |
| 148 | 149 | until FindNextUtf8(SearchRec2) <> 0; | |
| 149 | 150 | end; | |
| 150 | 151 | FindCloseUtf8(SearchRec2); | |
| 151 | 152 | end; | |
| 152 | 153 | StringGrid1.SortColRow(true, 1,1,StringGrid1.RowCount-1); | |
| 153 | 154 | FileListVst.Free; | |
| 154 | 155 | FileListVideo.Free; | |
| 155 | 156 | end; | |
| 156 | 157 | ``` | |
| 157 | 158 | ||
| 158 | 159 | В этом примере используются методы 'FindAllFiles' из 'FileUtils' и 'FindFirstUtf8', 'FindNextUtf8' и 'FindCloseUtf8' из 'LazFileUtils'. | |
| 159 | 160 | ||
| 160 | 161 | ## Столбцы с CheckBox | |
| 161 | 162 | ||
| 162 | 163 | Одна из функций, которая может быть очень полезна в приложениях TStringGrid, имеет столбец с checkbox, по которому пользователь либо может щелкнуть, чтобы обозначить его выбор, либо использовать для отображения определенного состояния для некоторого свойства. Добавление этого типа столбца показано в этом коде. В методе *InsertRowWithValues* первый столбец имеет '0', показанный в первой части кода, когда выбираются файлы, содержащие 'VIDEO_TS*'. '0' иллюстрирует логическое состояние checkbox'а, как отмеченный (1) и не отмеченный (0). При выборе в Object Inspector'е StringGrid1 -\> Columns: TGridColumns -\> 0-Select в TreeView отображаются значения ValueChecked и ValueUnchecked. Вы можете использовать другие числа или добавить код для изменения состояния. | |
| 163 | 164 | ||
| 164 | 165 | ## Метод InsertRowWithValues | |
| 165 | 166 | ||
| 166 | 167 | В этом примере метод InsertRowWithValues используется для добавления данных в наш компонент StringGrid1. Данные каждого столбца вводятся с запятой. Может потребоваться использование функций приведения типов для получения данных в строковом формате. Переменные могут быть ссылками или просто отображаться как текст, так как наши '0' и '1' относятся к столбцу checkbox'а.\ | |
| 167 | 168 | ||
| 168 | 169 |  | |
| 169 | 170 | ||
| 170 | 171 | После запуска нашего нового приложения и нажатия кнопки 'AddFiles' открывается диалоговое окно, позволяющее нам выбрать файл(ы), который нужно добавить. Если вы нажмете на заголовок столбца, StringGrid1 будет отсортирован в направлении, указанном зеленой стрелкой. Результат должен выглядеть так, как показано на следующем рисунке:\ | |
| 171 | 172 | ||
| 172 | 173 |  | |
| 173 | 174 | ||
| 174 | 175 | В зависимости от ваших потребностей могут быть выбраны другие свойства, позволяющие редактировать, изменять размеры столбцов и т.д. | |
| 175 | 176 | ||
| 176 | 177 | ## См. также | |
| 177 | 178 | ||
| 178 | 179 | - [[TDrawGrid/ru|TDrawGrid]] | |
| 179 | 180 | - [[TDBGrid/ru|TDBGrid]] | |
| 180 | 181 | - [[Grids Reference Page/ru|Grids Reference Page]] | |
| 181 | 182 | ||
| 182 | 183 | --- | |
| 183 | 184 | *From the Free Pascal wiki, page "TStringGrid/ru", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
