Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Длинные тексты в TDBGrid (не Мемо)  (Прочитано 11819 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 30-11-2014 07:38 » 

Надо отображать  достаточно длинные текстовые поля (80-140 символов) но не Memo. Желательно в табличном виде.
В TDBGrid так и не нашел управление переносом строк, есть только регулирование ширины колонок.
1)Возможна ли настройка TDBGrid  на перенос части строкового поля
2)Если нет не лучше ли делать отображение таких полей в связанных компонентах синхронного просмотра?
3)Может есть улучшенный бесплатный аналог TDBGrid  с многострочным отображением
в RxLib или еще где?
« Последнее редактирование: 30-11-2014 07:41 от eugrita » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #1 : 30-11-2014 10:55 » 

По каким то готовым сторонним компонентам не скажу, в Delphi давно не разрабатывал, да и старался использовать стандартные компоненты.
Как вариант, можно вручную отрисовывать текст в ячейке, используя событие OnDrawDataCell.
Или отлавливать курсор и если длина текста превышает ширину ячейки под курсором, то вызывать хинт, расположеный в позиции ячейки, с текстом ячейки.
Записан
Ilia
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-12-2014 18:32 » 

Как человек возившийся с Delphi таблицами несколько лет скажу, что
zubr 100% прав.
вот пример кода
Код:
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s:string;
 Flag: Cardinal;
 H: integer;
 i,isize: integer;


begin

 StringGrid2.Canvas.FillRect(Rect);
 s := StringGrid2.Cells[ACol,ARow];
 if (Acol=1) AND (ARow>0) then Flag := DT_LEFT else Flag := DT_CENTER;

 {
if (aRow=1) then begin
   StringGrid2.canvas.font.size:=8;
end else begin
   StringGrid2.canvas.font.size:=10;
end;
  }

 Inc(Rect.Left,3);
 Dec(Rect.Right,3);
 H := DrawText(StringGrid2.Canvas.Handle,PChar(s),length(s),Rect,Flag);


 if H > StringGrid2.RowHeights[ARow] then  begin
    StringGrid2.RowHeights[ARow] := H;  //увеличиваем
  end;

end;
с DBGrid все аналогично.
Единственный вариант когда пришлось ставит сторонний элемент - при использовании динамических объединяемых ячеек, в остальных стандартного набора StringGrid и DBGrid хватает
« Последнее редактирование: 03-12-2014 18:34 от Ilia » Записан

Кто выпил весь кофе!
eugrita
Помогающий

ru
Offline Offline

« Ответ #3 : 03-12-2014 23:14 » 

В общем плюнул на переносы, решил остановиться на варианте когда длинные поля вынесены отдельно в обычные  TRichEdit (не TDbRichEdit) с общим управлением  от DBNavigator

Причем операции добавления и редактирования сделал с вводом в сторонние поля
и отдельной кнопкой вместо + bInsert и bEdit в DBNavigator
« Последнее редактирование: 03-12-2014 23:17 от eugrita » Записан
Ilia
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-12-2014 06:29 » 

Длинные тексты действительно иногда лучше выводить отдельно для пользователей.
Зависит от интерфейса программы.
Записан

Кто выпил весь кофе!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines