11 полезных приёмов работы со StringGrid
...то есть, базовым табличным компонентом, имеющимся в C++ Builder (палитра Additional) и подобных средах. Надо бы 12, но 12-го сегодня не было :) Везде предполагается, что таблица называется StringGrid1
и имеет все свойства по умолчанию.
1. Выделить группу ячеек таблицы:
TGridRect SelectedRect; SelectedRect.Left=1; //Левая граница SelectedRect.Top=1; //Верхняя граница SelectedRect.Right=4; //Правая граница SelectedRect.Bottom=3; //Нижняя граница StringGrid1->Selection=SelectedRect;
2. Переписать содержимое ячеек в текстовый файл:
TStringList *List = new TStringList(); for (int i=0; i<StringGrid1->RowCount-1; i++) for (int j=0; j<StringGrid1->ColCount-1; j++) List->Add(StringGrid1->Cells[j][i]); List->SaveToFile("tab.txt"); Memo1->Lines->LoadFromFile("tab.txt"); //Загрузили файл для проверки
3. Очистить все ячейки таблицы:
for (int i=StringGrid1->FixedCols;i<StringGrid1->ColCount; i++) StringGrid1->Cols[i]->Clear();
4. Закрасить ячейку (в обработчике события OnDrawCell
):
StringGrid1->Canvas->Brush->Color=clYellow; if (ACol==2 && ARow==2) { StringGrid1->Canvas->FillRect(Rect); StringGrid1->Canvas->TextOut (Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]); }
5. Картинка в ячейке таблицы:
TPicture *Picture; //Описана глобально //Обработчик события OnCreate формы Picture = new TPicture (); Picture->LoadFromFile("c:\\WINDOWS\\Паркет.bmp"); StringGrid1->ColWidths[1]=Picture->Width; StringGrid1->RowHeights[1]=Picture->Height; //Обработчик события OnDrawCell таблицы if (ACol==1 && ARow==1) StringGrid1->Canvas->StretchDraw (Rect, Picture->Graphic);
6. Вставить/удалить строки/столбцы: реализовать программно цикл с выбором нужных ячеек, например:
int ARow=1,i,j; for (i=ARow+1;i<StringGrid1->RowCount;i++) for (j=0;j<StringGrid1->ColCount;j++) StringGrid1->Cells[j][i-1]=StringGrid1->Cells[j][i]; for (i=0;i<StringGrid1->ColCount;i++) StringGrid1->Cells[i][StringGrid1->RowCount-1]=""; StringGrid1->RowCount--;
7. Разрешаем редактировать только столбцы с нечётными номерами (1, 3, …; в обработчике события OnSelectCell
таблицы):
CanSelect = ACol%2 != 0;
8. Ограничиваем длину текста, вводимого в ячейку, 5 символами (обработчик события SetEditText
):
if (StringGrid1->Cells[ACol][ARow].Length()>5) { ShowMessage("Больше 5") ; StringGrid1->Cells[ACol][ARow]= StringGrid1->Cells[ACol][ARow].SubString(1,5); }
9. В первом столбце запрещаем вводить цифры, в остальных – разрешаем только цифры, знак “-”, запятую, BACKSPACE и ENTER:
int Col=1; //Глобально //В обработчике OnKeyPress if (Col==1){ if ((Key >= '0') && (Key <= '9')) Key = 0; } else { if ((Key >= '0') && (Key <= '9') || Key==VK_BACK || Key==VK_RETURN) {} else if ( (Key == ',') || (Key == '-')) {} else Key = 0; } //В обработчике OnSelectSell Col=ACol;
10. Как узнать координаты выделенной (текущей) ячейки в StringGrid, если их нет в обработчике нужного события?
int Left = StringGrid1->Selection.Left; int Top = StringGrid1->Selection.Top; ShowMessage ((String)Left+" "+(String)Top);
Помним про нумерацию столбцов и строк с нуля :)
11. А как получить пиксельные координаты ячейки таблицы?
TRect Rect = StringGrid1->CellRect(StringGrid1->Col,StringGrid1->Row); ShowMessage ((String)Rect.Left+" "+(String)Rect.Top);
Если нужно считать от левого верхнего угла формы, а на StringGrid'а, добавьте к полученным
координатам значения StringGrid1->Left
и StringGrid1->Top
31.08.2013, 16:08 [45394 просмотра]