Свойства и методы AdvStringGrid
15.04.2011
В данной заметке я постараюсь описать свойства, события, функции и процедуры компонента AdvStringGrid из набора TMS Component Pack. Заметка постоянно обновляется. И просьба всем интересующимся — задавайте свои вопросы в комментариях, ответами на которые я буду пополнять заметку.
AdvStringGrid является по своей сути сильно расширенной версией обычного StringGrid. Увеличенная в десятки раз функциональность позволит вам работать быстрее и качественнее. Ниже представлены основные свойства, процедуры и функции компонента, а также их краткое описание.
Свойства и/или Методы рассмотренные более подробно в других заметках — подчёркнуты и кликабельны.
Свойства (property)
Устанавливают цвет выделенной ячейки.
AdvStringGrid1.ActiveCellColor : TColor;
AdvStringGrid1.ActiveCellColorTo : TColor;
Настройки шрифта выделенных фиксированных ячеек.
AdvStringGrid1.ActiveCellFont : TFont;
Определяет, будет ли подсвечиваться выделенная ячейка цветом указанным в свойствах ActiveCellColor и ActiveCellColorTo
AdvStringGrid1.ActiveCellShow : Boolean;
Цвет подсветки всей строки, в которой выделена ячейка.
AdvStringGrid1.ActiveRowColor : TColor;
Включена или выключена подсветка всей строки, в которой выделена ячейка.
AdvStringGrid1.ActiveRowShow : boolean;
Включена или выключена подсветка всей строки, в которой выделена ячейка.
AdvStringGrid1.Align : boolean;
Устанавливает количество строк.
AdvStringGrid1.RowCount : integer;
Возвращает текстовое значение ячейки [c,r].
AdvStringGrid1.Cells[c: integer; r: integer] : String;
Устанавливает количество столбцов.
AdvStringGrid1.ColCount : integer;
Аналогично свойству Cells возвращает значение ячейки, но уже в типе integer. В отличии от подхода strtoint(AdvStringGrid1.Cells[c,r]) адекватно работает если ячейка равна нулю (0) и если она вообще пустая.
AdvStringGrid1.Ints[ACol: integer; ARow: integer] : integer;
Устанавливает стиль таблиц.
AdvStringGrid1.Look : TGridLook;
Выравнивание по вертикали в ячейке.
AdvStringGrid1.VAlignment : TVAlignment;
Методы
Добавляет новую строку в конец таблицы.
AdvStringGrid1.AddRow;
Добавляет новый столбец справа.
AdvStringGrid1.AddColumn;
Добавляет переключатели Radio button в ячейку.
AdvStringGrid1.AddRadio(ACol, ARow, DirRadio, IdxRadio: integer; sl: TStrings);
Очищает все ячейки таблицы.
AdvStringGrid1.ClearAll;
Очищает все ячейки в столбцах с ColIndex до ColIndex+CCount, где ColIndex — номер столбца, а CCount — количество очищаемых строк.
AdvStringGrid1.ClearCols(ColIndex: Integer; CCount:Integer);
Очищает все ячейки в строках с RowIndex до RowIndex+RCount, где RowIndex — номер строки, а RCount — количество очищаемых строк.
AdvStringGrid1.ClearRows(RowIndex: Integer; RCount: Integer);
Возвращает номер родительской строки, родительские строки образуются при группировке.
AdvStringGrid1.GetParentRow(ARow: integer):integer;
Возвращает индекс выбранного переключателя в ячейке ACol, ARow.
AdvStringGrid1.GetRadioIdx(ACol, ARow: integer; var IdxRadio: Integer): Boolean;
Возвращает номер выбранной строки (счёт с нуля), скрытые строки не учитываются.
AdvStringGrid1.GetRowEx;
Возвращает номер выбранной строки (счёт с нуля), скрытые строки учитываются.
AdvStringGrid1.GetRealRow;
Возвращает номер выбранного столбца (счёт с нуля).
AdvStringGrid1.GetRealCol;
Проверяет, есть ли в ячейке переключатели.
AdvStringGrid1.IsRadioAcol, Arow: Integer): Boolean;
Перемещает строку с номером FromIndex в позицию ToIndex.
AdvStringGrid1.MoveRow(FromIndex: integer; ToIndex: integer);
Перемещает столбец с номером FromIndex в позицию ToIndex.
AdvStringGrid1.MoveColumn(FromIndex: integer; ToIndex: integer);
Объединяет ячейки, где c и r номера строки столбца крайней левой ячейки участвующей в объединение. spanx — количество объединяемых ячеек по горизонтали, spany — количество объединяемых ячеек по вертикали. После объединения обращение к новой ячейке идёт по c и r.
AdvStringGrid1.MergeCells(c: integer; r: integer; spanx: integer; spany: integer);
Удаляет из выбранной ячейки переключатели Radio button.
AdvStringGrid1.RemoveRadio(ACol, ARow: Integer);
Выбирает переключатель в ячейке.
AdvStringGrid1.SetRadioIdx(ACol, ARow, IdxRadio: integer): Boolean;
У AdvStringGrid довольно большие возможности экспорта и импорта, если с обычным StringGrid при экспорте в Excel необходимо было написать свою процедуру, то тут всё сделано до нас. Ниже список всех процедур для сохранения, подробнее можно прочитать в этой заметке.
AdvStringGrid1.SaveToFile(FileName: String);
AdvStringGrid1.SaveToCSV(FileName: String);
AdvStringGrid1.SaveToASCII(FileName: String);
AdvStringGrid1.SaveToBinFile(FileName: String);
AdvStringGrid1.SaveToBinStream(Stream: TStream);
AdvStringGrid1.SaveToHTML(FileName: String; [Show: Boolean = false]);
AdvStringGrid1.SaveToHTMLString(dir: String);
AdvStringGrid1.SaveToXML(FileName: String; ListDescr: String; RecordDescr: String; FieldDescr: TString; [ExportEmptyCells: Booleam = false]);
AdvStringGrid1.SaveToFixed(FileName: String; positions: TIntList);
AdvStringGrid1.SaveToStream(Stream: TStream);
AdvStringGrid1.SaveToXLS(FileName: String; [CreateNewSheet: Boolean = true]);
AdvStringGrid1.SaveToXLSSheet(FileName: String; SheetName: String);
AdvStringGrid1.SaveToDOC(FileName: String; [CreateNewDocument: Boolean = true]);
И не менее внушительный список процедур для импорта:
AdvStringGrid1.LoadFromXML(FileName: string; [LevelToRow: Boolean = False]; [LoadFieldDescr: Boolean = True]);
AdvStringGrid1.LoadFromFile(FileName: string);
AdvStringGrid1.LoadFromBinFile(FileName: string);
AdvStringGrid1.LoadFromBinStream(Stream: TStream);
AdvStringGrid1.LoadFromCSV(FileName: string; [MaxRows: Integer = 1]);
AdvStringGrid1.LoadFromFixed(FileName: string; positions: TIntList; [DoTrim: Boolean = True]; [MasRows: Integer = -1]);
AdvStringGrid1.LoadFromStream(Stream: TStream);
AdvStringGrid1.LoadFromXLS(FileName: string);
AdvStringGrid1.LoadFromXLSSheet(FileName: string; SheetName: string);
AdvStringGrid1.LoadFromMDBTable(FileName: string; Table: string);
AdvStringGrid1.LoadFromMDBSQL(FileName: string; SQL: String);
Содержание
TAdvStringGrid
не дописано
Дока 200 страниц
Описание в каком примере что раздел Samples
Дока
-
C:CompTMSDocTMS TAdvStringGrid Developers Guide.pdf
Основные свойства
-
у каждой ячейки свой цвет и шрифт
-
кликабельные ссылки (включить UrlShow, UrlShowInText). URLFull := false — будет убирать http
-
ellipsis — есть кнопка у ячейки. Свойство грида EnhTextSize=true — заканчивать текст многоточием (и в ячейке и в заголовке колонки).
-
хинты — включить HintShowLargeText — показывает текст, который не поместился в ячейке (также ShowHint=true)
-
Rich text cells
-
HTML formatted cells
-
автофит колонки по двойному клику. Метод AutoSizeColumns
-
вставка и удаление строк по клавише INS, DEL
-
автосортировка по клику по заголовку
-
ActiveRowShow — может подсвечивать текущую строку (не выделяя)
-
ActiveCellShow — подсвечивает заголовок строки и колонки
-
Incremental key lookup
-
Dynamic scroll hinting
-
автонумерация колонки AutoNumberCol(0), AutoNumberRow, AutoNumberStart
-
OLE drag & drop within grid and between grid and Excel, Word, …
RowHeaders: TStringList — список заголовков строк, можно быстро задать заголовки колонок
ColumnHeaders: TStringList — заголовки колонок
Options.RowSizing, Options.ColSizing
ControlLook — множество настроек встроенных контролов (прогрессбара, кнопки, радио и т.п.)
DefaultColWidth, FixedColWidth, DefaultAlignment, DefaultRowHeight
FixedDropDownMenu, FixedFont, FixedRightCols
FloatFormat
EnableHTML — включен по умолчанию
ShowSelection — если отключить, не закрашивает текущее выделение, но исчезает мультиселект
Bands — раскраска четных / нечетных строк, причем можно задавать сколько строк одного цвета, сколько строк другого цвета
Grid.FocusCell — перейти к ячейке
Grid.EditCell — перейти в режим редактирования указанной ячейки
Grid.HideInplaceEdit; ShowInplaceEdit; — для текущей ячейки
Событие CanEditCell — динамически задать какие ячейки можно редактировать.
Сохранить состояние колонок
1) через свойство grid.ColumnSize
ColumnSize — автосохранение в реестр или ини-файл. Имя файла задавать в ColumnSize.Key, Section обязательно задавать, Save = true
ColumnSize.Stretch — ширина одной или нескольких колонок адаптируются так, чтобы грид заполнил клиентскую область. Если ширина грида уже превышает область, ничего не делает. StretchColumn задает колонку для растягивания. -1 означает самую правую колонку (по умолчанию).
ColumnSize.StretchAll — все колонки растягиваются пропорционально.
SynchWithGrid — ширина колонок увеличивается пропорционально увеличению ширины грида.
2) метод AdvStringGrid1.ColumnStatesToString, StringToColumnStates — ширина колонок, видимость, порядок колонок
Код (demo asg68)
метод AdvStringGrid1.LinearFill(true); — заполняет ячейки по типу 1:1,1:2, 1:3… 2:1,2:2…
RandomFill(false, 100); — заполнить случайными числами
Текущая ячейка
Событие OnSelectCell срабатывает когда происходит смена текущей ячейки (столбца и/или строки).
procedure TForm1.AdvStringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
можно использовать для отображения дополнительной информации о ячейке — на палитре инструментов показать размер шрифта или вывести дополнительную информацию в статусную строку.
-
FontNames[ACol, ARow]
-
FontSizes[ACol, ARow]
-
BoldButton.Down := fsBold in FontStyles[ACol, ARow];
-
LeftAlign.Down := Alignments[ACol, Row] = taLeftJustify
Печать
печать с настройками: заголовок, авторазмер колонок, нумерация страниц, выбор отдельного шрифта для печати, перенос колонок на следующий лист, печать выбранного диапазона, повтор фиксированных строк и колонок на каждом листе, автоподгонка под страницу, превью, печать двух и более гридов на странице, html-форматирование на печати и пр.
Удобный диалог в инспекторе: свойство PrintSettings
. Компонент TAdvGridPrintSettingsDialog.
Превью:
with AdvStringGrid1.printsettings do begin FixedHeight := Strtoint(edit2.text) * 10; LeftSize := Strtoint(edit3.text) * 10; HeaderSize := Strtoint(edit4.text) * 10; Borders := pbSingle; // Borders := pbNoborder; - печатать границы ячеек end; AdvPreviewDialog1.Grid := AdvStringGrid1; AdvPreviewDialog1.Execute;
Сохранить настройки: AdvStringGrid1.SavePrintSettings
Сортировка
Свойство SortSettings
-
Column — индекс главной колонки для сортировки
-
Row — в какой строке глифы сортировки. Row полезно задавать когда несколько фиксированных строк в гриде.
-
Show — показывать ли
-
BlankPos — first, last — позиция пустых ячеек
-
IgnoreBlanks, IgnoreCase: Boolean
-
DefaultFormat — много алгоритмов сортировки
-
AutoFormat — пытается сам угадать формат данных и выбрать алгоритм сортировки
-
Direction, InitSortDirection — направление сортировки
-
DownGlyph, UpGlyph
-
SingleColumn: Boolean — только по одной колонке сортировать
-
Full — сортирует по всем колонкам слева направо, начиная с главной колонки
-
UndoSort: Boolean — если true, то клик по заголовку переключает между сортировкой возрастающей, убывающей и не сортированные данные (то есть порядок перед первой сортировкой).
-
AutoColumMerge — принимать во внимание при сортировке
-
HeaderColor — если задан, это цвет заголовка
-
SortOnVirtualCells — если true, то будет сортировать по тексту OnGetDisplText вместо реальных данных.
-
OnGetFormat — формат данных
Мультисортировка — должен быть включен Full, SingleColumn = false:
-
IndexColor — цвет индикаторов сортировки
-
IndexShow — показывать номер колонке в сортировки
-
IndexSortKey — зажимать Shift или Ctrl для мультисортировки
Задание алгоритма:
procedure TDemo.AdvStringGrid1GetFormat(Sender: TObject; ACol: Integer; var AStyle: TSortStyle; var aPrefix, aPostfix: string); begin case ACol of 2: AStyle := ssAlphabetic; 3: AStyle := ssNumeric; 4: AStyle := ssDate; 5: begin AStyle := ssNumeric; aPostfix := 'pk'; end; 6: begin AStyle := ssFinancial; aPrefix := '$ '; end; end; end;
Сортировка по колонке программно — QSort, QUnSort и SortSettings.ToggleDirection:
AdvStringGrid1.SaveFixedCells := false; AdvStringGrid1.LoadFromCSV('.cars.csv'); AdvStringGrid1.SortSettings.Column := 1; AdvStringGrid1.QSort;
Индикация процесса:
Код
Кастомная сортировка: два события OnCustomCompare и OnRawCompare — когда sort format style is specified as ssCustom или ssRaw.
OnCustomCompare — должен сравнить 2 строки и вернуть 0, 1, -1
OnRawCompare — получает координаты ячеек для сравнения. Полезно если к ячейке привязан объект:
Grid.Objects[Col,Row] := TObject(1234);
Сортировка групп — сортирует только строки в одной группе — grid.QSortGroup
QSortIndexed — программная сортировка по нескольким колонкам.
код
Игнорирование колонок: (полезно если включено Full)
grid.IgnoreColumns.Clear; // clear any previous set ignored columns grid.IgnoreColumns.Add(2); // ignore column 2 during sort grid.IgnoreColumns.Add(5); // ignore column 5 during sort
Сохранение/восстановление:
TSortSettings.SaveToString: string; TSortSettings.LoadFromString(const Value: string);
Группировки
Встроенные группировки первого уровня :
procedure Group(ColIndex: integer); // сгруппировать по колонке procedure UnGroup; property GroupColumn: integer; // индекс колонки; -1 если группировка не активна procedure SubGroup(ColIndex: integer);
Как понимаю, автоматически создает ноды. Нормальная сортировка меняется на сортировку в группе.
AdvStringGrid.Group(5) — одно и то же AdvStringGrid.GroupColumn := 5;
Нулевая колонка отводится под +/- (по ней группировать нельзя естественно).
Свойство Grouping — настройки групп, например, MergeHeader, MergeSummary: boolean; ShowGroupCount, Summary: Boolean;
AdvStringGrid1.GroupColumn — номер колонки для группировки
AdvStringGrid1.InsertCols(0,1); AdvStringGrid1.ColWidths[0] := 20; AdvStringGrid1.GroupColumn := 1; AdvStringGrid1.SortSettings.Column := 1; AdvStringGrid1.QSortGroup;
Пример C:CompTMSDemosAdvStringGridasg38 и 14
код…
Итоговая строка в группе
Показывает в заголовке группы если нет итоговой строки. Вызвать одну из функций для каждой колонки, в которой нужны итоги.
grid.GroupSum(AColumn: Integer); grid.GroupAvg(AColumn: Integer); Grid.GroupMin(AColumn: Integer); Grid.GroupMax(AColumn: Integer); Grid.GroupCount(AColumn: Integer); Grid.GroupDistinct(AColumn: Integer); Grid.GroupStdDev(AColumn: Integer);
Grid.GroupCustomCalc(AColumn: Integer);
Позволяет выполнить любые вычисления в событии OnGroupCalc
Пример
procedure TForm1.AdvStringGrid1GroupCalc() ... procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin AdvStringGrid1.RowCount := 100; AdvStringGrid1.RandomFill(false,100); for i := 1 to AdvStringGrid1.RowCount - 1 do AdvStringGrid1.Ints[1,i] := random(5); AdvStringGrid1.Grouping.Summary := true; AdvStringGrid1.Grouping.MergeHeader := true; AdvStringGrid1.Grouping.ShowGroupCount := true; Advstringgrid1.Group(1); Advstringgrid1.GroupCustomCalc(1); end;
Подгруппы
procedure TForm1.Button1Click(Sender: TObject); begin AdvStringGrid1.RowCount := 100; AdvStringGrid1.Randomfill(false,3); AdvStringGrid1.Group(1); AdvStringGrid1.SubGroup(1); AdvStringGrid1.SubGroup(2); AdvStringGrid1.ColWidths[1] := 10; AdvStringGrid1.ColWidths[2] := 10; end;
Чекбоксы
When grid.Grouping.AutoCheckGroup is set to true, clicking on the checkbox in a group header will
automatically check/uncheck all checkboxes of rows within the group. To see this in action,
following code initializes a default grid for this:
begin advstringgrid1.Options := advstringgrid1.Options + [goEditing]; advstringgrid1.RowCount := 20; advstringgrid1.RandomFill(false,3); advstringgrid1.Group(1); advstringgrid1.AddCheckBoxColumn(1); advstringgrid1.Grouping.AutoCheckGroup := true; end;
Фильтры
Свойство Filter — коллекция условий
-
индекс колонки,
-
условие,
-
Enabled,
-
operation — по умолчанию И (foNone)
-
prefix, suffix — суффикс, который игнорируется при фильтрации
-
CaseSensitive
-
Data: TFilterCells: controls what specific cell data the filter should apply to (see below)
-
Method: TFilterMethod: по умолчанию fmExpression, условие — выражение, которое может содержать wildchars like *,?,!,>,<. Если установлено fmLiteral, условие просто строка (то есть * уже обычный символ)
Условие — S*, S?, >, < , >=, =< (корректно работает для дат), = , ! (не равно)
& — логическое И, ^ : логическое ИЛИ
Пример 1: >20 & <30; пример 2: !A*
Примеры условий: *
— все; !BMV
; >B & < M
Несколько через точку с запятой: A*;M*
Если надо & включить в условие как часть строки, взять эту строку в кавычки.
Пример C:CompTMSSamplesAdvStringGridasg69
AdvStringGrid4.FilterActive := false; AdvStringGrid4.Filter.Clear; with AdvStringGrid4.Filter.Add do begin condition := ...; column := 1; operation := foNone; // предыдущего нет end; with AdvStringGrid4.Filter.Add do begin condition := ...; column := 3; operation := foAND; // and с предыдущим результатом end; AdvStringGrid4.FilterActive := true;
Пример: C:CompTMSDemosAdvStringGridasg69
По умолчанию фильтр работает с отображаемым текстом ячейки (установленным OnGetDisplText)
Чтобы фильтровать по реальным данным, установить FilterData.Data := fcNormal.
fcStripHTML: отображаемое, с удаленными HTML-тегами
fcCalculated: для TadvSpreadGrid — фильтрация по формуле.
fcRow: искать условие фильтра во всех ячейках строки.
Сохранить/загрузить:
grid.LoadFilter(Filename: string); grid.SaveFilter(FileName: string);
dropdown в заголовке
Чтобы автоматически включить фильтры:
FilterDropDownAuto := True; FilterDropDownCheck:= True; // у значений отображаются чекбоксы, связка OR AutoFilterUpdate := true;
свойство grid.FilterDropDown
-
AutoSize: Boolean
-
Color
-
ColumnWidth: Boolean — фильтр по ширине колонки
-
Glyph: TBitmap
-
Width, Height: integer — ширина, высота списка
FilterDropDownAuto := True; — автоматически заполняется выпадающий список значений
grid.FilterDropDownCheckUnCheckAll: Boolean — добавляет чекбокс для отметки всех.
grid.FilterDropDownClear: string — строка, очистить фильтр
grid.FilterDropDownRow — в какой строке появится фильтр
grid.FilterNormalCellsOnly — ноды не будут фильтроваться
Списки заполняются в событии grid.OnGetColumnFilter.
procedure TForm2.AdvStringGrid1GetColumnFilter(Sender: TObject; Column: Integer; Filter: TStrings); begin case Column of 1: begin Filter.Add('Clear'); Filter.Add('Within range'); Filter.Add('Exceptions'); end; 2: begin Filter.Add('Clear'); Filter.Add('>50'); Filter.Add('<50'); end; .... end end;
Когда пользователь выбрал фильтр, срабатывает OnFilterSelect. Оно позволяет на лету установить FilterCondition. Здесь можно обработать строки описательного характера — Очистить, в диапазоне и т.п.
if FilterCondition = 'Clear' then FilterCondition := '';
Под фильтр можно выделить вторую фиксированную строку и в ней отображать текущее условие фильтра.
Если есть чекбоксы, то срабатывает событие OnFilterCheck
Программно показать выпадающее меню: grid.ShowFilterDropDown(Column).
procedure TForm1.AdvStringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) and (Key = VK_F5) then AdvStringGrid1.ShowFilterDropDown(AdvStringGrid1.Col); end;
NarrowDown
C:CompTMSDemosAdvStringGridasg78
procedure TForm2.Edit1Change(Sender: TObject); begin advstringgrid1.NarrowDown(Edit1.Text); end;
Быстрый фильтр по всем ячейкам строки. Можно указать и по конкретной колонке.
Содержит или начинается с: свойство grid1.NarrowDownFromStart
Редактирование фильтра
Чтобы активировать редактирование прямо в заголовке колонки установить grid.FilterEdit.Enabled = true.
FilterEdit
-
color
-
Columns — все колонки или только не фиксированные имеют фильтр-едит
-
row — в какой строке показывать
Указать колонки для фильтров HasFilterEdit:
procedure TForm4.AdvStringGrid1HasFilterEdit(Sender: TObject; ACol: Integer; var HasFilter: Boolean); begin HasFilter := ACol <= 3; end;
Фильтр автоматически обновляется при редактировании. Перед обновлением событие OnFilterEditUpdate.
Коллекция grid.Filter обновится также. Дает возможность установить grid.Filter программно и модифицировать его пользователю в рантайме.
TAdvGridFilterPanel
Панель высоты не меньше 350 пикс
Есть отдельный диалог TAdvGridFilterDialog.
Поиск
SearchFooter, событие OnSearchEditChange, OnSearchFooterAction, OnSearchFooterClose, OnCreatedSearchFooter
Картинки на кнопках загружает из ресурсов (не настраивается)
unit AdvGrid - TSearchPanel.CreateWnd FForwardButton.Glyph.LoadFromResourceName(hinstance,'ASGARDOWN'); FForwardButton.GlyphDisabled.LoadFromResourceName(hinstance,'ASGARDOWND'); править ширину кнопок здесь же
Доступ к кнопкам через панель SearchPanel. Можно загрузить свои картинки в OnShow формы (в OnCreate не сработает):
AdvStringGrid1.SearchPanel.ForwardButton.Glyph.LoadFromFile('green_16.bmp');
Фокус на строку поиска:
grid.SearchPanel.EditControl.SetFocus;
Есть диалог поиска TAdvGridFindDialog:
код…
Импорт, экспорт
-
Save to file, load from file
-
Save to CSV, load from CSV
-
Save to XLS, XLS sheets, load from XLS, XLS sheets (native support, without the need to have Excel installed) ? у меня без офиса не сработал
-
Save to streams, load from streams
-
Save to HTML with color, alignment and font markup
-
Save / load from formatted ASCII files
-
Save to Word DOC files — причем можно вставить в существующий документ по bookmark-у
-
Save to XML files
-
Save to PDF files
-
Load from MDB tables
Grid1.SaveFixedCells := false; // и до сохранения и до загрузки, иначе будут теряться строки! ... AdvStringGrid1.SaveToFile('adres.tbl'); // SaveToCSV, SaveToBinFile, SaveToHTML, SaveToJSON, // SaveToFixed, SaveToXLS, SaveToXLSSheet, AppendToDoc if FileExists(..) then AdvStringGrid1.LoadFromFile('adres.tbl');
OnFileProgress — событие, происходит во время загрузки из файла и сохранения в файл
При сохранение многострочных ячеек происходит замена символов:
if s[i] = #9 then s[i] := #13; if s[i] = #8 then s[i] := #10; if s[i] = #1 then s[i] := #0;
SaveVisualProps — не сохраняет цвета самих ячеек, только цвета и атрибуты элементов грида
Чтобы сохранялись комментарии и цвета ячеек, использовать SaveToBinFile/LoadFromBinFile
Полезное свойство перед загрузкой:
AdvStringGrid1.SaveFixedCells := false;
Когда true, fixed cells (и колонки и строки) также сохраняются и загружаются. По умолчанию true.
Также есть свойства
-
SaveFixedRows: Boolean
-
SaveFixedCols: Boolean
-
SaveHiddenCells: Boolean
-
SaveRowCount: Integer
-
SaveColCount: Integer
-
SaveEndRow: Integer
-
SaveEndCol: Integer
-
SaveStartRow: Integer
-
SaveStartCol: Integer
методы
-
SaveFilter
-
Grid.SaveColSizes
-
Grid.SaveVisualProps
-
Grid.SaveColPositions, LoadColPositions. В зависимости от свойства ColumnSize.Location сохраняет в реестр или ини-файл. Имя файла задавать в ColumnSize.Key. Секцию задавать в ColumnSize.Section. Ключ будет вида ‘Pos’+inttostr(i). См. также ‘Сохранить состояние колонок’
-
Grid.SavePrintSettings
TAdvGridCSVPager
Позволяет отображать в гриде CSV и листать его.
Свойство PageSize. Методы Open Close First Next Eof и т.п.
C:CompTMSDemosAdvStringGridasg65
TAdvGridExcelIO
C:CompTMSDemosAdvStringGridasg56
Экспорт и импорт в одном компоненте
Свойства — AutoResizeGrid, DateFormat, TimeFormat, GridStartCol, GridStartRow, UseUnicode, XlsStartRow, XlsStartCol, Zoom, Options — много параметров
advgridexcelio1.XLSImport(opendialog1.filename); - через FlexCell advgridexcelio1.GridStartCol := 0; advgridexcelio1.GridStartRow := 0; advgridexcelio1.Options.ExportOverwrite := omAlways; - через FlexCell advgridexcelio1.Options.ExportHiddenColumns := False; advgridexcelio1.Options.ExportCellSizes := True; advgridexcelio1.Options.ExportHardBorders := True; advgridexcelio1.XLSExport(savedialog1.filename); procedure TMainForm.AdvGridExcelIO1ExportColumnFormat(Sender: TObject; GridCol, GridRow, XlsCol, XlsRow: Integer; const Value: WideString; var ExportCellAsString: Boolean); begin if GridCol = 0 then ExportCellAsString := true; // даты как текст end; или Grid1.SaveToXLSSheet(WorkingPath + 'stat.xlsx', 'Лист'); - через OLE // при перезаписи лист не очищает, старый текст накладывается на новый
Контролы в ячейках
-
Normal left or right aligned edit controls
-
Masked edit controls with automatic cell advancement
-
Checkboxes, comboboxes, cell data bound checkboxes
-
Datetimepicker, timepicker, datetimepicker with up/down
-
Edit control with ellipsis button. У колонки выставить редактор edEditBtn, событие OnEllipsClick — внимательно, надо присвоить значение переменной-параметру S (а не свойству грида Cell как обычно)
-
Comboboxes and edit controls with auto-lookup and auto history
-
Integer, float, time, date, spinedit control
-
Button control — редактор edButton, событие OnButtonClick. Текст в ячейке видим, но не редактируется. Если поставить у колонки ReadOnly = true, то кнопка не будет нажиматься. Ширина и высота кнопки настраивается. Глюк — если щелкнуть по свободной части ячейки, то кнопка расширяется на всю ячейку и на ней будет написан текст ячейки.
-
Radio button control
-
Use another custom editor
-
Expand/contract node controls
-
Rich text inplace editing
-
Color picker,image picker, time picker
-
Grid dropdown, detail dropdown list
Чтобы узнать тип ячейки, использовать grid1.CellTypes[acol, arow]
Возвращает тип:
TCellType = (ctBitmap,ctIcon,ctNone,ctImageList,ctCheckBox,ctDataCheckBox, ctRotated,ctDataImage,ctNode,ctRadio,ctEmpty,ctImages,ctPicture,ctFilePicture, ctValue,ctProgress,ctComment,ctButton,ctBitButton,ctVirtCheckBox,ctRowCheckBox, ctProgressPie,ctSummary,ctRangeIndicator,ctXPProgress,ctInterface,ctScrollbar, ctRadioButton,ctBalloon,ctShape,ctRating,ctTriStateCheckBox,ctExpand, ctDataPicture,ctVirtButton);
Кнопки
Добавить кнопку в ячейку указанного размера очень просто:
procedure AddButton(ACol, ARow, bw, bh: Integer; Caption:string; hal:TCellHalign; val:TCellValign);
Обработчик один на все кнопки в гриде — Событие OnButtonClick
Пример: добавить кнопку с крестиком в строку заголовков для скрытия колонки:
for i := 0 to Grid1.ColCount - 1 do grid1.AddButton(i, 0, 16, 16, 'X', haRight, vaTop); {make sure that buttons on a readonly cell are not disabled} grid1.ControlLook.NoDisabledButtonLook := true; Обработчик грида OnButtonClick: procedure TForm1.Button1Click(Sender: TObject); begin grid1.HideColumn(grid1.RealColIndex(grid1. col)); end;
procedure SetButtonText(ACol,ARow: Integer; Caption: string);
procedure PushButton(ACol,ARow: Integer;push: Boolean);
procedure RemoveButton(ACol,ARow: Integer);
function HasButton(ACol,ARow: Integer): Boolean;
procedure AddBitButton(ACol,ARow,bw,bh:Integer; Caption:string; Glyph:TBitmap; hal:TCellHalign; val:TCellValign);
function CreateBitButton(ACol,ARow,bw,bh: Integer; Caption:string; hal:TCellHalign; val:TCellValign): TBitmap;
Отличие между CreateBitButton и AddBitButton — в первом случае за разрушение отвечает грид.
В ячейках read-only по умолчанию кнопки задисейблены. Иначе установить grid.ControlLook.NoDisabledButtonLook = True.
Добавление редактора в колонку:
if Grid1.ColCount = 5 then begin Grid1.AddColumn; Grid1.Columns[5].Header := 'Открыть график'; Grid1.Columns[5].ButtonWidth := 60; Grid1.Columns[5].ButtonCaption := '-->'; Grid1.Columns[5].Editor := edButton; Grid1.Columns[5].Alignment := taCenter; end;
Всплывающий тулбар
C:CompTMSDemosAdvStringGridasg91
AdvStringGrid1.Options := AdvStringGrid1.Options + [goEditing]; AdvStringGrid1.DefaultEditor := edCustom; AdvStringGrid1.EditLink := AdvRichEditorEditLink1; AdvRichEditorEditLink1.PopupToolbar := true; AdvRichEditorEditLink1.PopupToolbarStyler := AdvToolBarOfficeStyler1;
Всплывает, если выделить текст. Вместо него можно использовать обычный тулбар TAdvRichEditorFormatToolBar.
Чекбоксы
AddCheckBox — добавить чекбокс в указанную ячейку
AddCheckBoxColumn — добавить чекбоксы в указанную колонку (колонка уже должна существовать)
var state: Boolean; grid.GetCheckBoxState(col, row, state); if state then ShowMessage('CheckBox is checked') else ShowMessage('CheckBox is not checked');
Проверка
if Grid1.Cells[2, i] = 'Y'
Grid1.CheckTrue — возвращает ‘Y’, можно установить свое значение, см пример ниже
Grid1.CheckFalse — возвращает ‘N’
Grid1.CheckCell(…) — не знаю, что делает
Grid1.SaveFixedCells := False; // загружаем из файла - там 10 колонок, последняя содержит 0 или 1 Grid1.LoadFromCSV('.cars.csv'); Grid1.CheckFalse := '0'; Grid1.CheckTrue := '1'; Grid1.AddCheckBoxColumn(9, false, true); // номер колонки, значение по умолчанию, дата-чекбокс
или установить для колонки редактор:
Grid1.AddColumn; Grid1.Columns[9].Editor := edDataCheckBox;
Числа
При вводе чисел типа Editor = edFloat, edPositiveFloat принимает в качестве разделителя либо точку либо запятую в зависимости от
FormatSettings.DecimalSeparator := '.';
При установке
Grid1.ExcelStyleDecimalSeparator := true;
должен точку заменять на установленный десятичный разделитель, но у меня почему-то не работает.
Картинки
Добавить ImageList, можно TsCharImageList, установить небольшой размер 16*16 или 12*12. Присоединить к гриду через свойство GridImages. Добавить картинку в ячейку:
// нарисовать колокольчик Grid. AddImageidx(1, 1, 0, habeforetext, AdvGrid.vaCenter);
Грид
Установить у колонки (ячейки) Editor = edAdvGridDropDown или edGridDropDown
Можно использовать события:
procedure TForm2.AdvStringGrid1GetEditorType(Sender: TObject; ACol, ARow: Integer; var AEditor: TEditorType); begin case ACol of 1: AEditor := edDetailDropDown; 2: AEditor := edGridDropDown; end; end; procedure TForm2.AdvStringGrid1GetEditorProp(Sender: TObject; ACol, ARow: Integer; AEditLink: TEditLink); begin case ACol of 1: AdvGrid1.DetailPickerDropDown.DropDownHeader.Caption := 'Select your IDE'; 2: AdvGrid1.GridDropDown.DropDownHeader.Caption := 'Choose a car'; end; end;
не поняла, почему это нельзя вынести в инициализацию формы — тем не менее, событие есть.
В событие формы FormCreate, например, вставить инициализацию выпадающего грида:
uses AdvCustomGridDropDown var dc: TDropDownColumn; di: TDropDownItem; // создание колонок dc := Grid1.AdvGridDropDown.Columns.Add; dc.Header := 'Name'; dc.ColumnType := ctText; dc.Width := 50; dc := Grid1.AdvGridDropDown.Columns.Add; dc.Header := 'Price'; dc.ColumnType := ctText; dc.Width := 12; dc := Grid1.AdvGridDropDown.Columns.Add; dc.Header := 'Code'; dc.ColumnType := ctText; dc.Width := 12; // заполнение данными di := Grid1.AdvGridDropDown.Items.Add; di.Text.Add('летицин'); di.Text.Add('100'); di.Text.Add('7776655'); di := Grid1.AdvGridDropDown.Items.Add; di.Text.Add('кальций-магний'); di.Text.Add('200'); di.Text.Add('152122'); // выбор ключевой колонки Grid1.AdvGridDropDown.LookupColumn := 0;
пример C:CompTMSDemosAdvStringGridasg81
— вставка картинок в выпадающий грид
использование DetailPickerDropDown:
var di: TDetailItem; begin Grid1.DetailPickerDropDown.Images := ImageList1; Grid1.DetailPickerDropDown.ItemHeight := 40; Grid1.DetailPickerDropDown.DropDownWidth := 200; Grid1.DetailPickerDropDown.DropDownHeader.Caption := 'Select your IDE'; Grid1.DetailPickerDropDown.Items.Clear; di := Grid1.DetailPickerDropDown.Items.Add; di.ImageIndex := 0; di.Caption := 'Delphi'; di.Notes := 'Most productive IDE for Win32 development'; di := Grid1.DetailPickerDropDown.Items.Add; di.ImageIndex := 1; di.Caption := 'Delphi Prism'; di.Notes := 'Take your Pascal skills to .NET'; di := Grid1.DetailPickerDropDown.Items.Add; di.ImageIndex := 2; di.Caption := 'Delphi PHP'; di.Notes := 'RAD development for PHP'; end;
Есть автодополнение по первым введенным символам.
Настройки выпадающего окна через свойства AdvGridDropDown.DropDown*.
Наиболее важные свойства и события выпадающего грида продублированы на уровне TAdvGridDropDown, например события OnGridGetAlignment, OnGridGetCellColor и другие. На уровне TAdvStringGrid это OnGetAlignment, OnGetCellColor.
Заполнение грида данными. Свойтсво AdvGridDropDown.UseItems : Boolean. Если false, данные вводятся в грид напрямую, через свойство AdvGridDropDown.Grid.Cells[col,row]: string или AdvGridDropDown.Grid.LoadFromCSV(), или AdvGridDropDown.Grid.RowCount и т.п. Если AdvGridDropDown.UseItems = true, все данные заполняются через AdvGridDropDown.Columns и AdvGridDropDown.Items.
Главная проблема — как получить доступ к выбранной строке в гриде и прочитать id и другие выбранные поля. Есть доступ к гриду, но текущая строка обновляется только если выпадающее окно открылось и пользователь подвигал мышкой или стрелками, то есть не изменяется после изменений в ячейке, сделанных другим способом.
grid1.AdvGridDropDown.Grid.CurrentCell
Для выпадающего ComboDropDown есть событие OnControlComboSelect, для грида такого нет
procedure TMainForm.Grid1ControlComboSelect(Sender: TObject; ARow, ACol, ItemIndex: Integer; CtrlID, CtrlValue: string); begin end;
Поэтому для случая AdvGridDropDown.UseItems = true нужно использовать AdvGridDropDown.ItemIndex
procedure TMainForm.Grid1EditChange(Sender: TObject; ACol, ARow: Integer; Value: string); var index: Integer; begin // пользователь выбрал товар, цену подставим автоматически if ACol = 2 then begin index := Grid1.AdvGridDropDown.ItemIndex; if index < 0 then exit; Grid1.ColumnByName['Price'].Rows[arow] := Grid1.AdvGridDropDown.Items[index].Text[1]; end; end;
Ноды
Создает ноду и вставляет в нее второй грид, который был предварительно брошен на форму:
advstringgrid1.AddNode(1, 2); advstringgrid1.RowHeights[2] := 128; advstringgrid1.MergeCells(1, 2, 4, 1); advstringgrid1.CellControls[1, 2] := advstringgrid2; advstringgrid1.ContractNode(1);
C:CompTMSDemosAdvStringGridasg57
procedure AddNode(aRow, Span: integer); — добавить ноду
RemoveNode(aRow:integer); — удалить
function IsNode(aRow:integer): boolean;
function GetNodeSpan(aRow: Integer): Integer:
function GetNodeState(ARow: integer): boolean; — true, если свернута (индекс видимой строки)
SetNodeState — индекс видимой строки, который будет меняться при действиях пользователя
ExpandNode, ContractNode — работают с реальными индексами строки
ExpandAll, ContractAll
function GetNodeLevel(aRow: Integer): Integer; — глубина
function GetParentRow(aRow: Integer): Integer; — если нет родительской ноды, то -1
procedure InsertChildRow(ARow: Integer); — вставляет новую строку под ноду
procedure RemoveChildRow(ARow: Integer);
Сгруппировать в ноды по равным значениям первой колонки:
var i, j: integer; begin with advstringgrid1 do begin I := 1; J := 1; while (I < RowCount - 1) do begin while (Cells[1,J] = Cells[1,J + 1]) and (J < RowCount - 1) do Inc(j); if (I <> J) then AddNode(I, J – I + 1); I := J + 1; J := I; end; Row := 1; Col := 1; end; end;
Ноды всегда появляются в первой колонке (индекс 0) и могут быть 4-х типов — cnflat (просто + или -), cn3D, cnglyph or cnXP.
CellNode — цвет, глифы, NodeColumn, NodeIndent, NodeType, ShowTree — показывать линии дерева
Может быть несколько уровней вложенности
События OnExpandNode, OnContractNode, OnBeforeExpandNode, OnBeforeContractNode
TAdvGridLookupBar
C:CompTMSDemosAdvStringGridasg86
Можно сделать например категории-месяца.
Navigation
Свойство grid.Navigation — много настроек
-
AllowCtrlEnter: Boolean; — можно вставлять разрыв строки в ячейку
-
AllowDeleteRow: Boolean; — можно клавишей DEL удалять строку. Срабатывает событие OnAutoDeleteRow
-
AllowInsertRow — позволяет вставлять строку по INS. Событие OnAutoInsertRow. Свойство InsertPosition
-
AllowSmartClipboard — When true, pasting automatically completes ranges in selected cells. If for example 2 cells are copied on the clipboard with values ‘1’ and ‘2’, pasting this in 10 cells will paste as ‘1’,’2’,’3’…’10’
-
AlwaysEdit — встроенный редактор всегда виден (вместо goAlwaysShowEditor in grid.Options). Когда стрелками перемещаешься по гриду, сразу переходит в режим редактирования, и из ячейки по стрелке уже не выйти (если CursorWalkEditor = false).
-
AppendOnArrowDown
-
AutoComboDropSize — размер комбобокса автоматически адаптируется к самой большой строке
-
CursorMoveRows — Ctrl + стрелки вверх или вниз двигают выделенную строку или строки. Слово Cursor означает курсорные стрелки. Должно быть включена опция Options.goRowMoving
-
CursorWalkAlwaysEdit — переходить в режим редактирования при попадании курсора в ячейку по стрелкам влево и вправо
-
CursorWalkEditor — если true, то курсор будет переходит на предыдующую ячейку по стрелке влево, если стоит на первом символе. И аналогично по стрелке вправо
-
EditSelectAll — если true, при переходе в режим редактирования выделяет весь текст. Иначе курсор прыгает в конец строки
-
HomeEndKey — определяет поведение клавиш Home End
-
InsertPosition — вставлять перед или после
-
LineFeedOnEnter — если true, нажатие Ctrl-Enter добавляет linefeed в ячейку вместо выхода из режима редактирования
-
MoveRowOnSort — When true, the current selected row remains in focus after sort
-
TabToNextAtEnd — если true и включена опция grid.Options.goTabs, after tabbing inside the grid to the last cell, the focus moves to the next control
-
SkipFixedCells — When true, using the arrow keys to move the selected cell will let the selection jump over fixed (non-selectable) cells in the grid. Не работает. См TAdvStringGrid.WMKeydown
-
SkipDisabledRows
MouseActions
-
AllColumnSize — когда мышкой меняешь размер одной колонки, все колонки меняют размер пропорционально. Опция goColSizing должна быть включена
-
AllRowSize — аналогично для строк
-
AllSelect — клик по верхнему уголку выделяет все
-
AutoFocus — если истина, грид автоматически получает фокус, когда мышка над ним
-
WheelActive — активировать колесико когда в фокусе или когда мышь над гридом
-
AutoSizeColOnDblClick — по двойному клику optimize column width (не так просто найти это свойство)
-
CaretPositioning — при редактирование ставит курсор туда, куда кликнули
-
CheckAllCheck — клик по чекбоксу в заголовке устанавливает все чекбоксы в колонке
-
ColSelect — клик по заголовку выделяет всю колонку
-
DirectComboDrop — клик по ячейке сразу открывает комбобокс
-
DirectEdit — клик по ячейке сразу переводит в редактор
-
DisjunctCellSelect — позволяет с помощью Ctrl + left mouse click выбирать несмежные ячейки. Получить выделение SelectedCell[Index: Integer]: TGridCoord
-
DisjunctRowSelect, grid.RowSelect[ARow: Integer]: Boolean
-
DisjunctColSelect, ColSelect
-
DisjunctRowSelectNoCtrl — при этом не надо Ctrl нажимать
-
EditOnDblClickOnly
-
HotmailRowSelect — можно выделять строки, кликая по чекбоксу в первой колонке
-
RowSelect — можно выделять строки by clicking a row header cell
-
RowSelectPersistent — не сбрасывается выделение строк при сворачивании группы
-
SelectOnRightClick — правая кнопка выбирает ячейку (долго искала это свойство)
-
SizeFixedCol, SizeFixedRow — можно ресайзить фиксированные ячейки
-
WheelAction — колесико двигает выделение или скролит грид
-
FixedColsEdit — можно редактировать фиксированные колонки (тоже было очень нужно, не нашла это свойство, особенно радует, что к мышке оно не имеет никакого отношения). Варианты — fceNone,fceDblClick,fceLeftClick,fceRightClick
-
FixedRowsEdit, FixedRowsEditor
-
FixedColsEditor — варианты Edit, ComboList, ComboEdit
-
FixedComboValues — список значений для редактора фиксированной ячейки
Стили
по правой кнопке — галерея. Стили можно выбирать и в рантайме. Если на форме есть TAdvFormStyler, то стили всех компонентов на форме будут выставляться автоматически, в том числе и для грида.
uses AdvStyleIF grid.SetComponentStyle(tsOffice2007Obsidian); grid.SetComponentStyle(tsOffice2010Blue); // tsWindowsVista, tsWindows7, tsWindows8 Grid.SaveVisualProps(FileName: string); // оздали файл с расширением .GP Grid.LoadVisualProps(FileName: string);
Если поместить gp-файл в папку My Documents, то стиль добавится в галерею.
Ячейки — доступ
grid.AllCells[ACol,ARow]: string; — доступ к ячейке как к строке (событие OnGetDisplText), без относительно скрытых строк и столбцов
grid.GridCells — как строка после обработки, с учетом скрытых ячеек
grid.AllGridCells[ACol,ARow]: string; — доступ к данным ячейки (без обработки)
grid.OriginalCells[ACol,ARow]: string — доступ независимо от порядка колонок, до того как пользователь начал передвигать колонки
grid.AllFloats[ACol,ARow]: Double;
grid.AllObjects, grid.Objects, grid.GridObjects — можно привязать объект к любой ячейке. Например, строка грида представляет некий объект, его можно привязать к нулевой ячейки каждой строки.
grid.Dates, grid.Times, grid.Floats, grid.Ints
grid.GetSelectionAsText: string — совместимо с форматов буфера обмена Excel
Grid.SetSelectionAsText(Value:string)
Отображение GetDisplText
procedure TForm1.AdvStringGrid1GetDisplText(Sender: TObject; ACol, ARow: Integer; var Value: string); begin if (arow > 0) and (acol > 0) then Value := Value +''€''; end;
Такой подход позволяет в качестве значений оставить целые числа, и упростить выражение фильтра:
procedure TForm1.AdvStringGrid1FilterCheck(Sender: TObject; Column, ItemIndex: Integer; FriendlyName: string; var FilterCondition: string; CheckList: TCheckListBox); begin case ItemIndex of 0: FilterCondition := ''>10 & <20''; 1: FilterCondition := ''>20 & <50''; 2: FilterCondition := ''>50''; end; end;
Виртуальные ячейки
Данные можно не хранить в гриде. Событие OnGetDisplText
Например, можно выбирать из базы данные, накладывать html форматирование и возвращать как виртуальную ячейку. Или можно округлять данные, форматировать.
Или выделять жирным по определенному условию:
procedure TForm1.AdvStringGrid1GetDisplText(Sender: TObject; ACol,ARow: Integer; var Value: string); begin if ACol = 1 then Value := '<B>' + Value + '</B>'; end;
Цвета, шрифты
1) через событие OnGetCellColor
или OnGetCellGradient
— нет затрат на хранение
case ACol of 0: if (ARow > 0) and (Grid1.Ints[ACol, ARow] <= 6) then ABrush.Color := $00E8D5B3; end;
2) свойства Colors
[Col,Row: Integer]: TColor; и ColorsTo
FontColors
[Col,Row: Integer]: TColor;
FontStyles
[Col,Row: Integer]: TFontStyles;
FontSizes
[Col,Row: Integer]: Integer;
FontNames
[Col,Row: Integer]: string;
вертикальный градиент:
Grid.Colors[1,1] := clRed; Grid.ColorsTo[1,1] := clWhite;
Выравнивание
выравнивание каждой ячейки — Left, Justify, Right
Событие OnGetAlignment
procedure TDemo.AdvStringGrid1GetAlignment(Sender: TObject; ARow, ACol: Integer; var HAlign: TAlignment; var VAlign: TVAlignment); begin if ACol in [3, 4] then HAlign := taRightJustify; end;
вертикальное выравнивание есть, должен быть WordWrap = false
Совйство Alignments[Col,Row: Integer]: TAlignment;
advstringgrid1.Cells[2, 3] := 'Complex Gradient'; advstringgrid1.Alignments[2, 3] := taCenter; advstringgrid1.VAlignment := vtaCenter; advstringgrid1.FontStyles[2, 3] := [fsBold]; advstringgrid1.FontColors[2, 3] := clWhite; advstringgrid1.WordWraps[2, 3] := false;
Для переноса по строкам включить свойство
Multilinecells := true;
использовать CR в строках в ячейке.
Строки, столбцы — методы
Grid.InsertRows(RowIndex, RCount: integer);
RemoveCols — удалить колонку
Grid.RemoveRows(RowIndex, RCount: integer); — удалить строки
Grid.RemoveSelectedRows; — удалить текущую выделенную строку
Grid.MoveRow(FromIndex, ToIndex: integer);
Grid.MoveRows(FromIndex, ToIndex, RCount: integer);
Grid.MoveColumn(FromIndex, ToIndex: integer);
Grid.SwapRows(Row1, Row2: integer);
Grid.SwapColumns(Col1, Col2: integer);
Grid.AddRow;
Grid.InsertCols(ColIndex, CCount: integer);
Grid.DistinctValues(Col: integer): TStrings; — Returns a stringlist of distinct values in column Col.
Подгонка ширины колонок и высоты строк
AutoFitColumns — подгоняет ширину колонок так, чтобы грид целиком поместился в видимой области
AutoGrowColumns — адаптирует ширину колонок к тексту, с учетом названий колонок — колонка может растянуться очень сильно. Ширина колонки никогда не уменьшается
AutoGrowCol(Col: integer); — то же для одной колонки
AutoSizeCol(Col: integer); — Adapts the width of column Col to have all text in cells in this column fit. как понимаю, то же самое что и AutoGrowCol, но ширина колонки может и уменьшиться, если текст всех ячеек колонки меньше текущий ширины колонки.
AutoSizeColumns
AutoSizeRows — если первая строка содержит длинные заголовки, то первая строка растянется на весь экран, и не будет скроллинга на другие строки, вплоть до снятия задачи — даже на крестик не реагирует. Поэтому лучше AutoSizeRows(false) — отключить обработку фиксированных строк. Строки будут разной высоты в зависимости от наличия заворачиваемого текста в строках.
AutoSizeRow — Adapts the height of row Row to have all text in cells in this row fit.
Также см AutoNumberCol, AutoNumberRow, AutoNumberOffset, AutoNumberStart
Комментарии
Grid.CellComment[ACol, ARow] := DateToStr(now); AddComment(8, 3, 'This is a custom'#13'comment for this cell');
В результате у ячейки появится красный уголок в правом верхнем углу.
-
Grid.AddComment();
-
Grid.IsComment(); — возвращает комментарий
-
Grid.RemoveComment();
-
Grid.AllComments;
Для отображения включить ShowHints
TAdvGridColumnPicker
Окошко, в которое можно перетаскивать колонки из грида и наоборот, из окошка в грид.
C:CompTMSDemosAdvStringGridasg88
Expand Button
В правом углу появляется стрелочка — просто для увеличения высоты строки, отобразить больше информации.
procedure AddExpand(ACol,ARow, ExpandedHeight: Integer);
function HasExpand(ACol,ARow: Integer): Boolean;
procedure RemoveExpand (ACol,ARow: Integer);
procedure ToggleExpand(ACol,ARow: Integer);
function GetExpandState(ACol,ARow: Integer): Boolean;
function GetExpandHeight(ACol,ARow:Integer; Expand:Boolean): Integer;
Hover Buttons
Кнопки не исчезают, движутся вместе с курсором
событие OnHoverButtonClick
Футеры
FixedFooters: Integer — строки футера отображаются в самом конце грида, надо скролить
FloatingFoooter — футер внизу текущего экрана, всегда виден. Можно сделать сплошной строкой
-
FloatingFoooter.ColumnPreview — будет показывать значение выбранной колонки
дока с. 128
FloatingFooter.fsFixedLastRow — показ сумм в последней строке:
procedure TForm1.UpdateSums; var i: Integer; begin for i := 1 to AdvStringGrid1.ColCount - 1 do AdvStringGrid1.Floats[i,AdvStringGrid1.RowCount - 1] := // последняя строка AdvStringGrid1.ColumnSum(i,1,AdvStringGrid1.RowCount - 2); // сумма с 1-й по предпоследнюю AdvStringGrid1.FloatingFooter.Invalidate; end; // обновить во время валидации изменений в ячейке procedure TForm1.AdvStringGrid1CellValidate(Sender: TObject; Col, Row: Integer; var Value: String; var Valid: Boolean); begin UpdateSums; end;
Предопределенные методы вычисления футера:
Grid.FloatingFooter.ColumnCalc[ColumnIndex: Integer]: TColumnCalcType;
TColumnCalcType = (acNONE,acSUM,acAVG, acCOUNT,acMIN,acMAX,
acCUSTOM, acSTDDEV);
acDISTINCT — число различных значений в колонке
acCUSTOM — Whenever a floating footer value needs to be updated, the event OnFooterCalc is triggered
FloatingFooter.Visible := true; Grid.FloatingFooter.ColumnCalc[2] := acSum; Grid.FloatingFooter.ColumnCalc[4] := acAverage;
Прямое вычисление: grid.ColumnSum, grid.ColumnAvg, Grid.ColumnMin, Grid.ColumnCount, Grid.ColumnDistinct, Grid.ColumnStdDev, Grid.ColumnCustomCalc
Скрытые колонки и строки
Рекомендуется сначала скрывать строки, а затем скрывать колонки. Открывать в обратном порядке.
procedure HideColumn(ColIndex: Integer); / HideRow(Rowindex: Integer);
procedure UnHideColumn(ColIndex: Integer); / UnHideRow(Rowindex: Integer);
procedure HideColumns(FromCol,ToCol: Integer); / HideRows
procedure UnHideColumns(FromCol,ToCol: Integer); / UnHideRows
procedure UnHideColumnsAll; / UnHideRowsAll;
function IsHiddenColumn(Colindex: Integer): Boolean; / IsHiddenRow
function NumHiddenColumns: Integer; / NumHiddenRows: Integer;
function AllColCount: Integer; / AllRowCount: Integer;
procedure HideRowList(RowList: TIntList);
procedure UnHideRowsList;
procedure HideSelectedRows;
procedure HideUnSelectedRows;
grid.Cells[Col,Row]: — видимые ячейки
grid.AllCells[Col,Row]: — все колонки, включая скрытые
Преобразование координат:
function RealRowIndex(ARow: Integer): Integer; видимый индекс — реальный
function RealColIndex(ACol: Integer): Integer; если скрытых колонок нет, то совпадает с индексом колонки
function DisplRowIndex(ARow: Integer): Integer; наоборот
function DisplColIndex(ACol: Integer): Integer;
Перемещенные столбцы
Если включена опция Options.goColMoving юзер может перетаскивать колонки, меняя их индексы.
grid.OriginalCells[Col,Row]: string — доступ к ячейкам по оригинальному индексу
Чтобы получить начальный индекс колонки до перемещения (или до вызова функции grid.SetColumnOrder):
Grid.ColumnPosition(OriginalColumnIndex: integer): integer — визуальный индекс колонки по начальному
Grid.ColumnAtPosition(VisualColumnIndex: integer): integer — оригинальный индекс по визуальному.
функция для перекодирования номеров, на входе номер колонки при дизайне:
function TMainForm.cn(defaultColumnNumber: Integer): Integer; begin Result := Grid1.ColumnPosition(defaultColumnNumber); if Result = -1 then // проблема Result := defaultColumnNumber; end;
Слияние ячеек
asg.MergeCells(1, 1, 2, 2);
Координаты объединенной ячейки — это координаты верхней левой ячейки этой группы, которая называется базовой ячейкой.
Скрытые ячейки не могут участвовать в объединении.
procedure MergeCells(c,r,spanx,spany: Integer);
procedure SplitCells(c,r: Integer); — разъединить ячейки
function BaseCell(ACol,ARow: Integer): TPoint; — координаты базовой ячейки
function IsBaseCell(ACol,ARow: Integer): Boolean; — истина, если это левая верхняя ячейка объединения или обычная ячейка вне объединения.
function IsMergedCell(ACol,ARow: Integer): Boolean; — входит в объединение
function IsXMergedCell(ACol,ARow: Integer): Boolean; — true если ячейка является частью horizontally merged cell
function IsYMergedCell(ACol,ARow: Integer): Boolean; — аналогично вертикально
function FullCell(c,r: Integer): TRect; — Returns the rectangle a merged cell is using
function CellSpan(ACol, ARow: Integer): TPoint; — Returns the number of horizontal and vertical cells a merged cell is using
procedure MergeColumnCells(ColIndex: Integer; MainMerge: Boolean); — автоматически соединяет все ячейки
с одинаковым контентом в колонке с указанным индексом. Если MainMerge = false, ячейки не объединяются, если ячейки слева от колонки ColIndex не объединены.
procedure SplitColumnCells(ColIndex: Integer); — разъединить
procedure MergeRowCells(RowIndex: Integer; MainMerge: Boolean); — автоматически соединяет все ячейки
с одинаковым контентом в строке с указанным индексом. Если MainMerge = false, ячейки не объединяются, если ячейки сверху от строки не объединены.
procedure SplitRowCells(RowIndex: Integer);
procedure SplitAllCells; — Splits all cells in the grid
Для сортировки по второй строке заголовка нужно выставить
SortSetting.Row := 1;
пример 231 Volumes
Скопировать диапазон
var st: TMemoryStream; begin st := TMemoryStream.Create; try advstringgrid1.SaveRectToBinStream(Rect(0,1,advstringgrid1.ColCount-1, 1), st); st.Position := 0; advstringgrid2.LoadAtPointFromBinStream(Point(0,1),st); finally st.Free; end; end;
Сохранить грид в jpeg
var pBitmap: TBitmap; jp: TJPEGImage; R: TRect; begin pBitmap := TBitmap.Create; //create a new instance of a bitmap jp := TJPEGImage.Create; //create new instance of a jpg file R := Rect(0,0,950,760); //parameters for rectangle pBitmap.Height := 622; //set bmp height pBitmap.Width := 812; //set bmp width AdvStringGrid1.PrintPreview(pBitmap.Canvas,R); //call Preview to paint to BMP canvas jp.Assign(pBitmap); //get picture from bitmap for JPG Image jp.SaveToFile('c:tempGrid.jpg'); //save picture as JPG File pBitmap.Free; jp.Free; end;
Установка MaxLength
procedure TForm1.AdvStringGrid1GetEditorType(Sender: TObject; ACol, ARow: Integer; var AEditor: TEditorType); begin if Assigned(AdvStringGrid1.NormalEdit) then begin case acol of 1: AdvStringGrid1.NormalEdit.LengthLimit := 4; 2: AdvStringGrid1.NormalEdit.LengthLimit := 8; else AdvStringGrid1.NormalEdit.LengthLimit := 0 end; end; end;
Copy / paste
-
Navigation.AllowClipboardShortCuts = true
-
grid is editable или Navigation.AllowClipboardAlways = true
TAdvColumnGrid
TMS Software | TAdvColumnGrid
доку не нашла
Наследует весь функционал TAdvStringGrid
Ключевое дополнительное свойство Columns
Имеет визард-редактор столбцов. У каждого столбца свой редактор ячейки в зависимости от типа данных — включая кнопки, календари, кастомный редактор, Grid dropdown, Radio button, Rich text inplace editing, Color picker, image picker, time picker.
Кнопка — У колонки выставить редактор edEditBtn, событие OnEllipsClick
Можно назначить тип колонки в рантайме:
procedure TForm1.AdvStringGrid1GetEditorType(Sender: TObject; ACol, ARow: Integer; var AEditor: TEditorType); begin AEditor := edEditBtn; AdvStringGrid1.BtnEdit.EditorEnabled := false; end;
см. также TAdvColumnGrid Example как создать потомка грида с расширенными свойствами колонок
TAdvColumnGrid Example — filter dropdown & popup menu per column
-
ColCount
-
OnColumnPopup
-
OnAfterColumnMoved
-
AutoFilterDisplay (default False)
-
ColumnByName[AValue:string] — у колонок есть имена (name), помимо заголовков (header)
Методы
-
SaveColumnsToStream, LoadColumnsFromStream
-
SaveColumnPositions(Key,Section: string); LoadColumnPositions
-
SaveColPositions; LoadColPositions;
-
RemoveCols(ColIndex, CCount: Integer);
-
InsertCols(ColIndex, CCount: Integer);
-
Group(Colindex: Integer); override;
-
UnGroup; override;
Класс TAdvColumnGridIO
TGridBinder
позволяет добавить в список несколько гридов и дать каждому из них имя. Тогда в формулах можно вставлять ссылки на другие гриды.
Формат : sheetname!cellref
где sheetname — это указанное имя грида.
аналогичный TTMSFNCGridBinder
Недавний проект включает реализацию некоторых сложных дисплеев таблиц. Я много раз пытался использовать элемент управления cxGrid в Dev Express, но все равно не смог добиться желаемого эффекта. Позже я обнаружил, что,TMSTAdvStringGrid пакета компонентов разработки может достичь эффекта. Вот пример, иллюстрирующий, например, необходимость достижения следующих эффектов:
Как показано выше, это таблица с 3 строками и 4 столбцами, в которой столбцы 1 и 2 в первой строке объединены, а столбцы 2 и 3 во второй строке объединены. В следующем примере TAdvStringGrid используется для выполнения следующих шагов:
1. Создайте новый проект окна VCL, интерфейс макета.
Добавьте элемент управления TAdvStringGrid. По умолчанию это пустая таблица с 5 столбцами и 10 строками. Здесь вам нужно настроить данные. Измените ее свойства ColCount и RowCount на 0. Однако по умолчанию все еще остается пустая таблица с 1 столбцом и 1 строкой. Здесь вы можете проигнорировать ее. .
После нажатия кнопки «отобразить данные» отобразится таблица с указанным выше эффектом.
2. Добейтесь указанного выше эффекта отображения таблицы Excel.
procedure TForm1.btn1Click(Sender: TObject);
var
count: Integer;
begin
//
AdvStringGrid1.ColCount := 0;
AdvStringGrid1.RowCount := 0;
// Инициализируем ранги (3 строки и 4 столбца)
for count: = от 0 до 1 do // Поскольку первая строка является заголовком таблицы, есть только 2 строки, считая от 0, поэтому 2-1 = 1, по той же причине, что и строки и столбцы.
begin
AdvStringGrid1.AddRow;
end;
for count := 0 to 2 do
begin
AdvStringGrid1.AddColumn;
end;
AdvStringGrid1.MergeCells(0, 0, 2, 1);
AdvStringGrid1.Cells[0, 0] := '1';
AdvStringGrid1.Cells[2, 0] := '2';
AdvStringGrid1.Cells[3, 0] := '3';
AdvStringGrid1.MergeCells(1, 1, 2, 1);
AdvStringGrid1.Cells[0, 1] := '4';
AdvStringGrid1.Cells[1, 1] := '5';
AdvStringGrid1.Cells[3, 1] := '6';
AdvStringGrid1.Cells[0, 2] := '7';
AdvStringGrid1.Cells[1, 2] := '8';
AdvStringGrid1.Cells[2, 2] := '9';
AdvStringGrid1.Cells[3, 2] := '10';
end;
Операция следующая:
Эффект достигнут.
Вы можете сами попробовать использовать другие компоненты TMS.
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan |
Поиск: |
|
TMS advStringGrid: многострочные ячейки |
Опции темы |
quarz |
|
||
Бывалый Профиль Репутация: нет
|
сабж. Надо чтоб при записи строки в ячейку
ячейка автоматически масштабировалась по высоте под размер текста. Параметр из SizeWhileTyping Height:=true не подходит, т.к. ячейка будет масштабироваться только при ввода с клавиатуры. Разбивать строку через #13 тоже не хочется, ведь должно это как-то быть реализовано средствами этого компонента Добавлено через 2 минуты и 5 секунд |
||
|
|||
Akella |
|
||
Творец Профиль
Репутация: 36
|
а WordWrap? Добавлено через 11 минут и 49 секунд Добавлено через 13 минут и 11 секунд |
||
|
|||
quarz |
|
||
Бывалый Профиль Репутация: нет
|
WordWrap — слова переносит, но ячейка по высоте не увеличивается. |
||
|
|||
Akella |
|
||
Творец Профиль
Репутация: 36
|
У меня так. Все строки одинаковой высоты, т.е. в одну строку. Затем я нажимаю в ячейке Enter для вызова редактирования. Строка сразу увеличивается, становиться многострочной. Когда выходишь из редактирования, строка так и остаётся много строчной. Может так и задумано? |
||
|
|||
Akella |
|
||
Творец Профиль
Репутация: 36
|
А версия какая у тебя? |
||
|
|||
quarz |
|
||
Бывалый Профиль Репутация: нет
|
А у меня что-то совсем не так ) Это сообщение отредактировал(а) quarz — 1.3.2009, 14:18 |
||
|
|||
quarz |
|
||
Бывалый Профиль Репутация: нет
|
Решение найдено procedure AutoSizeRows(const DoFixedRows: Boolean; const Padding: Integer); Рабочий код для теста:
|
||
|
|||
Pellegrino |
|
||
Новичок Профиль
Репутация: нет
|
Спасибо, пригодилось! Долго искал тоже. Но есть косяк, если была шапка таблички заранее выставленная, то он её тоже сравняет. |
||
|
|||
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
← →
Schummi
(2004-04-25 09:22)
[0]
Доброго времени суток!
Мастера, многие из вас, наверное, пользовались компонентом TadvStringGrid. У меня возникла такая проблема: когда заполняешь большую таблицу(~1000 строк и ~25 столбцов), она заполняется медленно(~6 сек.), а для меня это многовато. Есть ли какая-нибудь возможность заполнять таблицу бстрее? Спасибо!
← →
Schummi
(2004-04-25 15:06)
[1]
плиз, не молчите. Очень надо
← →
evvcom ©
(2004-04-25 15:24)
[2]
А BeginUpdate/EndUpdate пользуешь?
← →
Schummi
(2004-04-25 20:32)
[3]
ну, подробнее. Неа, не использую. А как?
← →
evvcom ©
(2004-04-26 01:57)
[4]
Что значит как?
AdvStringGrid.BeginUpdate;
// Здесь заполняем много ячеек
AdvStringGrid.EndUpdate;
Сложно было F1 нажать?
← →
Германн ©
(2004-04-26 02:07)
[5]
Более того!
Про BeginUpdate и EndUpdate стоит знать не только при использовании AdvStringGrid, но и еще во многих других случаях заполнения данными визуальных компонент! А еще стоит знать DisableControls и EnableControls.
← →
Schummi
(2004-04-26 18:58)
[6]
А оно реально скорость увеличивает?
← →
Schummi
(2004-04-26 19:00)
[7]
2evvcom
Вообще, я помнил, что там были какие-то процы, но не мог вспомнить их названия!
← →
Schummi
(2004-04-26 22:35)
[8]
Ну, попробовал и … мне от этих BeginUpdate/EndUpdate ни холодно, ни жарко!!! т.е. что я применяю, что нет, все равно время заполнения одно и тоже!!!
← →
Германн ©
(2004-04-27 00:32)
[9]
Ну если не помогло, то приведи кусок кода от BeginUpdate до EndUpdate включительно. Иначе никак не помочь.
← →
evvcom ©
(2004-04-27 08:02)
[10]
> Ну если не помогло, то приведи кусок кода от BeginUpdate
> до EndUpdate включительно. Иначе никак не помочь.
Это мы с тобой понимаем, что BeginUpdate и EndUpdate должны быть вне цикла заполнения, а вопрошающий? Кто его знает, понимает ли он это? А то может запихнул их внутрь цикла, вот и проблемы.
2Schummi: Поэтому покажи также и цикл (for, while или repeat)
← →
Schummi
(2004-04-27 14:50)
[11]
Grid.BeginUpdate;
for i:=1 to 1001 do
for j:=0 to 26 do
a[j,i]:=inttostr(Random(500));
Grid.RowCount:=1001;
for i:=1 to 1001 do
for j:=0 to 26 do
begin
Grid.Cells[j,i]:=a[j,i];
if odd(strtoint(a[j,i])) then
Grid.Colors[j,i]:=clRed
else Grid.Colors[j,i]:=clYellow;
end;
Grid.EndUpdate;
← →
Erik ©
(2004-04-27 15:33)
[12]
Вобщето очень много времени уходит на Random. Непользовался TadvStringGrid, но если нужна скорость то стоит подумать о изменении логики. Например используй TVirtualTreeString для нее и 1000000 не проблема. Хотя здесь дело не в компоненте.
← →
evvcom ©
(2004-04-27 15:50)
[13]
Чтобы выяснить причину можно провести несколько тестов:
1. Попробовать стандартный TStringGrid
2. Не использовать Random, а использовать хотя бы простейший счетчик.
3. Избавиться от двойного преобразования IntToStr -> StrToInt
И смотреть, что получится.
← →
Schummi
(2004-04-28 09:08)
[14]
понимаешь, в данный момент проблема не в том, что грид медленно заполняется, а в том, что BeginUpdate/EndUpdate не работает.
max=2500;
...
Grid.BeginUpdate;
Grid.RowCount:=max;
for i:=1 to max do
for j:=0 to 26 do
begin
Grid.Cells[j,i]:=inttostr(j*i);
if odd(j*i) then
Grid.Colors[j,i]:=clRed
else Grid.Colors[j,i]:=clYellow;
end;
Grid.EndUpdate;
Вот, немного переписал, но обратил внимение, что много времени добавляет назначение цвета определенной ячейке, например, в этом коде если цвета присваивать получается 9-ть секунд, а если не присваивать — 1 сек. Вот. А эти цвета мне жизненно необходимы. Может все дело в перерисовке, может её как-нибудь отключить?
← →
evvcom ©
(2004-04-28 09:10)
[15]
Так вот перерисовка и отключается BeginUpdate/EndUpdate.
А вообще я уже находил некоторые глюки и фичи в TAdvStringGrid. Похоже сыроват он еще…
← →
begin…end ©
(2004-04-28 09:30)
[16]
> Schummi
А в чём причина использования TAdvStringGrid вместо TStringGrid? Только из-за разноцветных ячеек, что ли?
← →
pasha_golub ©
(2004-04-28 09:35)
[17]
begin…end © (28.04.04 09:30) [16]
Солидарен. Стандартный TStringGrid, даже более того, TDrawGrid отлично подойдет. У автора сначала заполняется массив, так пусть данные и будут в этом массиве, зачем их дублировать. А вывод осуществлять в обработчике TDrawGrid.OnDrawCell
← →
Schummi
(2004-04-28 18:23)
[18]
to begin…end
ага. Да и функций там больше, типа CellClick и других, которые лень реализовывать на базе TStringGrid
to pasha_golub
а это хорошая идея, попробую.
Но все-таки вопрос остается открытым. Почему не работает BeginUpdate/EndUpdate? (время заполнения при использовании и при не использовании одно и тоже)
← →
WebErr ©
(2004-04-28 18:28)
[19]
Да всё работает, только вероятно, что в данном компоненте вызываются они автоматически, а значит Вы просто ещё два раза их вызвали…
← →
Schummi
(2004-04-29 08:25)
[20]
To pasha_golub ОТЛИЧНАЯ ИДЕЯ!!! ПРОСТО СУПЕР!!! ДАЖЕ И НЕ ЗНАЮ, КАК ВАС БЛАГОДАРИТЬ!!! ТЕПЕРЬ НЕ ПРИХОДИТСЯ ЖДАТЬ. А все же, может есть у этого метода минусы?
← →
Doctor Deejay ©
(2004-05-04 16:30)
[21]
Попробуй свойство Visible у компонента сделать false, а потом true. У меня при больших объемах помогало!
← →
pasha_golub ©
(2004-05-04 16:46)
[22]
Schummi (29.04.04 08:25) [20]
У этого. Ну, как… Наверное есть. Например, вы не сможете использовать методы TStrings, которые предоставляют вам колонки и строки. Но для вашей задачи это, имхо, отличный компромисс.
И вообще чтобы судить о минусах и плюсах, нужно знать чуток поболее о задаче. Быть может вообще не нужно грузить такое кол-во строк. Может можно обойтись mapped файлами, а работать только со страницами в памяти.
Если все-таки такой метод подошел, загляните в исходный код TDBGRID — там много полезного, может натолкнет на кой какие мысли.
Удачи.