Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 53

Перенос текста в таблице StringGrid

10.11.2021, 19:08. Показов 6817. Ответов 30

Студворк — интернет-сервис помощи студентам
Добрый вечер! Помогите пожалуйста.
У меня есть таблица StringGrid и кнопка ("Медицинское оборудование").
Значит, при нажатии на эту кнопку в таблицу добавляется некоторая информация.
Проблема в том, что эта информация не помещается в ячейку таблицы. Поэтому я бы хотел, чтобы этот текст переносился на следующую строку в этой же ячейке.

код:
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
....
 #include <memory>
 
 
void __fastcall TForm2::Button4Click(TObject *Sender) // добавляет текст из txt.файла в таблицу
{
   std::auto_ptr<TStringList> L (new TStringList);
   L->LoadFromFile("Медичне обладнання.txt");
   for(int i=0; i<L->Count; i++)
      StringGrid1->Rows[i]->CommaText=L->Strings[i];
      StringGrid1->ColCount = 4;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    StringGrid1->Canvas->FillRect(Rect);
    DrawText(StringGrid1->Canvas->Handle,
        StringGrid1->Cells[ACol][ARow].c_str(),
        StringGrid1->Cells[ACol][ARow].Length(),
        &Rect,
          DT_SINGLELINE | DT_VCENTER | DT_CENTER);
 
        
   StringGrid1->RowHeights[1,1] = 100;
    StringGrid1->ColWidths [1,1] = 100;
}
//---------------------------------------------------------------------------
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2021, 19:08
Ответы с готовыми решениями:

Перенос текста в ячейках StringGrid
Нашел дельфиский код c использованием API procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;...

Перенос текста в таблице
&lt;table width=200 border=1&gt; &lt;tr&gt; &lt;td&gt; К о н т е н т &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt;Обычная таблица с указанной...

Delphi7 Перенос текста из Memo в StringGrid
Добрый день. Помогите пожалуйста решить проблему. У меня задание по учебной практике сделать проект где загружаешь текстовый файл...

30
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
10.11.2021, 22:15
Лучший ответ Сообщение было отмечено 123-Даниил как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 123-Даниил Посмотреть сообщение
В моей программе текст сразу появляется при нажатии на кнопку:
там в последнем коде просто начни его со строки №11 int lef = 0, rig = 0, end =0, l=0 , w=0;
Цитата Сообщение от 123-Даниил Посмотреть сообщение
lifeforce. в итоге, почему у меня не сработал перенос?
вот и надо использовать тот код чтоб сработало.

Добавлено через 5 минут
просто добавь его на кнопку
но было бы правильней вывести этот код в отдельную фукцию , так как его можно будет применить и для другой таблицы
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
48
49
50
51
void __fastcall TForm2::Button4Click(TObject *Sender)
{
   std::auto_ptr<TStringList> L (new TStringList);
   L->LoadFromFile("Медичне обладнання.txt");
   for(int i=0; i<L->Count; i++)
      StringGrid1->Rows[i]->CommaText=L->Strings[i];
      StringGrid1->ColCount = 4;
      
int lef = 0, rig = 0, end =0, l=0 , w=0;
 
for (int r = 1; r < StringGrid1->RowCount; r++)
           {
            int s=0;
            ag:
           //if(w>rig && s==1)rig=w;
           //if(w>end && s==2)end=w;
            AnsiString ht = StringGrid1->Cells[s][r];
                l = 0, w=0;
            for (int i = 0; i < StringGrid1->Cells[s][r].Length(); i++)
            {     l++;
               if( l<=60 && l>=48// количество символов которые должны вместится в ячейку
                &&( StringGrid1->Cells[s][r].SubString(i,1)==" " // символы которые можно заменить на перенос строки
                ||  StringGrid1->Cells[s][r].SubString(i,1)==","
                ||  StringGrid1->Cells[s][r].SubString(i,1)=="."
                ||  StringGrid1->Cells[s][r].SubString(i,1)==":"
                ||  StringGrid1->Cells[s][r].SubString(i,1)==";"
 
                  )
                || l>=60
                 )
                 {
                 if(l>w)w=l;
                 ht.Insert("\n",i+1); l=0;
                 ht.Delete(i,1);
                 }
            }
            //StringGrid1->Hint = ht;
 
           StringGrid1->Cells[s][r]=ht;
           if(StringGrid1->Cells[s][r].Length()>lef && s==0)lef=StringGrid1->Cells[s][r].Length();
           if(w>rig && s==1)rig=w;
           if(w>end && s==2)end=w;
               if (s<2)
             {
           s++; goto ag;
             }
           }
    StringGrid1->ColWidths[0] = lef*5;
    StringGrid1->ColWidths[1] = rig*5;
    StringGrid1->ColWidths[2] = end*5+42;     
}
Добавлено через 10 минут
123-Даниил,
для моей таблицы это 3 колонки if (s<2) , но для твоей надо изменить на if (s<StringGrid1->ColCount-1)
0
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 53
10.11.2021, 22:40  [ТС]
lifeforce, в общем предложенный Вами код не работает, потому что у меня мой текст добавлялся из файла. А в примере volvo текст добавлялся вручную.

