Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300

Как разделить слитные строки в записях DBGrid?

11.02.2020, 22:24. Показов 5319. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Hi ,
Пожалуйста подскажите , как можно разделить строки в записях DBGridEh?
Записи в таблицу вносятся из компоненты Memo1.
Проблема в том, что несколько строк отображаются слитно в записях.
Или как отображать в DBGridEh только первую строку?

Схема:


{Memo1}
____________________
|А мне так мало
|нужно для счастья
|— одно шоколадное
|мороженое.
-----------------------

{Запись в поле DBGridEh}
________________________________________ __________________
|А мне так малонужно для счастья— одно шоколадноемороженое.
-------------------------------------------------------------------

Как сделать вот так:
А мне так мало нужно для счастья — одно шоколадное мороженое.
или во так:
А мне так мало


Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2020, 22:24
Ответы с готовыми решениями:

Разделить каждый элемент строки разделить на сумму элементов этой строки
Задан двухмерный массив вещественных чисел А(n,m). Необходимо каждый элемент соответствующей строки разделить на сумму элементов этой...

Слияние Слитные числа
при слиянии Excel в Word числа пишутся слитно 5000000, нужно чтоб было 5,000,000 как это сделать в Word, заранее спасибо!

Разделить 1 столбец на 2 в DBGrid
Доброго времени суток! В БД существует таблица с уровнями и объемом жидкости такого вида : NUMTANK|UNIT| START 1|0|1180 - уровень в...

47
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.02.2020, 10:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от LSvetlana Посмотреть сообщение
Сделала так, но в ячейке не отобразилось xxxxx.
забудь про то, что я сказал насчёт события у Table1

Цитата Сообщение от LSvetlana Посмотреть сообщение
Hi , ага, на нужном Field, справа от OnGetText установлено событие;
вот, на нужном Field и нужно устанавливать обработчик.
вот в нём и напиши
Delphi
1
2
3
4
procedure TForm1.ttDBase1Field1GetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
 Text := 'yyyyyy';
end;
и проверь.
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 10:23  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
забудь про то, что я сказал насчёт события у Table1
Уже забыла
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
вот, на нужном Field и нужно устанавливать обработчик.
вот в нём и напиши
Написала, но не работает, если написать
ShowMessage('Работает событие? наверное да, раз я это вижу');
То сообщение появляется
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.02.2020, 11:24
Цитата Сообщение от LSvetlana Посмотреть сообщение
Сделала так, но в ячейке не отобразилось xxxxx.
ну, тогда не знаю
попробуй кинуть обычный DBGrid, связать его с DataSource1 и посмотри, что там будет.

ещё можно всё таки через Calculated попробовать.


а ещё мне не понятно, что означает
Цитата Сообщение от LSvetlana Посмотреть сообщение
попробуй код (С) sql.ru
Не помогло
что значит - "не помогло"?!
ты не нашла событие DrawColumnCell у грида?
Это событие не вызывается? В событии ты не можешь вывести свой текст?!
ты в событие формы onCreate не забыла сделать DBGridEh.DefaultDrawing := False ?
Delphi
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGridEh.DefaultDrawing := False;
end;
попробуй повесить такой обработчик на DrawColumnCell:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TMainForm.DBGridEhDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
var
  LRect: TRect;
  LFieldValue: String;
begin
    LRect := Rect;
    LFieldValue := 'zzzzzz';
    DBGridEh.Canvas.FillRect(Rect);
    DBGridEh.Canvas.TextRect(LRect, LFieldValue, [tfVerticalCenter, tfSingleLine, tfEndEllipsis]);
