Advstringgrid мануал на русском

Свойства и методы 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: многострочные ячейки 

V

   

Опции темы

quarz
Дата 1.3.2009, 01:46 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3

сабж. Надо чтоб при записи строки в ячейку

Код
advStringGrid.Cells[1,1]:='Очень длинная строка';

 ячейка автоматически масштабировалась по высоте под размер текста. Параметр из SizeWhileTyping Height:=true не подходит, т.к. ячейка будет масштабироваться только при ввода с клавиатуры. Разбивать строку через #13 тоже не хочется, ведь должно это как-то быть реализовано средствами этого компонента

Добавлено через 2 минуты и 5 секунд
P.S. Примеры с  офф.сайта смотрел, тему Акеллы про TMS тоже

PM MAIL   Вверх
Akella
Дата 1.3.2009, 01:54 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

а WordWrap?

Добавлено через 11 минут и 49 секунд
а multilinecells?

Добавлено через 13 минут и 11 секунд
http://www.tmssoftware.com/site/asg1.asp

PM MAIL   Вверх
quarz
Дата 1.3.2009, 02:18 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3

WordWrap — слова переносит, но ячейка по высоте не увеличивается.
multilinecells попробовал — ноль реакции, разницы вообще никакой.
А этот пример я смотрел, они читеры. Там ячейки в designEditor’e заранее по высоте подогнаны! smile

PM MAIL   Вверх
Akella
Дата 1.3.2009, 11:39 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

У меня так. Все строки одинаковой высоты, т.е. в одну строку. Затем я нажимаю в ячейке Enter для вызова редактирования. Строка сразу увеличивается, становиться многострочной. Когда выходишь из редактирования, строка так и остаётся много строчной. Может так и задумано?

PM MAIL   Вверх
Akella
Дата 1.3.2009, 12:01 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

А версия какая у тебя?

PM MAIL   Вверх
quarz
Дата 1.3.2009, 14:02 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3

Цитата(Akella @  1.3.2009,  14:39 Найти цитируемый пост)
У меня так. Все строки одинаковой высоты, т.е. в одну строку

А у меня что-то совсем не так ) 
Версия advStringGrid — 4.0.14.0
Это вроде последняя версия, из TMS component pack v5.0.1

Это сообщение отредактировал(а) quarz — 1.3.2009, 14:18

PM MAIL   Вверх
quarz
Дата 1.3.2009, 15:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3

Решение найдено  smile

procedure AutoSizeRows(const DoFixedRows: Boolean; const Padding: Integer);
Description : modifies the height of all rows (except fixed rows if specified) so that all text properly fits in the rows. Only required when using the grid in multiline mode. Optionally adds extra space specified in the padding parameter. 

Рабочий код для теста:

Код

advStringGrid1.Multilinecells:=true;                                //хотя у меня и без этого почему-то работает
advStringGrid1.WordWrap:=true;                                  //а вот это нужно обязательно
advStringGrid1.Cells[1,1]:='Очень длинная строка';
advStringGrid1.AutoSizeRows(true);
PM MAIL   Вверх
Pellegrino
Дата 11.3.2012, 09:42 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 32
Регистрация: 13.3.2007
Где: Russian Federatio n

Репутация: нет
Всего: нет

Спасибо, пригодилось! Долго искал тоже. Но есть косяк, если была шапка таблички заранее выставленная, то он её тоже сравняет. 

PM MAIL WWW   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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]

Да всё работает, только вероятно, что в данном компоненте вызываются они автоматически, а значит Вы просто ещё два раза их вызвали… 8)


 
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 — там много полезного, может натолкнет на кой какие мысли.

Удачи.


Понравилась статья? Поделить с друзьями:
  • Средство для укрепления волос эсвицин инструкция по применению цена отзывы
  • Холодильник стинол 107 инструкция по эксплуатации с фото
  • Алфлутоп уколы инструкция по применению внутримышечно для чего отзывы цена
  • Энтерол порошок инструкция по применению цена 100 мг
  • Мануал на хонда аккорд cf4