Я переписал его код и у меня всё сработало.

Скажите, lifeforce, Вы в своей программе, текст тоже вручную добавляли или с помощью LoadFromFile?

Добавлено через 9 минут
Цитата Сообщение от lifeforce Посмотреть сообщение
for(int i=0; i<L->Count; i++)
lifeforce. Не подскажите как понимать, что i<L?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.11.2021, 00:30
Лучший ответ Сообщение было отмечено 123-Даниил как решение

Решение

123-Даниил, i здесь не <L, а <L->Count, - это число строк.
Что касается переноса в ячейке, то флажки формата ячейки предусматривают такое поведение... - вместо флага DT_SINGLELINE нужно поставить DT_WORDBREAK; перенос будет по словам. Ну, а дефолтовую высоту строк можно увеличить, скажем, на три строки (напр. 40 вместо 24). Кроме этого рекомендую нулевую строку сделать фиксированной и в опциях таблицы разрешить ColSizing - false по умолчанию- то есть изменять ширину колонок в динамике.
C++
1
2
3
4
5
    UINT fmt[5] = { DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER };
Миниатюры
Перенос текста в таблице StringGrid  
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.11.2021, 12:31
Цитата Сообщение от 123-Даниил Посмотреть сообщение
в общем предложенный Вами код не работает, потому что у меня мой текст добавлялся из файла.
так и в моем примере тоже из файла. там я и добавил возможность редактирования текста правой кнопкой вызываешь PopupMenu1 там в меню редактирование и копирование текста
Цитата Сообщение от 123-Даниил Посмотреть сообщение
А в примере volvo текст добавлялся вручную.
Я переписал его код и у меня всё сработало.
а код один и тот же. разница что я жестко определил размер колонки и их количество. просто надо внимательней проанализировать данный пример.
а для динамического реагирования на редактирования текста , я и предлогал чтоб код поделить на отдельные функции. в дальнейшем можно всегда его вызвать в любом событии.
123-Даниил,
посмотри на таблицу предложенную от nick42,
и посмотри на мою таблицу.
видишь разницу?
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.11.2021, 12:47
вот что самое интересное что этот код я писал где-то три года назад RAD Studio Berlin
сейчас решил его откомпилировать в Sydney
получилась каша.
в старой версии начало текста с первой строки расположенной сверху
в новой версии строка расположена по центру.
Миниатюры
Перенос текста в таблице StringGrid  
0
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 53
11.11.2021, 16:37  [ТС]
lifeforce, спасибо большое за помощь. У меня получилось перенести текст на новую строку в ячейках. Но правда с помощью такой "незаметной хитрости" как DT_WORDBREAK функции DrawText.