end;
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 12:40  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
попробуй кинуть обычный DBGrid, связать его с DataSource1 и посмотри, что там будет.
Изначально у меня был компонент DBGrid, но он не показывал записи с Memo, потом я нашла у себя DBGridEh, прочитала про него, посмотрела свойства, и вот использую его сейчас
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
ещё можно всё таки через Calculated попробовать.
ага, можно его попробовать, только у меня будут по использованию вопросы.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
что значит - "не помогло"?!
ты не нашла событие DrawColumnCell у грида?
Это событие не вызывается? В событии ты не можешь вывести свой текст?!
ты в событие формы onCreate не забыла сделать DBGridEh.DefaultDrawing := False ?
Я нашла событие, оно вызывается, и в событие формы onCreate сделала DBGridEh.DefaultDrawing := False, но возникает ошибка после открытия таблицы:
Could not convert variant of type (Null) into type (OleStr)
Не может конвертировать тип Null, в тип OleStr, не поняла что это значит.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
попробуй повесить такой обработчик на DrawColumnCell:
Попробовала, во всей ячейках таблицы отображается zzzzzz .
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.02.2020, 13:35
Цитата Сообщение от LSvetlana Посмотреть сообщение
Попробовала, во всей ячейках таблицы отображается zzzzzz .
yehhooo!

отлично.
значит, теперь тебе нужно
1) посмотреть, как у тебя поле называется
2) в обработчик вставить такой код (заменив ТУТИМЯПОЛЯ на имя твоего поля):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMainForm.DBGridEhDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
var
  LRect: TRect;
  LFieldValue: String;
begin
  if Column.FieldName = 'ТУТИМЯПОЛЯ' then
  begin
    LRect := Rect;
    LFieldValue := 'This is Sparta!!!';
    DBGridEh.Canvas.FillRect(Rect);
    DBGridEh.Canvas.TextRect(LRect, LFieldValue, [tfVerticalCenter, tfSingleLine, tfEndEllipsis]);
  end
  else
    DBGridEh.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
если вместо своего поля увидишь в гриде 'This is Sparta!!!'
тогда замени строчку
LFieldValue := 'This is Sparta!!!';
на
Delphi
1
    LFieldValue := Column.Field.Value;
ну и расскажешь, что получилось.
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 14:04  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
отлично.
значит, теперь тебе нужно
1) посмотреть, как у тебя поле называется
2) в обработчик вставить такой код (заменив ТУТИМЯПОЛЯ на имя твоего поля):
Во всех ячейках нужной колонки отобразилось This is Sparta!!!
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
если вместо своего поля увидишь в гриде 'This is Sparta!!!'
тогда замени строчку
LFieldValue := 'This is Sparta!!!';
на
А после замены строки, появляется ошибка
Could not convert variant of type (Null) into type (OleStr)

P.S после нажатия ОК, в окне ошибки, окно опять появляется. Иногда окно само не появляется, но при движении указателя, окно с ошибкой опять появляется. А запись в поле остаётся слитной.
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.02.2020, 15:18
Цитата Сообщение от LSvetlana Посмотреть сообщение
А после замены строки, появляется ошибка
Could not convert variant of type (Null) into type (OleStr)
блин. в этом столбце у тебя есть ПУСТЫЕ записи?!!

попробуй так:
Delphi
1
2
3
4
5
6
7
8
if (Column.FieldName = 'ТУТИМЯПОЛЯ') and  (Not Column.Field.IsNull)  then
  begin
    LRect := Rect;
    LFieldValue := Column.Field.Value;
    DBGridEh.Canvas.FillRect(Rect);
    DBGridEh.Canvas.TextRect(LRect, LFieldValue, [tfVerticalCenter, tfSingleLine, tfEndEllipsis]);
  end
....
или так:
Delphi
1
2
3
4
5
6
7
8
if (Column.FieldName = 'ТУТИМЯПОЛЯ') and  (Column.Field.Value <> NULL) then
  begin
    LRect := Rect;
    LFieldValue := Column.Field.Value;
    DBGridEh.Canvas.FillRect(Rect);
    DBGridEh.Canvas.TextRect(LRect, LFieldValue, [tfVerticalCenter, tfSingleLine, tfEndEllipsis]);
  end
....
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 15:47  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
блин. в этом столбце у тебя есть ПУСТЫЕ записи?!!
В записях есть текст
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
попробуй так:
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
или так:
Попробовала, ошибки нет, но всё слитно

Добавлено через 12 минут
Цитата Сообщение от LSvetlana Посмотреть сообщение
Попробовала, ошибки нет, но всё слитно
Получается условие не выполняется, но поле ведь не пустое

