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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 06:52   #1
Bit_Man
Пользователь
 
Регистрация: 11.03.2012
Сообщений: 29
По умолчанию Многострочный DBGrid

Всем добрый день. Есть бдгрид в котором нужно сделать колонку с многострочным текстом. полазив инете много чего нашел. немного разобравшись кое-что сделал (не судите строго) вод код
Код:
void __fastcall TZakaz_Uslcln::DBGrid2DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{    
    TDBGrid * DBGrid = (TDBGrid*)Sender;
    if(
        Column->Field->FieldName == "Время приема"
        && !Column->Field->Value.IsEmpty())
      {
       WORD Format;
       switch (Column->Alignment)
        {
         case taLeftJustify  : Format = DT_SINGLELINE || DT_LEFT;   break;
         case taRightJustify : Format = DT_SINGLELINE || DT_RIGHT;  break;
         case taCenter       : Format = DT_SINGLELINE || DT_CENTER; break;
        }
       TRect ARect = Rect;
//тут не ообращайте внимания
       ARect.Top   = Rect.Top + 1;
       ARect.Left  = Rect.Left + 1;
       ARect.Right = Rect.Right - 1;
       DBGrid->Canvas->FillRect(Rect);
       
//Вот тут проблема       ((TStringGrid*)DBGrid)->RowHeights[DBGrid->DataSource->DataSet->RecNo] =
       DrawText(DBGrid->Canvas->Handle, Column->Field->AsString.c_str(), -1
           /*Column->Field->AsString.Length()*/, &ARect, Format);
      }
}
И так проблемы:
1. при прокрутке проблемы прорисовки.
2. DBGrid->DataSource->DataSet->RecNo при достижении конца грида выводит ошибку что "Grid index out of range", т.е. вроде это индекса нет. Решение пока не придумал.
3. В гриде 5 или 6 строк которые стали больше тем самым не помещаются в видимой части. как сделать так чтобы при помещении курсора на строку в невидимой части "поднять" ее в видимую часть (скорее всего тут управление скролбаром)
Возможно еще появятся вопросы. Прошу всех откликнутся кто сталкивался с проблемой. Делфистам тоже буду рад. Ответы типа "Возьми др. компонент типа ...." не писать.

Последний раз редактировалось Bit_Man; 12.04.2012 в 06:55.
Bit_Man вне форума Ответить с цитированием
Старый 12.04.2012, 10:05   #2
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Код:
//Вот тут проблема       ((TStringGrid*)DBGrid)->RowHeights[DBGrid->DataSource->DataSet->RecNo] =
       DrawText(DBGrid->Canvas->Handle, Column->Field->AsString.c_str(), -1
           /*Column->Field->AsString.Length()*/, &ARect, Format);
Строки с нуля начинаются, RecNo-1 строка последняя.
http://www.delphimaster.ru/articles/...rid/index.html
Посмотри, может тут что еще подсмотрите.
Drugnir вне форума Ответить с цитированием
Старый 12.04.2012, 11:25   #3
Bit_Man
Пользователь
 
Регистрация: 11.03.2012
Сообщений: 29
По умолчанию

Цитата:
Строки с нуля начинаются, RecNo-1 строка последняя.
это ясно дело, но RecNo - 1 это заголовок, а мне его не зачем править.
Ссылка эта давно у меня открыта, но все равно спасибо.
С StringGrid'ом легче.
Код:
StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
есть ARrow - строка и по ней можно увеличить размер.
Код:
StringGrid1.RowHeights[ARow] := H;  //увеличиваем
Но в DBGrid'е нет этого, вот и поставил
Код:
DBGrid->DataSource->DataSet->RecNo
но при переходе на след. запись которую не отрисовал дбгрид после открытия возникает ошибка.
Bit_Man вне форума Ответить с цитированием
Старый 12.04.2012, 12:54   #4
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Надо же каждой строки, высоту поменять? Почему RecNo-1 - это заголовок?
нам нужен цикл:
Код:
for(int i=1; i<=DBGrid->DataSource->DataSet->ReсordCount; i++)
и в нем менять высоту строки, не должно ругаться вроде бы
http://www.cyberforum.ru/delphi-data...ead442789.html
Drugnir вне форума Ответить с цитированием
Старый 13.04.2012, 11:49   #5
Bit_Man
Пользователь
 
