Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Многострочный текст в StringGrid


Автор: artsb 7.2.2009, 11:23
Всем привет!

Такая задача:
Нужно отображать многострочный текст в ячейке StringGrid'а, причём, размер ячейки должен подгоняться под размер текста.

Я уже понял, что многострочный текст StringGrid не отображает. Его нужно рисовать самому.
Проблема в том, что я не могу найти свойства Height для конкретной строки и Width для конкретного столбца. Хотя у самого StringGrid'a в опциях можно разрешить изменение размеров строк и столбцов. А следовательно, он их должен где-то хранить...

Автор: Usper 7.2.2009, 20:12
Ширина столбца - StringGrid1->ColWidths[№ столбца]. Высота строки - StringGrid1->RowHeights[№ строки].

Автор: THandle 7.2.2009, 21:27
artsb, посмотри эти статью, может быть найдешь что то полезное:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=806
http://www.delphimaster.ru/articles/stringgrid/index.html

Автор: artsb 7.2.2009, 21:53
Usper, спасибо. Какой-то я не внимательный. smile

THandle, спасибо, посмотрю.

Автор: THandle 8.2.2009, 10:42
Кстати, что интересно, bose, вчера же написал на данную тему у себя в блоге:

http://tdelphi.blogspot.com/2009/02/dbgrid.html

Автор: artsb 8.2.2009, 19:39
Цитата(THandle @  8.2.2009,  10:42 Найти цитируемый пост)
Кстати, что интересно, bose, вчера же написал на данную тему у себя в блоге:

Спс. В принципе, то же что и по первой ссылке выше smile

Автор: artsb 8.2.2009, 22:34
Тестовая функция StringGrig1DrawCell выглядит так:
Код

{
TRect tr;
AnsiString s = "Hello world! Hello world!\nAnd hello world!";
const pole = 5;

DrawText(SrtingGrid1->Canvas->Handle, s.c_str, s.Length(), &tr, DT_WORDBREAK | DT_CALCRECT); // определяю длину и высоту текста

StringGrid1->RowHeights[ARow] = tr.Height() + pole * 2;
StringGrid1->ColWidth[ACol] = tr.Width() + pole * 2;

Rect = StringGrid1->CellRect[ARow][ACol];
StringGrid1->Canvas->FillRect(Rect);
tr.left = Rect.left + pole;
tr.top = Rect.top + pole;
tr.right = Rect.right - pole;
tr.bottom = Rect.bottom - pole;

DrawText(SrtingGrid1->Canvas->Handle, s.c_str, s.Length(), &tr, DT_WORDBREAK);
}

При условии, что есть фиксированные строки и столбцы, код рабочий. Как только убираю их - нормально прорисовывается только первая ячейка (остальные перерисовываются после кликов по ним). Оказывается, при вызове DrawText (когда определяю длину и высоту) для первой ячейки tr заполняется нормально, а при последующих - всякая белебирда(точнее она вообще не заполняется, остаются значения, полученные после создания переменной).
Стал думать, из-за чего это может быть...
Объявил s глобально - всё стало отлично.
Объявил tr глобально - началась таже пляска, только теперь все поля в tr заполнены нулями. Вернул tr обратно - всё нормально.

Не пойму, что за чертовщина? Что-то не то с DrawText?

ЗЫ код набирал по памяти, так что могут быть ошибки. smile

Автор: artsb 8.2.2009, 23:16
smile все глюки пропали, после того, как убрал флаг DT_WORDBREAK при первом вызове DrawText. Теперь независимо от того, где объявлены s и tr, результат одинаков.

Как-то странно всё это...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)