Или выполняется
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.02.2020, 16:26
Цитата Сообщение от LSvetlana Посмотреть сообщение
Попробовала, ошибки нет, но всё слитно
это код не должен разделять слитые слова, он должен обрезать текст по ширине столбца
(если текст длиннее, чем ширина столбца, то в конце текста должно выводиться ...)

а можно увидеть скриншот вашего грида?

и ещё, если ваш DBF файл не секретный, то запакуйте его в архив и приложите к сообщению на форуме.

Добавлено через 1 минуту
Цитата Сообщение от LSvetlana Посмотреть сообщение
Получается условие не выполняется, но поле ведь не пустое
так это проверить легко.
Delphi
1
2
3
4
5
6
7
8
if (Column.FieldName = 'ТУТИМЯПОЛЯ') and  (Not Column.Field.IsNull)  then
  begin
    LRect := Rect;
    LFieldValue := 'Выполняется';
    DBGridEh.Canvas.FillRect(Rect);
    DBGridEh.Canvas.TextRect(LRect, LFieldValue, [tfVerticalCenter, tfSingleLine, tfEndEllipsis]);
  end
....
запускаем и смотрим, что в гриде в нужном столбце.
если там "Выполняется", значит, код выполняется, иначе - условие не верно.
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 20:31  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
это код не должен разделять слитые слова, он должен обрезать текст по ширине столбца
(если текст длиннее, чем ширина столбца, то в конце текста должно выводиться ...)
Hi, работает получается, я просто думала что он разделяет, но работает только в последних вариантах которые вы написали. Sorry.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
а можно увидеть скриншот вашего грида?
Да конечно, screen в приложении.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
и ещё, если ваш DBF файл не секретный, то запакуйте его в архив и приложите к сообщению на форуме.
DBF файл, в приложении
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
так это проверить легко.
Да проверила, сначала я запуталась
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
это код не должен разделять слитые слова, он должен обрезать текст по ширине столбца
Это не совсем то что я хотела, дело в том, что иногда строки бывают короткие, слова тоже... и в таком случае ширина столбца оказывается больше чем длина некоторых строк, и слитность строк очень часто встречается
Я сейчас сделала вычисляемое поле, т.е. в свойстве FieldKind выбрала fkCalculated, как понять, что писать в событии OnCalcField ? как можно заменить разделение на пробелы, как отобразить только первую строку, или как изменить высоту строки записи в зависимости от длины текста?
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
13.02.2020, 20:45  [ТС]
Забыла прикрепить файлы
Миниатюры
Как разделить слитные строки в записях DBGrid?  
Вложения
Тип файла: rar database_sl.rar (344 байт, 2 просмотров)
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
14.02.2020, 11:23
У вас еще один файл должен быть database_sl.dbt - он как раз и содержит значения мемо-полей
1
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
14.02.2020, 11:30
Цитата Сообщение от Пытливый Посмотреть сообщение
У вас еще один файл должен быть database_sl.dbt - он как раз и содержит значения мемо-полей
в точку. Причём как раз там значения поля "description" (как и поля "class") и содержится!
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
14.02.2020, 12:18  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
У вас еще один файл должен быть database_sl.dbt - он как раз и содержит значения мемо-полей
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
в точку. Причём как раз там значения поля "description" (как и поля "class") и содержится!
Hi , так в тот файл разве не заносятся значения которые идут после 255 символов?
Я просто читала об этом, поэтому думала что сейчас важен только один файл, так как эта база для тестов, и там нет сейчас записей превышающих 255 символов второй файл в приложении

Я создала Memo и выбрала fkCalculated, но при открытии таблицы он выдаёт ошибку
...cannot be a calculated or lookup field
а в событии OnCalcField хотела написать:
Delphi
1
Table1.FieldByName('description').value := StringReplace([B]Text[/B], #13, #32, [rfReplaceAll]);
У меня не получается ничего
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
14.02.2020, 13:41
Цитата Сообщение от LSvetlana Посмотреть сообщение
Hi , так в тот файл разве не заносятся значения которые идут после 255 символов?
нет. туда заносятся ВСЕ значения полей, с типом поля MEMO, вне зависимости от длины.

Цитата Сообщение от LSvetlana Посмотреть сообщение
второй файл в приложении
отсутствует

Цитата Сообщение от LSvetlana Посмотреть сообщение
Я создала Memo и выбрала fkCalculated, но при открытии таблицы он выдаёт ошибку
вычисляемому полю нужно дать своё имя, отличное от description
ну и код чуть другой должен быть.
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
14.02.2020, 19:55  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
нет. туда заносятся ВСЕ значения полей, с типом поля MEMO, вне зависимости от длины.
Теперь поняла, спасибо.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
отсутствует
Забыла прикрепить файлик
Сейчас точно прикрепила
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
вычисляемому полю нужно дать своё имя, отличное от description
ну и код чуть другой должен быть.
Сделала так, всё равно ошибка Screen экрана в приложении
Миниатюры
Как разделить слитные строки в записях DBGrid?  
Вложения
Тип файла: rar database_sl.rar (1.1 Кб, 3 просмотров)
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
14.02.2020, 23:51
Лучший ответ Сообщение было отмечено LSvetlana как решение

Решение

В принципе я изначально почти все правильно предложил. Вот так попробуйте:
Delphi
1
2
3
4
procedure TForm1.ADOTable1descriptiondatabase_slGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
 Text := StringReplace(Sender.Value, #13#10, #32, [rfReplaceAll]);
end;
на выходе получается одна строка без переводов.
1
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
15.02.2020, 08:17  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
В принципе я изначально почти все правильно предложил. Вот так попробуйте:
Цитата Сообщение от Пытливый Посмотреть сообщение
на выходе получается одна строка без переводов.
Доброе утро, не получилось не ругайтесь

Я прикрепила проект к сообщению, это не основной проект, его я создала специально для тестирования.
В проекте 4 Кнопки, 1 Memo и прочие компоненты для работы с базой.
1 кнопка создаёт базу, и после откроет её;
2 кнопка открывает базу;
3 кнопка открывает запись в Memo, если она есть;
4 кнопка сохраняет запись из Memo;

Посмотрите пожалуйста
Вложения
Тип файла: rar Small base.rar (55.6 Кб, 4 просмотров)
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
15.02.2020, 13:36
У меня не установлен DBGridEh, но если вместо него использовать стандартный DBGrid, то все выводится как и ожидалось.
Миниатюры
Как разделить слитные строки в записях DBGrid?   Как разделить слитные строки в записях DBGrid?  
0
6 / 6 / 0
Регистрация: 05.10.2019
Сообщений: 300
15.02.2020, 14:51  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
У меня не установлен DBGridEh, но если вместо него использовать стандартный DBGrid, то все выводится как и ожидалось.
Hi , а в DBGrid у Вас создано поле типа Memo? потому что я выбрала DBGridEh, из за того что в DBGrid не показывалась запись в memo поле, вместо записи там был текст MEMO
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2020, 14:51

Как разделить запрос на две строки?
Вот запрос он сильно большой как его можно разбить на две строки? Подскажите пожалуйста. procedure TForm9.N11Click(Sender: TObject); ...

Как разделить результат на три строки?
Здравствуйте, уважаемые господа программисты. Возникла проблема. Сам в программировании - дуб. Есть кусок кода, берущий данные из...

Из dbGrid вывести выбранные строки в другой DbGrid
Мне надо вывести Из dbGrid вывести выбранные строки в другой DbGrid, например есть 100 записей в одном DbGrid нужно вывести 1-ю и 4-ю в...

Как разделить строки на слова, и после их использовать
Здравствуйте, как разделить строки на слова а после их использовать ?? Я посмотрел в инете стрток попробывал но так и не понял как он...

Как qwebelement.toPlaintText.utf8 разделить на строки?
Как qt qwebelement.toPlaintText.utf8 разбить на строки? QWebElementCollection collection = frame-&gt;findAllElements(&quot;li&quot;); ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru