C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Компонет StringGrid
Oper01
Отправлено: 31.12.2003, 04:42


Станционный диспетчер

Группа: Участник
Сообщений: 145



Подскажите, как в ячейке компонента StringGrid написать текст в несколько строчек ? Мне нужно вывести три слова друг под другом в одной ячейке. Или StringGrid не даёт такой возможности ?
Valdemar
Отправлено: 31.12.2003, 08:35


Мастер участка

Группа: Участник
Сообщений: 433



Это возможно. Надо увеличить высоту строк до нужного значения, я это делал увеличивая размер шрифта для таблицы. Затем написать обработчик события OnDrawCell, а в нем рисовать данные в ячейках уже как надо и нормальным шрифтом.
Вот пример обработчика события OnDrawCell:
CODE
   TRect r=Rect;
   InflateRect(&r,-2,-2);
   ((TStringGrid*)Sender)->Canvas->FillRect(Rect);
   if (State.Contains(gdFocused))
       ((TStringGrid*)Sender)->Canvas->Font->Color=clBlue;
   else
       if (State.Contains(gdSelected))
           ((TStringGrid*)Sender)->Canvas->Font->Color=clWhite;
       else
           ((TStringGrid*)Sender)->Canvas->Font->Color=clBlack;
   DrawText(((TStringGrid*)Sender)->Canvas->Handle,((TStringGrid*)Sender)->Cells[ACol][ARow].c_str(),
       ((TStringGrid*)Sender)->Cells[ACol][ARow].Length(),&r, DT_WORDBREAK);
Oper01
Отправлено: 01.01.2004, 22:09


Станционный диспетчер

Группа: Участник
Сообщений: 145



Большое спасибо, но честно говоря не совсем разобрался с кодом. Если Вам не сложно, то хотел попросить пояснить его (основные вещи).
Valdemar
Отправлено: 05.01.2004, 10:03


Мастер участка

Группа: Участник
Сообщений: 433



CODE
TRect r=Rect;
  InflateRect(&r,-2,-2);

Здесь делается прямоугольник, в котором будет выводиться текст. Он будет на два пикселя меньше с каждой стороны чем ячейка. Функция InflateRect изменяет размер прямоугольника.
CODE
((TStringGrid*)Sender)->Canvas->FillRect(Rect);

Здесь производится заливка ячейки, чтобы не было видно нарисованного по умолчанию. Т.к. в обработчик события OnDrawCell передается Sender как указатель на TObject, а TObject не имеет Canvas, то необходимо сделать приведение типа Sender к указателю на TStringGrid.
Дальше проверяется в каком состоянии находится ячейка и в зависимости от этого устанавливается цвет шрифта для Canvas таблицы. Эта операция производится с приведением типа.
После того, как цвет шрифта установлен выводится текст с помощью функции DrawText в нужное место. В качестве параметров в эту функцию передаются идентификатор контекста устройства, на которое будет происходить вывод, затем передается указатель на строку для вывода, дляна строки, затем прямоугольник, внутри которого будет выведен текст, и последний параметр указывает, как будет форматироваться текст. DT_WORDBREAK указывает, что надо переносить по словам.
Более подробно можно почитать в хелпе.
Надеюсь, что смог разъяснить.
Oper01
Отправлено: 07.01.2004, 00:48


Станционный диспетчер

Группа: Участник
Сообщений: 145



Большое спасибо за помощь!

Вернуться в Вопросы программирования в C++Builder