Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2013, 20:17   #1
Monik11
Новичок
Джуниор
 
Регистрация: 10.04.2010
Сообщений: 1
Лампочка Как отобразить (получить) текст ячейки DBGrid, который в нее не вмещается (Ответ)

Я программирую на любительском уровне, в основном для облегчения своей работы, поэтому на большинство возникающих вопросов я без труда находил ответы в сети. Однако в определенный момент такого ответа я не нашел (может быть плохо искал?), а именно: как вывести пользователю текст, который не поместился в ячейке DBGrid?
Большинство ответов сводилось к констатации того, что DBGrid не хранит информацию, поэтому ее невозможно получить, не модернизируя компонент. В то же время, другие наследники родительского компонента DBGrid позволяют получить такую информацию. Вспомнив, что для задания формата отображения информации для DBGrid я уже воспользовался некоторой хитростью, решил попробовать эту же хитрость и в этом вопросе. Методом проб и ошибок у меня получилось достичь желаемого результата, чем и делюсь со всеми.
Приведенный ниже кусок кода проверен на Delhpi 2010 (ОС WinXP и Win7) и работает без ошибок.
Итак, кусок кода для вывода непоместившегося текста в подсказку DBGrid:
Код:
-
DBGrid_.Hint:='';
DBGrid_.ShowHint:=true;
-

type
 TForm_main = class(TForm)
...
var
 myrect:trect; //значения координат прямоугольника (ячейки DBGrid), в
      //пределах которого находился курсор (глобальная переменная) 
...

procedure TForm_main.DBGrid_MouseMove(Sender: TObject;  Shift: TShiftState; X, Y: Integer);  //отслеживание перемещения курсора мыши
var
cc,rr:integer;//текущие значения столбца и строки положения курсора
 ccc,rrr: integer;//значения столбца и строки предыдущего положения курсора 
begin
  //определяем текущие столбец и строку, где находится курсор
  //для этого используем метод похожего компонента (та самая хитрость)
  TCustomDrawGrid(DBGrid_).MouseToCell(x,y,cc,rr);
  
  //отсекаем ошибки, которые появятся, если курсор находится вне сетки грида
  //(cc=-1 или rr=-1), справа от последнего поля (cc>DBGrid_.Columns.Count-1)
  //или в сроке заголовка полей (rr=0) - текст заголовка почему-то не определяется:(
  if (cc=-1) or (rr=-1) or (rr=0) or (cc>DBGrid_.Columns.Count-1) then
    begin
      Application.CancelHint; //отключаем подсказку
      DBGrid_.Hint:=''; //обнуляем подсказку
      exit; //выходим из процедуры
    end;

  //если курсор находится в допустимых пределах, 
  //проверяем находится ли курсор в той же ячейке, что и ранее,
  //или сместился в другую ячейку.
  //Вычисляем столбец и строку по сохраненным координатам (myrect)  
  TCustomDrawGrid(DBGrid_uchet_propusk).MouseToCell(myrect.Left,myrect.Top,ccc,rrr);
  
  if (cc<>ccc) or (rr<>rrr) then //если курсор сместился
    begin
      //выключаем подсказку (возможную предыдущую)
      Application.CancelHint;
      //запоминаем новые номера строки и столбца через координаты прямоугольника ячейки,
      //для этого используем метод похожего компонента (та самая хитрость еще раз)
      myrect:=TCustomDrawGrid(DBGrid_).CellRect(cc,rr);    
      //перерисовываем DBGrid для того, чтобы вызвать процедуру
      //DrawColumnCell (или можно вызвать эту процедуру другим способом,
      //но у меня не получилось)
      DBGrid_.Repaint;
    end;
end;


procedure TForm_main.DBGrid_DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState); //определение текста при перерисовке DBGrid 
begin
//заполнение подсказки, если текст не влезает в ячейку
  //проверяем совпадают ли границы ячеек текущей (над которой курсор)
  //и той, которая перерисовывается в настоящий момент гридом
  if (rect.Left = myrect.Left) and
     (rect.Top = myrect.Top) and
     (rect.Right = myrect.Right) and
     (rect.Bottom = myrect.Bottom)  then
    begin //если совпадают
      //проверяем влезает ли текст, который выводится на экран в ширину ячейки
      if Column.Width<DBGrid_.Canvas.TextWidth(Column.Field.DisplayText) then
        DBGrid_.Hint:=Column.Field.DisplayText //если не влезает, то текстом подсказки
                                     //является текст ячейки, который выводится
                                     //на экран (с учетом форматирования).
                                     //текст без форматирования - Column.Field.Text
      else
        DBGrid_.Hint:=''; //если влезает, то подсказка обнуляется
    end
//заполнение подсказки, если ячейка не влезает в отображаемое поле
  //если в гриде не совпадает только правая граница ячейки (это получается 
  //когда ячейка отображается частично - часть ячейки скрыта правой 
  //границей DBGrid), то вне зависимости от длины текста отображаем его
  //в подсказке
  else if (rect.Left = myrect.Left) and
    (rect.Top = myrect.Top) and
    (rect.Bottom = myrect.Bottom)  and
    (rect.Right<>myrect.Right) then //в данном случае проверку по правой границе можно не проводить
       DBGrid_.Hint:=Column.Field.DisplayText;
end;
Все.
Буду рад, если этот способ будет работоспособен не только у меня и будет полезен кому-то еще.

Александр.
26.09.2013

Последний раз редактировалось Monik11; 26.09.2013 в 20:31.
Monik11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать выделенный текст из ячейки DBGrid через PopupMenu astecenko БД в Delphi 2 27.06.2012 10:19
Как правильно изменить содержимое ячейки по клику в нее? Stilet JavaScript, Ajax 3 12.08.2009 17:03
получить текст из заданной ячейки DbGrid furstenberg Компоненты Delphi 12 02.04.2009 00:54
Как отобразить .xls в DBGrid? feel Помощь студентам 3 12.10.2008 19:21
Как разделить число и текст в одной ячейки на две ячейки. neboskreb Microsoft Office Excel 2 15.04.2008 19:39