Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
#1

Многострочность в StringGrid - C++ Builder

14.03.2014, 11:26. Просмотров 969. Ответов 6

Всем привет! Столкнулся с проблемой многострочности в StringGrid.
Может кто-то знает, что нужно прописать в onDrawCell чтобы появилась возможность многострочности?
Заранее благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 11:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Многострочность в StringGrid (C++ Builder):

Многострочность в TreeView - C++ Builder
Доброго дня! Не подскажите - возможен ли в этом компоненте перенос текста на другую строку в пределах одного узла при наличие в первой...

Вывести данные из StringGrid-ов на двух формах в StringGrid на третьей форме - C++ Builder
Помогите,не разбираюсь,только учусь:(:wall:...Вообщем,имеется программа с 3 формами. На первой из них находится вводный StringGrid с...

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid - C++ Builder
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010: //загрузка из файла procedure...

Как соединить StringGrid с другим StringGrid (Rad xe8) - C++ Builder
Здраствуйте. Проблема заключается в следующем: Есть таблица которая указана на 1 изображении дание с которой нада синхронизировать с...

Есть 2 StringGrid в С++ Builder, и нужно взять оттуда данные и заполнить ими 3 StringGrid, как бы сложить 2 та - C++ Builder
Код C++ void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j; float p,p1; for (i = 0; i < 48; i++) { ...

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки - C++ Builder
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность вручную писать данные в ячейки StringGrid...

6
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25531 / 17084 / 5413
Регистрация: 22.10.2011
Сообщений: 30,247
Записей в блоге: 6
14.03.2014, 12:19 #2
В дельфийском коде разберешься?
Как сделать многострочный текст в ячейках TStringGrid?
1
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
14.03.2014, 15:32  [ТС] #3
Пример очень хороший! Как раз то что мне и нужно, но при переводе с делфи возникает много разных ошибок. Дело в том что делфи я учил только в школе, много лет назад... Совсем его подзабыл)
Вот, что-то делал, переделал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
 
  TStringGrid *Sg = new TStringGrid(this);
  TStringList *FSl = new TStringList;
  TRect vRectM, vRectD;
  int i;
 
  int FTextHeight = ((Sg->Canvas->TextHeight("A")) + 2);
 
  //Очищаем область ячейки.
  Sg->Canvas->FillRect(Rect);
  //Определяем область прорисовки для ячейки. - Берём область ячейки
  //и исключаем по паре пикселов для создания полей.
  vRectM = Rect;
  vRectM.Left = vRectM.Left + 2;
  vRectM.Right = vRectM.Right - 2;
  vRectM.Top = vRectM.Top + 2;
  vRectM.Bottom = vRectM.Bottom - 2;
  //Формируем область прорисовки для строки текста.
  //Высота этой области сформирована на основе сведений о высоте текста.
  vRectD = vRectM;
  vRectD.Bottom = vRectD.Top + FTextHeight;
  //Формируем список строк на основе текста ячейки.
  FSl->Text = Sg->Cells[ACol, ARow];
  //Построчно прорисовываем текст.
  for (i = 0; i < FSl->Count - 1; i++)
  {
    //Если область прорисовки вышла за пределы ячейки - прерываем цикл.
    if (!IntersectRect(vRectD, vRectD, vRectM)) break;
    //Прорисовываем очередную строку текста.
    Sg->Canvas->TextRect(vRectD, vRectD.Left + 1, vRectD.Top + 1, FSl[i]);
    //Сдвигаем область прорисовки строк вниз на величину высоты текста.
    Inc(vRectD.Top, FTextHeight);
    vRectD.Bottom = vRectD.Top + FTextHeight;
  }
}
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25531 / 17084 / 5413
Регистрация: 22.10.2011
Сообщений: 30,247
Записей в блоге: 6
14.03.2014, 16:30 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
    TRect &Rect, TGridDrawState State)
{
    TStringGrid *grid = static_cast<TStringGrid*>(Sender);
    int FTextHeight = ((grid->Canvas->TextHeight("A")) + 2);
    grid->DefaultDrawing = false;
 
    TStringList* FS = new TStringList;
    // Очищаем область ячейки.
    grid->Canvas->FillRect(Rect);
 
    // Определяем область прорисовки для ячейки. - Берём область ячейки
    // и исключаем по паре пикселов для создания полей.
    TRect vRectM = Rect;
    vRectM.Left = vRectM.Left + 2;
    vRectM.Right = vRectM.Right - 2;
    vRectM.Top = vRectM.Top + 2;
    vRectM.Bottom = vRectM.Bottom - 2;
 
    // Формируем область прорисовки для строки текста.
    // Высота этой области сформирована на основе сведений о высоте текста.
    TRect vRectD = vRectM;
    vRectD.Bottom = vRectD.Top + FTextHeight;
 
    // Формируем список строк на основе текста ячейки.
    FS->Text = grid->Cells[ACol][ARow];
    // Построчно прорисовываем текст.
    for (int i = 0; i < FS->Count; i++)
    {
        // Если область прорисовки вышла за пределы ячейки - прерываем цикл.
        if (!IntersectRect(vRectD, vRectD, vRectM))
            break;
        // Прорисовываем очередную строку текста.
        grid->Canvas->TextRect(vRectD, vRectD.Left + 1, vRectD.Top + 1, FS->Strings[i]);
        // Сдвигаем область прорисовки строк вниз на величину высоты текста.
        vRectD.Top += FTextHeight;
        vRectD.Bottom = vRectD.Top + FTextHeight;
    }
    delete FS;
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    StringGrid1->Cells[1][1] = "one\ntwo\nthree"; // Записываем многострочный текст в ячейку
}
Особое внимание - на строку №4, и сравни с тем, что делалось в твоем коде.
2
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
14.03.2014, 22:53  [ТС] #5
Многострочость StringGrid работает, но не так как хотелось.
Дело в том, что строка (ячейка) не увеличилась, поэтому вторая и последующие строки скрылись за границами ячейки.
И к тому же было поставлено задание что ширина ячейки не должна увеличиваться, только высота + должен отображаться весь текст ячейки. Если текст не помешается по ширине ячейки, он должен разбиться на строки. Может есть какой-то другой компонент который умеет переносить текст на новые строки?
0
Avazart
Эксперт С++
7585 / 5570 / 330
Регистрация: 10.12.2010
Сообщений: 24,991
Записей в блоге: 17
14.03.2014, 23:33 #6
С новой строки в ячейке StringGrid
1
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
17.03.2014, 19:00  [ТС] #7
Вот добавил увеличение высоты строки. Теперь нормально работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
    TStringGrid *grid = static_cast<TStringGrid*>(Sender);
    int FTextHeight = ((grid->Canvas->TextHeight("A")) + 5);
    grid->DefaultDrawing = false;
 
    TStringList* FS = new TStringList;
    // Очищаем область ячейки.
    grid->Canvas->FillRect(Rect);
 
    // Определяем область прорисовки для ячейки. - Берём область ячейки
    // и исключаем по паре пикселов для создания полей.
    TRect vRectM = Rect;
    vRectM.Left = vRectM.Left + 2;
    vRectM.Right = vRectM.Right - 2;
    vRectM.Top = vRectM.Top + 2;
    vRectM.Bottom = vRectM.Bottom - 2;
 
    // Формируем область прорисовки для строки текста.
    // Высота этой области сформирована на основе сведений о высоте текста.
    TRect vRectD = vRectM;
    vRectD.Bottom = vRectD.Top + FTextHeight;
 
    // Формируем список строк на основе текста ячейки.
    FS->Text = grid->Cells[ACol][ARow];
    // Построчно прорисовываем текст.
    for (int i = 0; i < FS->Count; i++)
    {
        // Если область прорисовки вышла за пределы ячейки - прерываем цикл.
        if (!IntersectRect(vRectD, vRectD, vRectM))
            break;
        // Прорисовываем очередную строку текста.
        grid->Canvas->TextRect(vRectD, vRectD.Left + 1, vRectD.Top + 1, FS->Strings[i]);
        // Сдвигаем область прорисовки строк вниз на величину высоты текста.
        vRectD.Top += FTextHeight;
        vRectD.Bottom = vRectD.Top + FTextHeight;
    }
 
    //Если количество строк > 1, и высота строки меньше требуемой, то увеличиваем её высоту
    if (FS->Count > 1) && (StringGrid1->RowHeights[ARow] < (FTextHeight * FS->Count)))
    {
       StringGrid1->RowHeights[ARow] = FTextHeight * FS->Count;
    }
 
    delete FS;
}
0
17.03.2014, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 19:00
Привет! Вот еще темы с ответами:

StringGrid - C++ Builder
я программист начинающий. имею таблицу Стринггрид 2 строки и 10 столбцов. хочу считать с каждой ячейки вводимое число и записать в...

StringGrid - C++ Builder
Как ко второму столбцу в StringGrid присвоить переменную и вообще такое возможно?

stringgrid - C++ Builder
здравствуйте, вопрос так, мелочный) просто не могу понять есть 2 массива, они заполняются вручную, затем данные(которые содержаться в...

StringGrid - C++ Builder
void __fastcall TForm1::sgSelectCell(TObject *Sender, int ACol, int ARow, bool &amp;CanSelect) { ShowMessage(sg-&gt;Cells); } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru