Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить поле TWideMemoField в ячейке DBGrid 
V
    Опции темы
Alca
Дата 6.10.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

void __fastcall TfrmMain::dbgrdMainDrawColumnCell(
    TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State) 
{
    TDBGrid *pThisCtrl = dynamic_cast<TDBGrid *>(Sender);
    /*DEBUG*/assert(NULL != pThisCtrl);

    TCHAR            szBuff[8024] = {0}; /* MemoField buffer */
    UnicodeString S;  

    if (_T("TWideMemoField") == Column->Field->ClassName()) {
        TStream *pBS = qryMain->CreateBlobStream(qryMain->FieldByName(_T("F_MAIN_DESCRIPTIONS")), bmRead);
        /*DEBUG*/assert(NULL != pBS);

        ::ZeroMemory(&szBuff, sizeof(szBuff));
        pBS->Read(&szBuff[0], sizeof(szBuff));

        S = StrPas(szBuff);

        /*remove carriage returns &  line feeds*/
        while (Pos(_T('\r'), S) >  0) {
            S[Pos(_T('\r'), S)] = _T(' ');
        }
        while (Pos(_T('\n'), S) >  0) {
            S[Pos(_T('\n'), S)] = ' ';
        }

        /*clear the cell*/
        pThisCtrl->Canvas->FillRect(Rect);

        /*fill cell with memo data*/
        pThisCtrl->Canvas->TextOut(Rect.Left, Rect.Top, S);
        //::DrawText(pThisCtrl->Canvas->Handle, S.t_str(), S.Length(), &Rect, DT_WORDBREAK);
    }

    pThisCtrl->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}


Добавлено @ 10:34
текст в заданной ячейке не отображаеться

Добавлено @ 10:36
http://xmages.net/show.php/528979_DBGrid.PNG.html

Это сообщение отредактировал(а) Alca - 6.10.2009, 10:42


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 6.10.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Alca @  6.10.2009,  10:33 Найти цитируемый пост)
текст в заданной ячейке не отображаеться

Совет:
Если используете dbGrid добавьте в набор данных autocalc поле и заполняйте его, а грид уж  сам выведет.
PM MAIL ICQ   Вверх
Alca
Дата 6.10.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

Если используете dbGrid добавьте в набор данных autocalc поле и заполняйте его, а грид уж  сам выведет.

Не понял?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 6.10.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Alca @  6.10.2009,  13:28 Найти цитируемый пост)
Не понял? 

Вашу задачу я решал по-другому.
К сетке цепляется DataSet, а сам датасет - либо к таблице либо к запросу. В таблице или запросе добавляете поле (правая кнопка, new field) - делаете его autocalc, ваш код вешаете в обработчик события OnCalcField и запихиваете в это поле ваш обработанный текст.

Этот подход дает преимущество в том плане, что можно вывести такой текст в любой контрол и не заморачиваться ручным выводом.
PM MAIL ICQ   Вверх
Alca
Дата 6.10.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

void __fastcall TfrmMain::qryMainCalcFields(TDataSet *DataSet) {
    //чего здесь писать?
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 6.10.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Alca @  6.10.2009,  16:27 Найти цитируемый пост)
//чего здесь писать?


AutocalcFieldName->AsString = ...... Полученная преобразованная строка
PM MAIL ICQ   Вверх
Alca
Дата 7.10.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

void __fastcall TfrmMain::qryMainCalcFields(TDataSet *DataSet) {
    DataSet->Edit();
    DataSet->FieldByName(_T("F_AUTOCALC"))->AsString = _T("xxxxxxxxxx");
    DataSet->Post();
}

Ругань:
Код

Не удается вставить пустую строку. Необходим хотя бы один столбец значений.


Добавлено через 2 минуты и 6 секунд
Цитата

FieldKind == fkCalculated


Добавлено через 3 минуты и 46 секунд
http://pic.ipicture.ru/uploads/091007/tR4MRScf1Y.png


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 7.10.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



А зачем вы в автокалке создаете запись ? smile 

Событие вызыввается для каждой считанной в Dataset записи. Создавать то там зачем?
PM MAIL ICQ   Вверх
Alca
Дата 7.10.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

А зачем вы в автокалке создаете запись ?  

Событие вызыввается для каждой считанной в Dataset записи. Создавать то там зачем?

Нарисуй код, пж

Добавлено через 20 секунд
Я не догоняю, что ты говоришь


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 7.10.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Просто присваивайте полю значение и все. Не надо ничего  больше делать ч набором данных
Код

void __fastcall TfrmMain::qryMainCalcFields(TDataSet *DataSet) {
    DataSet->FieldByName(_T("F_AUTOCALC"))->AsString = _T("xxxxxxxxxx");
}



А значение  уже получайте как там у вас по алгоритму.
PM MAIL ICQ   Вверх
Alca
Дата 8.10.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Anikmar, получилось. Вот:
Код

//DONE: показать TWideMemoField в TDBGrid
void __fastcall TfrmMain::qryMainCalcFields(TDataSet *DataSet) {
    const   ciBuffSize         = 4096;
    TCHAR   szBuff[ciBuffSize] = {0};      /*буфер для TWideMemoField*/
    tString sReaded            = _T("");

    TStream *pBS = DataSet->CreateBlobStream(DataSet->FieldByName(_T("F_MAIN_DESCRIPTIONS")), bmRead);
    /*DEBUG*/assert(NULL != pBS);

    //читаем из блоба в буфер
    int iReaded = pBS->Read(&szBuff[0], sizeof(szBuff) * sizeof(TCHAR));
    /*DEBUG*/assert(0 <= iReaded);

    sReaded = tString(&szBuff[0], iReaded);

    //удаляем '\r' и '\n'
    vReplaceBreaks(&sReaded, _T(' '));

    DataSet->FieldByName(_T("F_AUTOCALC"))->AsString = sReaded;
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.