Регистрация: 11.03.2012
Сообщений: 29
По умолчанию

Да высоту каждой строки. DBGrid->DataSource->DataSet->RecNo - 1 на перввой записи (т.е. 1-1=0) ((TStringGrid*)DBGrid)->RowHeights[0] - это высота заголовка, а нам не зачем его трогать.
Ругаться по идее не должно и я так думал, практика взяла свое. Ошибку я уже писал. Пробовал и AfterQueryOpen пересчитывать и увеличивать размер строки, ошибка та же.
Bit_Man вне форума Ответить с цитированием
Старый 13.04.2012, 11:54   #6
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Сделав в цикле, который я написал, это будет i-ая строка , а не DBGrid->DataSource->DataSet->RecNo. Можно еще условие поставить,
Код:
if (i == DBGrid->DataSource->DataSet->RecNo) {
((TStringGrid*)DBGrid)->RowHeights[DBGrid->DataSource->DataSet->RecNo] =
       DrawText(DBGrid->Canvas->Handle, Column->Field->AsString.c_str(), -1
           /*Column->Field->AsString.Length()*/, &ARect, Format);
}

Последний раз редактировалось Drugnir; 13.04.2012 в 11:59.
Drugnir вне форума Ответить с цитированием
Старый 13.04.2012, 12:35   #7
Bit_Man
Пользователь
 
Регистрация: 11.03.2012
Сообщений: 29
По умолчанию

если мы сделаем так
Код:
while (!DBGrid->DataSource->DataSet->Eof)
{
((TStringGrid*)DBGrid)->RowHeights[DBGrid->DataSource->DataSet->RecNo] =
       DrawText(DBGrid->Canvas->Handle, Column->Field->AsString.c_str(), -1
           /*Column->Field->AsString.Length()*/, &ARect, Format)
DBGrid->DataSource->DataSet->Next();
}
получится тот же самый цикл что и ты предложил. разве не так?
Bit_Man вне форума Ответить с цитированием
Старый 13.04.2012, 12:43   #8
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Переписал, вместо DBGrid->DataSource->DataSet->RecNo, вот это DBGrid1->SelectedField->FieldNo. Ошибка не вылетает, но как-то криво работает и только на выбранной строке. Там проблема, как я понял, именно с номером строки.

Последний раз редактировалось Drugnir; 13.04.2012 в 13:22.
Drugnir вне форума Ответить с цитированием
Старый 13.04.2012, 13:25   #9
Bit_Man
Пользователь
 
Регистрация: 11.03.2012
Сообщений: 29
По умолчанию

DBGrid1->SelectedField->FieldNo - это номер поля. Т.е. при прорисовке ты же никуда не перемещаешься на другое поле (field or column). вот у тебя и получается что 1 при открытии DataSet. Да проблема именно изза этого.
Смотри что получается. Если не изменять высоту строк, то при открытии DataSet DBGrid отрисовывает то количество строк которое может уместить (напирмер 5). При увеличении высоты строк при переходе с 5 на 6 запись у меня выходит ошибка.

Последний раз редактировалось Bit_Man; 13.04.2012 в 13:37.
Bit_Man вне форума Ответить с цитированием
Старый 13.04.2012, 13:45   #10
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

DBGrid2DrawColumnCell выполняется постоянно, при выборе ячейки, это я заметил, когда ненароком вставил туда цикл. По-этому и взял SelectedField, но блин, событие какое-то странное, даже когда выделил ячейку и ничего не делаешь, он все равно постоянно перерисовывает и лезет в DrawColumnCell. Думаю не очень подходит это событие.

Последний раз редактировалось Drugnir; 13.04.2012 в 13:53.
Drugnir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многострочный текст adaptive person Общие вопросы Delphi 4 11.03.2012 20:49
Многострочный DBGrid anastasia_d Помощь студентам 15 04.03.2010 17:12
Многострочный запрос Shyt SQL, базы данных 10 26.01.2010 18:34
Многострочный HINT Alex Cones Общие вопросы Delphi 8 27.04.2009 18:08