Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319

Многострочность в StringGrid

14.03.2014, 11:26. Показов 3842. Ответов 10

Студворк — интернет-сервис помощи студентам
Всем привет! Столкнулся с проблемой многострочности в StringGrid.
Может кто-то знает, что нужно прописать в onDrawCell чтобы появилась возможность многострочности?
Заранее благодарю!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2014, 11:26
Ответы с готовыми решениями:

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

TButton и многострочность в StringGrid
Привет! Возникли два вопроса, помогите) 1) Мне в таблицу надо поместить кнопку -- TButton. Расскажите, что это и как этим пользоваться,...

WPF и многострочность
Сабж. У меня например есть такой код: private void Window_Loaded(object sender, RoutedEventArgs e) { ...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
14.03.2014, 12:19
В дельфийском коде разберешься?
https://www.cyberforum.ru/delp... ost2023505
1
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
14.03.2014, 15:32  [ТС]
Пример очень хороший! Как раз то что мне и нужно, но при переводе с делфи возникает много разных ошибок. Дело в том что делфи я учил только в школе, много лет назад... Совсем его подзабыл)
Вот, что-то делал, переделал
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
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
14.03.2014, 16:30
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
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
14.03.2014, 22:53  [ТС]
Многострочость StringGrid работает, но не так как хотелось.
Дело в том, что строка (ячейка) не увеличилась, поэтому вторая и последующие строки скрылись за границами ячейки.
И к тому же было поставлено задание что ширина ячейки не должна увеличиваться, только высота + должен отображаться весь текст ячейки. Если текст не помешается по ширине ячейки, он должен разбиться на строки. Может есть какой-то другой компонент который умеет переносить текст на новые строки?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.03.2014, 23:33
С новой строки в ячейке StringGrid
1
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
17.03.2014, 19:00  [ТС]
Вот добавил увеличение высоты строки. Теперь нормально работает.

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
0 / 0 / 0
Регистрация: 11.07.2022
Сообщений: 4
01.11.2022, 14:21
а подскажите, пожалуйста, стоит опция goRowSelect , и потом пропадает
0
Модератор
 Аватар для D1973
9915 / 6452 / 2455
Регистрация: 21.01.2014
Сообщений: 27,385
Записей в блоге: 3
01.11.2022, 19:24
Цитата Сообщение от user_serg Посмотреть сообщение
стоит опция goRowSelect , и потом пропадает
это магия!
а если серьезно, то будет нормальный вопрос - будет нормальный ответ.
0
0 / 0 / 0
Регистрация: 11.07.2022
Сообщений: 4
01.11.2022, 23:27
D1973, использую код для многострочного текста в StringGrind, но затем не получается выделить строку или ячейку
0
Модератор
 Аватар для D1973
9915 / 6452 / 2455
Регистрация: 21.01.2014
Сообщений: 27,385
Записей в блоге: 3
02.11.2022, 06:40
Цитата Сообщение от user_serg Посмотреть сообщение
не получается выделить строку или ячейку
Вы, я так понимаю, вообще не вникали в представленный выше код? Раз Вы взялись рисовать на канве СтрингГрида, то рисовать должны все сами. Вообще все, и выделение - в том числе.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2022, 06:40
Помогаю со студенческими работами здесь

Многострочность в Virtual String Tree
Доброго времени суток всем просьба откликнуться тех кто имел практическуий опыт работы с VST (а конкретно включал многострочность для...

динамически создаваемый стринггрид + многострочность
Всем добрый денек! Динамически создаю на форме несколько pagecontrol, на каждом свой Stringgrid. Теперь потребовалось, чтобы длинные строки...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы Stringgrid2 На рис всё показано. За работающий...

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

Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid
Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid Количество столбцов и строк задается пользователем


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru