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