Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBGridEh 
V
    Опции темы
vikaz
Дата 17.1.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Всем привет! решил я значит разукрасить DBGridEh, но столкнулся со сл. проблемой!
1. Сначала при создании события DBGridEh1GetCellParams, при компиляции появляется ошибка
[BCC32 Error] Main_Unit.h(98): E2015 Ambiguity between 'TGridDrawState' and 'Gridseh::TGridDrawState'
  Full parser context
    Main_Unit.cpp(6): #include Main_Unit.h
    Main_Unit.h(44): class TMain_Form

Я это дело правлю, но при каждой компиляции выводится сообщение:
user posted image
Можно ли от него избавиться?

2. В событии DBGridEh1GetCellParams пишу такой код:
Код

 if (Column->Field->DataSet->FieldByName("OrganicNumber")->AsInteger == 1)
  Background = clGray;
 
Компилирую все это дело и как только должно открыться главное окно, слышен звук как при ошибке, но сообщений не выводится и программа подвисает! Сначала думал, это из-за того, что сначала я руками добавляю нужные мне поля в DBGridEh, и потом делаю коннект к базе, но добавив поле при проектировании и написав запрос для вывода строк, заново откомпилировал, Ничего не изменилось: звук и зависание программы.

поправил код, оставил только Background = clGray; Так все прокатило, все строчки у меня закрасились нужным цветом.  Отсюда сделал вывод, что ошибка возникает, как только пытаюсь работать с полями... :( Но надо чтобы все заработало! 
Прошу помощи!

Это сообщение отредактировал(а) vikaz - 17.1.2010, 10:33


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 17.1.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



вторая проблема была успешна решена! Дело оказалось в том что нельзя делать вот так:
Код

switch (flag)
 {
  case 0:{
          DBGridEh1->Columns->Clear();
          DBGridEh1->Columns->Add();
          DBGridEh1->Columns->Items[0]->FieldName        = "FIO";
          DBGridEh1->Columns->Items[0]->Title->Caption   = "Ф.И.О.";
          DBGridEh1->Columns->Items[0]->Title->Alignment = taCenter;
          DBGridEh1->Columns->Items[0]->Width            = 250;

          DBGridEh1->Columns->Add();
          DBGridEh1->Columns->Items[1]->FieldName        = "OrganicNumber";
          DBGridEh1->Columns->Items[1]->Title->Caption   = "Таб. №";
          DBGridEh1->Columns->Items[1]->Title->Alignment = taCenter;
          DBGridEh1->Columns->Items[1]->Width            = 65;
                  ...
                  
          DBGridEh1->Columns->Add();
       // DBGridEh1->Columns->Items[4]->FieldName        = "Restriction"; Ошибка!!!!

          DBGridEh1->Columns->Items[4]->Title->Caption   = "Мед. осмотр";
          DBGridEh1->Columns->Items[4]->Title->Alignment = taCenter;
          DBGridEh1->Columns->Items[4]->Width            = 95;


т.е. если создается поле, оно должно быть ОБЯЗАТЕЛЬНО связанно с полем в таблице. Иначе......

Осталось по первому вопросу решить, а то уже достало это сообщение!!! smile

Это сообщение отредактировал(а) vikaz - 17.1.2010, 11:14


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
_Dimon_
Дата 17.1.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

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



Цитата(vikaz @  17.1.2010,  10:31 Найти цитируемый пост)
Я это дело правлю, но при каждой компиляции выводится сообщение:


Как правите?

Если эта функция будет написана  в *.h файле
Код

void __fastcall DBGridEh1GetCellParams(TObject *Sender, TColumnEh *Column, TFont *AFont,
          TColor &Background, Gridseh::TGridDrawState State);


и в *.cpp файле
Код

void __fastcall TForm1::DBGridEh1GetCellParams(TObject *Sender, TColumnEh *Column,
          TFont *AFont, TColor &Background, Gridseh::TGridDrawState State)

то будет все нормально.

А почему вы не везде пользуетесь DBGridEh?
Я бы заменил все DBGrid на DBGridEh и тогда и проблемы этой не будет...
 
PM MAIL   Вверх
vikaz
Дата 17.1.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Цитата(_Dimon_ @  17.1.2010,  13:49 Найти цитируемый пост)
Как правите?

конструктор создает в h и  cpp файле сл. код:
h
Код

void __fastcall DBGridEh1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumnEh *Column, TGridDrawState State);


CPP
Код

void __fastcall TForm1::DBGridEh1GetCellParams(TObject *Sender, TColumnEh *Column,
          TFont *AFont, TColor &Background, TGridDrawState State)


Я правлю его на:
h
Код

void __fastcall DBGridEh1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumnEh *Column, Gridseh::TGridDrawState State);


CPP
Код

void __fastcall TForm1::DBGridEh1GetCellParams(TObject *Sender, TColumnEh *Column,
          TFont *AFont, TColor &Background, Gridseh::TGridDrawState State)


Я везде использую DBGridEh! Интересно, а с чего Вы решили, что я использую и просто и Eh?  smile 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
_Dimon_
Дата 17.1.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

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



Цитата(vikaz @  17.1.2010,  12:05 Найти цитируемый пост)
Я везде использую DBGridEh! Интересно, а с чего Вы решили, что я использую и просто и Eh?


Я просто предположил (возможно стринггрид есть),  но в *.h есть строчка #include <Grids.hpp>

PM MAIL   Вверх
vikaz
Дата 17.1.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



В Grid выводятся различные значения, часть значений имеет специфичное значение (0 или 1, или еще какие-то, не суть важно), как визуально подменить значение, т.е. как сделать так, чтобы вместо 1 выводилось ОК, вместо 0 - Ошибка?

Добавлено через 1 минуту и 52 секунды
зы: в *.h есть:
#include "DBGridEh.hpp"
#include "GridsEh.hpp"



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 17.1.2010, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Нашел на одном сайте вот такое хитрое решение:

Чтоб работало и компилятор не ругался нужно изменить имя TGridDrawState на любое другое (напр. TGridDrawStateee)
в файлах (можно открыть в блокноте и выбрать заменить все)
Include\Vcl\grids.hpp
Include\Vcl\dbgrids.hpp
Source\vcl\grids.pas
Source\vcl\dbgrids.pas

и все стало работать как часы 8-)

