StringGrid: ячейки с многострочным текстом
Модератор: Модераторы
StringGrid: ячейки с многострочным текстом
Как создать StringGrid (или другой *Grid) с многострочным текстом в ячейках? Пробовал вставлять переводы строки - заменяет их на пробелы.
всё уже создано до нас:
в этом случае #13 обрабатывается как принудительный перенос строки, хотя WordBreak позволяет переносить их автоматически. В общем, если вы хотите, чтобы TextRect сам расставлял переносы - отключаете SingleLine и включаете WordBreak. если вам надо, чтобы переносилось только по вашим символам перевода каретки - отключаете и SingleLine и WordBreak.
з.ы. только не забудьте выосту и ширину строк в TStringGrid увеличить
Код: Выделить всё
with StringGrid1.Canvas do begin
TextStyle.SingleLine := FALSE;
TextStyle.Wordbreak := TRUE;
TextRect (aRect, aRect.Left, aRect.Top, 'Сьешь'#13' ещё этих мягких французских булок');
end;
в этом случае #13 обрабатывается как принудительный перенос строки, хотя WordBreak позволяет переносить их автоматически. В общем, если вы хотите, чтобы TextRect сам расставлял переносы - отключаете SingleLine и включаете WordBreak. если вам надо, чтобы переносилось только по вашим символам перевода каретки - отключаете и SingleLine и WordBreak.
з.ы. только не забудьте выосту и ширину строк в TStringGrid увеличить
Спасибо.
У меня меньшая часть ячеек содержит по 3-4 строки, большая - всего одну. Если задать высоту всех ячеек одинаковой (StringGrid1.DefaultRowHeight), будет выглядеть неаккуратно. Слово "Default" намекает на то, что есть и еще и не default свойство. Нет ли способа установить ее разной, в зависимости от значения ячейки?
yurgel писал(а):з.ы. только не забудьте выосту и ширину строк в TStringGrid увеличить
У меня меньшая часть ячеек содержит по 3-4 строки, большая - всего одну. Если задать высоту всех ячеек одинаковой (StringGrid1.DefaultRowHeight), будет выглядеть неаккуратно. Слово "Default" намекает на то, что есть и еще и не default свойство. Нет ли способа установить ее разной, в зависимости от значения ячейки?
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.ColWidths[2] := 200;
StringGrid1.RowHeights[2] := 100;
end;
Добавлено спустя 1 минуту 33 секунды:
krab писал(а):Нет ли способа установить ее разной, в зависимости от значения ячейки?
можно установить разную высоту для разных строк, или разную ширину для разных столбцов. но в рамках одной строки сделать ячейки разной высоты, есс-но, не получится.
yurgel писал(а):можно установить разную высоту для разных строк, или разную ширину для разных столбцов.
Мне больше и не нужно.
Добавлено спустя 1 час 3 минуты:
yurgel писал(а):
Можно ли как-то устроить автоподбор высоты строк?
Код: Выделить всё
Canvas.TextHeight
Canvas.TextWidth
Добавлено спустя 38 секунд:
krab
Удалите тему viewtopic.php?t=6010&view=unread#unread
Mr.Smart писал(а):Код: Выделить всё
Canvas.TextHeight
Canvas.TextWidth
это здесь ни при чём.
2 TC.
единственное, что приходит в голову - это при изменении ячейки расчитывать высоту каждой ячейки в этой строке и устанавливать максимальную высоту. для этого можно использовать DrawText с параметрами DT_WORDBREAK + DT_CALCRECT. тогда она не будет физически выводить текст, а просто расчитает высоту указанного ARECT (он идёт одним из параметров) с учётом всех переносов. но это требует uses Windows, кроссплатформенного способа я не знаю.
Mr.Smart писал(а):Код: Выделить всё
Canvas.TextHeight
Canvas.TextWidth
Но как применить это к коду (см. ниже). Canvas.TextWidth(Text : string) требует саму строку. Вот если бы узнать длину канвы в символах...
Добавлено спустя 8 минут 38 секунд:
yurgel писал(а):так ведь она зависит от выбранного шрифта. а если шрифт не моноширинный - то и от самой строки, 'iiiii' и 'wwwww' - в пикселях будут разной длины. можно узнать, влезет ли заданная строка в ячейку, если не влезет - обрезать.
Как лучше это сделать?
Пока делаю так:
Код: Выделить всё
// длина содержимого текстовой строки в пикселах
twidth := GetTextWidth(StringGrid1.Cells[1,aRow]);
// сколько строк займет содержимое: делим его ширину на ширину канвы
count := round(twidth / (Canvas.Width*0.8) + 0.5);
StringGrid1.RowHeights[aRow] := count*2*GetTextHeight(StringGrid1.Cells[1,aRow]);
с кучей поправочных коэффициентов.
krab
Берите символ максимального размера и перемножайте на количество
Берите символ максимального размера и перемножайте на количество
Код: Выделить всё
Canvas.TextWidth('W')*countсамое простое - проверить, работает ли DrawText. он реализован на уровне TWidgetSet, поэтому скорее всего, будет работать и под линухом. просто проверить я не могу 
задаёте у fRect левую, верхнюю и правую границы и что-то типа DrawText(DC, pChar(Text), Length(Text), fRect, DT_CALCRECT or DT_WORDBREAK), где DC - это Canvas.Handle. эта функция выставит нижнюю границу fRect с учётом всех переносов.
задаёте у fRect левую, верхнюю и правую границы и что-то типа DrawText(DC, pChar(Text), Length(Text), fRect, DT_CALCRECT or DT_WORDBREAK), где DC - это Canvas.Handle. эта функция выставит нижнюю границу fRect с учётом всех переносов.
Mr.Smart писал(а):krab
Берите символ максимального размера и перемножайте на количествоКод: Выделить всё
Canvas.TextWidth('W')*count
Если я правильно понял идею, речь о
Код: Выделить всё
// длина содержимого текстовой строки в пикселах
twidth := GetTextWidth(StringGrid1.Cells[1,aRow]);
// сколько строк займет содержимое: делим его ширину на ширину канвы
count := round(twidth / (Canvas.Width*0.8) + 0.5);
StringGrid1.RowHeights[aRow] := Canvas.TextHeight('W')*count*2; // <---- изменения здесь
Получилось то же самое, по сути. Без поправочного коэффициента 2 в выделенной "<-----" строке одна из строк не влезет. А точнее, две (первая и последняя), потому что StringGrid центрирует текст по высоте.
Последний раз редактировалось krab 05.07.2010 20:21:56, всего редактировалось 1 раз.
StringGrid1.RowHeights[aRow] := Canvas.TextWidth('W')*count*2;
тогда уже StringGrid1.RowHeights[aRow] := Canvas.TextHeight('Wg')*count;
з.ы. кстати, повторный вызов DrawText с теми же параметрами, но без DT_CALCRECT выведет текст в этот прямоугольник. собственно, TCanvas.TextRect так и работает.
Использую измененный StringGrid1DrawCell для отображения многострочного текста. Очередная странность: в заголовках колонок отображается пустой текст. Как до, так и после записи текста в ячейки. Чем это может быть вызвано?
Код: Выделить всё
// вставка многострочного текста в ячейки
procedure TForm1.Button1Click(Sender: TObject);
begin
with StringGrid1 do
begin
RowCount := RowCount + 1;
StringGrid1.Cells[0,RowCount - 1] := 'A'#13'AAAA';
StringGrid1.Cells[1,RowCount - 1] := 'B'#13'BBBB';
StringGrid1.Cells[2,RowCount - 1] := 'C'#13'CCCC';
end;
end;
//
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
twidth, count: integer;
begin
if aRow <> 0 then // если эту строку закомментировать,
// ... то заголовки колонок не будут отображаться вообще
with StringGrid1 do
begin
Canvas.TextStyle.SingleLine := False;
Canvas.TextStyle.Wordbreak := True;
twidth := Canvas.GetTextWidth(StringGrid1.Cells[1,aRow]);
count := round(twidth / (Canvas.Width*0.8) + 0.5);
//if count > 1 then
begin
StringGrid1.RowHeights[aRow] := count*Canvas.TextHeight('W')*2;
end;
end; У вас нет необходимых прав для просмотра вложений в этом сообщении.
krab
А вы не думаете, что в гриде заголовок тоже является ячейкой, которую необходимо тоже рисовать самому
А вы не думаете, что в гриде заголовок тоже является ячейкой, которую необходимо тоже рисовать самому
