БлогNot. 11 полезных приёмов работы со StringGrid

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 [44418 просмотров]


теги: список программирование c++ builder

показать комментарии (2)