Я разбирался в Вашем коде (на это у меня ушло всё утро), но так как у меня мало времени, то я воспользовался DT_WORDBREAK.

Вот такой код:
C++
1
2
3
4
5
 UINT fmt[5] = { DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER };


Простите, за то, что потратили столько времени на меня. Но Ваш код, я также считаю решением этой темы.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.11.2021, 17:13
Как совет... . Если добавить невидимый Memo (с разрешенным переносом и шрифтом как и в таблице) и чуть усложнить обработчик
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
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    int repr = 1;
    TStringGrid *grid = (TStringGrid*)Sender ;
    UINT fmt[5] = { DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_WORDBREAK | DT_VCENTER | DT_LEFT,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER,
                    DT_SINGLELINE | DT_VCENTER | DT_CENTER };
    if(grid->ColCount<5) fmt[2] = fmt[3];
    grid->Canvas->Brush->Color = (ACol && ARow) ?
      grid->Color : grid->FixedColor;
    grid->Canvas->FillRect(Rect);
    DrawText(grid->Canvas->Handle,
           grid->Cells[ACol][ARow].c_str(),
           grid->Cells[ACol][ARow].Length(),
           &Rect, ARow ? fmt[ACol] : fmt[3] );
    Memo1->Width = grid->ColWidths[repr];
    if(ACol==repr) { Memo1->Text = grid->Cells[ACol][ARow];
       grid->RowHeights[ARow] = 5 - (grid->Font->Height *
         Memo1->Lines->Count);
    }     
}
то высота строк таблицы будет подстраиваться под объем текста в ячейках выбранной колонки (переменная repr).
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.11.2021, 17:26
Цитата Сообщение от nick42 Посмотреть сообщение
Если добавить невидимый Memo (с разрешенным переносом и шрифтом как и в таблице)
а будет ли это зависеть от ширины компонента Memo?
я как то один раз так пробовал и долго не мог понять почему один раз все верно , а в следующий раз обрезалось пол текста.
оказалось что и Memo надо было подстроить по той же длине символов как и колонка в гриде.
0
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 53
11.11.2021, 17:26  [ТС]
nick42, спасибо. Я ещё не закончил создание своей программы. Сейчас работаю на следующей формой. И там возможно Ваша идея мне пригодится. Ещё раз спасибо!
0
11.11.2021, 17:31

Не по теме:

Ну, с оглядкой на то, что Memo переносит иначе, чем грид (не по словам, а разрывает в любом месте), - погрешности неизбежны. На то это и "костыль". Но в каких-то пределах это работает. А поскольку безупречных по качеству программ с каждым годом становится все меньше, то это не повод, чтобы от "костылей" отказываться.

0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.11.2021, 18:00

Не по теме:

Цитата Сообщение от nick42 Посмотреть сообщение
это не повод, чтобы от "костылей" отказываться.


0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2021, 18:00

Автоматический перенос текста в таблице
У меня есть таблица, в ней очень длинная строка, таблице чётко заданы размеры 300px, а этот текст её растягивает до 900-1200px. Как сделать...

Перенос текста информации из StringGrid и Memo в Microsoft Word маркерами
Здравствуйте. При разработке курсового проекта у меня возникла проблема с транспортировкой информации из Delphi в Microsoft Word. У меня...

Как сделать перенос текста внутри одной ячейки StringGrid?
Как сделать перенос текста внутри одной ячейки StringGrid? Чтобы текст был в несколько строк в одной ячейке. Может свойство какое есть? Чет...

Автоматический перенос текста при переходе на новую страницу в таблице Word
Добрый день! Помогите пожалуйста, нужно реализовать с помощью макроса автоматическое копирование текста из 1 и 2 столбца на следующую...

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой матрицы есть цифровые значения. Есть Edit....


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru