StringGrid: ячейки с многострочным текстом

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

StringGrid: ячейки с многострочным текстом

Сообщение krab » 05.07.2010 13:04:19

Как создать StringGrid (или другой *Grid) с многострочным текстом в ячейках? Пробовал вставлять переводы строки - заменяет их на пробелы.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение yurgel » 05.07.2010 16:43:14

всё уже создано до нас:

Код: Выделить всё
  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 увеличить ;)
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Re: StringGrid: ячейки с многострочным текстом

Сообщение krab » 05.07.2010 17:43:02

Спасибо.
yurgel писал(а):з.ы. только не забудьте выосту и ширину строк в TStringGrid увеличить

У меня меньшая часть ячеек содержит по 3-4 строки, большая - всего одну. Если задать высоту всех ячеек одинаковой (StringGrid1.DefaultRowHeight), будет выглядеть неаккуратно. Слово "Default" намекает на то, что есть и еще и не default свойство. Нет ли способа установить ее разной, в зависимости от значения ячейки?
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение yurgel » 05.07.2010 17:48:16

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.ColWidths[2] := 200;
  StringGrid1.RowHeights[2] := 100;
end;


Добавлено спустя 1 минуту 33 секунды:
krab писал(а):Нет ли способа установить ее разной, в зависимости от значения ячейки?


можно установить разную высоту для разных строк, или разную ширину для разных столбцов. но в рамках одной строки сделать ячейки разной высоты, есс-но, не получится.
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Re: StringGrid: ячейки с многострочным текстом

Сообщение krab » 05.07.2010 18:30:19

yurgel писал(а):можно установить разную высоту для разных строк, или разную ширину для разных столбцов.

Мне больше и не нужно. :)

Добавлено спустя 1 час 3 минуты:
yurgel писал(а):

Можно ли как-то устроить автоподбор высоты строк?
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение Mr.Smart » 05.07.2010 19:44:19

Код: Выделить всё
  Canvas.TextHeight
  Canvas.TextWidth


Добавлено спустя 38 секунд:
krab
Удалите тему viewtopic.php?t=6010&view=unread#unread
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: StringGrid: ячейки с многострочным текстом

Сообщение yurgel » 05.07.2010 19:51:17

Mr.Smart писал(а):
Код: Выделить всё
  Canvas.TextHeight
  Canvas.TextWidth


это здесь ни при чём.

2 TC.

единственное, что приходит в голову - это при изменении ячейки расчитывать высоту каждой ячейки в этой строке и устанавливать максимальную высоту. для этого можно использовать DrawText с параметрами DT_WORDBREAK + DT_CALCRECT. тогда она не будет физически выводить текст, а просто расчитает высоту указанного ARECT (он идёт одним из параметров) с учётом всех переносов. но это требует uses Windows, кроссплатформенного способа я не знаю.
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Re: StringGrid: ячейки с многострочным текстом

Сообщение Nik » 05.07.2010 19:52:26

Может проще взять KGrig и не морочиться?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: StringGrid: ячейки с многострочным текстом

Сообщение krab » 05.07.2010 19:53:40

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
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение Mr.Smart » 05.07.2010 20:11:33

krab
Берите символ максимального размера и перемножайте на количество
Код: Выделить всё
Canvas.TextWidth('W')*count
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: StringGrid: ячейки с многострочным текстом

Сообщение yurgel » 05.07.2010 20:18:04

самое простое - проверить, работает ли DrawText. он реализован на уровне TWidgetSet, поэтому скорее всего, будет работать и под линухом. просто проверить я не могу :)

задаёте у fRect левую, верхнюю и правую границы и что-то типа DrawText(DC, pChar(Text), Length(Text), fRect, DT_CALCRECT or DT_WORDBREAK), где DC - это Canvas.Handle. эта функция выставит нижнюю границу fRect с учётом всех переносов.
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Re: StringGrid: ячейки с многострочным текстом

Сообщение krab » 05.07.2010 20:20:07

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 раз.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение yurgel » 05.07.2010 20:21:54

StringGrid1.RowHeights[aRow] := Canvas.TextWidth('W')*count*2;


тогда уже StringGrid1.RowHeights[aRow] := Canvas.TextHeight('Wg')*count;

з.ы. кстати, повторный вызов DrawText с теми же параметрами, но без DT_CALCRECT выведет текст в этот прямоугольник. собственно, TCanvas.TextRect так и работает.
yurgel
новенький
 
Сообщения: 37
Зарегистрирован: 29.06.2010 16:06:58

Re: StringGrid: ячейки с многострочным текстом

Сообщение krab » 08.07.2010 21:47:51

Использую измененный 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;                   

form.JPG
У вас нет необходимых прав для просмотра вложений в этом сообщении.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: StringGrid: ячейки с многострочным текстом

Сообщение Mr.Smart » 08.07.2010 22:21:06

krab
А вы не думаете, что в гриде заголовок тоже является ячейкой, которую необходимо тоже рисовать самому :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 239

Рейтинг@Mail.ru