Это для старой компоненты! Я же просто нашел все hpp и pas файлы, где есть TGridDrawState  и сделал вышеописанную замену - ВРОДЕ ВСЕ РАБОТАЕТ! smile


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
  Дата 17.1.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Как обработать TField->OnGetText в DBGridEh? (Решён!!!)

Один из способов подменить текст в DBGrid на нужный - использовать событие OnGetText.
У Всех источников для работы с БД (Query, Table ...) есть свойство Filelds, который позволяет задавать определенные поля. У каждого такого поля, есть событие OnGetText, который позволяет изменять текст именно в этом поле.
для изменения значения пишет сл. код:
Код

void __fastcall TMain_Form::UniQuery1StatusGetText(TField *Sender, UnicodeString &Text,
          bool DisplayText)
{
  if (Sender->AsInteger == 1)
 Text = "Ok";
else Text = "Error";
}

После этого кода в поле Status все числовые значения будут заменены на текстовые.

Для того, чтобы подменять значения в динамически изменяемых полях, нужно:
1. в *.h файле создать обработчик, а в *.cpp файле его описать (пример):
*.h файл
Код

void __fastcall UniQuery_GetText(TField *Sender, UnicodeString &Text, bool DisplayText);

*.cpp файл 
Код

void __fastcall TMain_Form::UniQuery_GetText(TField *Sender, UnicodeString &Text, bool DisplayText)
{
  if (Sender->AsInteger == 1)
 Text = "Ok";
else Text = "Error";
}


2. Связать определенное поле с функцией UniQuery_GetText
    Тут надо быть аккуратнее, нужно связать поле с UniQuery_GetText только после того, как поле будет создано и данные появятся в DbGrid. Иначе можно словить AV.

пример:
Код

 DBGridEh1->Columns->Add();
 DBGridEh1->Columns->Items[0]->FieldName             = "Status";
 DBGridEh1->Columns->Items[0]->Title->Caption       = "Статус";
 DBGridEh1->Columns->Items[0]->Title->Alignment   = taCenter;
 DBGridEh1->Columns->Items[0]->Width                   = 50;
 DBGridEh1->Columns->Items[0]->Field->OnGetText = UniQuery_GetText; (ОШИБКА!!! Получим AV, так как данные еще не выведены, а только формируем поля)


Код

void __fastcall TMain_Form::Update_DBGrid ()
{
 UniQuery->SQL->Text = "select * from Data";
 UniQuery->Open();
  DBGridEh1->Columns->Items[1]->Field->OnGetText = UniQuery_GetText; (Правильно!!! Данные уже присутствуют в DBGridEh)



Это сообщение отредактировал(а) vikaz - 18.1.2010, 16:08


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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