Подмена данных DBGrid?
, ADO
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.175] |
|
|
ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
| Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Подмена данных DBGrid?
, ADO
|
Сообщ.
#1
,
|
|
|
|
Никто не сталкивался с реализацией такой задачей: в dbgrid, связанной с базой с базой по ADO, необходимо заменять данные в некотором столбце, т.е. отображать не непосредственно считанные с базы данные, а, например, считанные и затем преобразованные некой процедурой?
Заранее спасибо. |
|
Сообщ.
#2
,
|
|
|
|
Если используется к-л компонент TADOTable или TADOQuery, TADOStoredProc, то в них можно создавать вычисляемые поля , которые отображаются в DBGrid.
|
|
Сообщ.
#3
,
|
|
|
|
Часть 4. Что можно поместить в DBGrid
Наталия Елманова Компьютер Пресс - CD, 1999, N 5 © Copyright N.Elmanova & ComputerPress Magazine. Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid: void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State) { if (Column->FieldName=="VenueNo") { DBGrid1->Canvas->Brush->Color=clWhite; DBGrid1->Canvas->FillRect(Rect); if (Table1->FieldByName("VenueNo")->Value==1) { DBGrid1->Canvas->Font->Color=clRed; DBGrid1->Canvas->TextOut(Rect.Right-2- DBGrid1->Canvas->TextWidth("our venue"), Rect.Top+2,"our venue"); } else { DBGrid1->Canvas->TextOut(Rect.Right-2- DBGrid1->Canvas->TextWidth("other venue"), Rect.Top+2,"other venue"); } } } Соответствующий код для Delphi имеет вид: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (Column.FieldName='VenueNo') then begin with DBGrid1.Canvas do begin Brush.Color:=clWhite; FillRect(Rect); if (Table1.FieldByName('VenueNo').Value=1) then begin Font.Color:=clRed; TextOut(Rect.Right-2- DBGrid1.Canvas.TextWidth('our venue'), Rect.Top+2,'our venue'); end else begin TextOut(Rect.Right-2- DBGrid1.Canvas.TextWidth('other venue'), Rect.Top+2,'other venue'); end; end; end; end; Еще один пример - использование значков из шрифтов Windings или Webdings в качестве подставляемой строки. void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State) { if (Column->FieldName=="VenueNo") { DBGrid1->Canvas->Brush->Color=clWhite; DBGrid1->Canvas->FillRect(Rect); DBGrid1->Canvas->Font->Name="Wingdings"; DBGrid1->Canvas->Font->Size=-14; if (Table1->FieldByName("VenueNo")->Value==1) { DBGrid1->Canvas->Font->Color=clRed; DBGrid1->Canvas->TextOut(Rect.Right-2- DBGrid1->Canvas->TextWidth("J"), Rect.Top+1,"J"); } else { DBGrid1->Canvas->Font->Color=clBlack; DBGrid1->Canvas->TextOut(Rect.Right-2- DBGrid1->Canvas->TextWidth("F"), Rect.Top+1,"F") ; } } } Соответствующий код для Delphi имеет вид: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (Column.FieldName='VenueNo') then begin with DBGrid1.Canvas do begin Brush.Color:=clWhite; FillRect(Rect); Font.Name:='Wingdings'; Font.Size:=-14; if (Table1.FieldByName('VenueNo').Value=1) then begin Font.Color:=clRed; TextOut(Rect.Right-2- DBGrid1.Canvas.TextWidth('J'), Rect.Top+1,'J'); end else begin Font.Color:=clBlack; TextOut(Rect.Right-2- DBGrid1.Canvas.TextWidth('F'), Rect.Top+1,'F'); end; end; end; end; |
|
Сообщ.
#4
,
|
|||
|
|
А еще, у всех TField существует свойство DisplayText которое используется всеми визуальными компонентами чувствительными к данным (DataAware), в том числе и TDBGrid'ом. Т.е. TDBGrid выводит именно это свойство. В свою очередь, значение этого свойства по умолчанию равно значению из поля БД, с учетом свойства DisplayFormat (у кого оно есть). Но это по умолчанию. Реально-же, у всех TField есть событие OnGetText. Если оно определено для поля, то DisplayText этого поля будет возвращать то, что вернет OnGetText. Словами слишком запутанно Если поля созданы в дизайнере, то требуемому полю (например FFF) вешаем обработчик FFFOnGetText событию OnGetText. Если-же поля создаются динамически, то соответственно вешаем обработчик динамически. Пример обработчика:
С таким обработчиком, в поле FFF DBGrid'а, все символы будут заглавными, вне зависимости какие они в БД. Естественно в БД они не меняются. При этом возникает интересный эффект. Если вы начнете редактировать поле FFF, то оно приобретет вид такой как в БД Естественно это работает и для TDBEdit и пр. Этот способ удобно применять когда нужно выполнить только текстовое преобразование для отображения значения поля. |
|
Сообщ.
#5
,
|
|
|
|
Thanks!
|
|
Сообщ.
#6
,
|
|
|
|
>Bas
если сталкивался подскажи как избавиться от каждоразового щелканься по труе-фалсе? а делать через картинки >Петрович можно подробней про Цитата у всех TField есть событие OnGetText. Если оно определено для поля, то DisplayText этого поля будет возвращать то, что вернет OnGetText. Словами слишком запутанно , проще на примере: Если поля созданы в дизайнере, то требуемому полю (например FFF) вешаем обработчик FFFOnGetText событию OnGetText. у меня есть DBGrid, DataSources, где искать OnGetText? Если шелкнуть на DBGrid, то вижу перечень полей моей таблицы, но там нет Event-ов. |
|
Сообщ.
#7
,
|
|
|
|
Цитата tomsksmile, 13.02.04, 09:06 у меня есть DBGrid, DataSources, где искать OnGetText? Если шелкнуть на DBGrid, то вижу перечень полей моей таблицы, но там нет Event-ов. Смотри глубже . Твой DBGrid связан с DataSource, а DataSources связан с каким-либо DataSet'ом (в твоем случае либо ADODataSet, либо ADOTable, либо ADOQuery). Вот "щелкать" надо именно по нему (DataSet'у) - там будет список полей, по умолчанию пустой. Добавь туда все нужные тебе в гриде поля (правый клик -> Add fields). Теперь, встаешь на нужное тебе поле, и наступит счастье - в инспекторе увидишь его OnGetText. А еще, можно в хелпе поискать OnGetText . |
|
Сообщ.
#8
,
|
|
|
|
На твой вопрос посмотри здесь Что можно поместить в DBGrid
Если не поможет то - Можно использовать словарь атрибутов полей (Dictionary) Добавлено в : Петрович : У меня поле int можно ли через OnGetText(|| чтото) дать возможность вводить и показывать число 15835.25 а в базу записать 1583525 Не используя (Mask)Edit. |
|
Сообщ.
#9
,
|
|
|
|
Цитата Bas, 14.02.04, 12:08 У меня поле int можно ли через OnGetText(|| чтото) дать возможность вводить и показывать число 15835.25 а в базу записать 1583525 Легко. Для показывать используй OnGetText а для вводить используй OnSetText |
|
Сообщ.
#10
,
|
|
|
|
>Basпосмотрел ссылку... спасибо. Рисовать в гриде я научился, но вот ка избавиться от старого списка? Раньше в поле был просто список false/true, теперь поверх списка рисую по канве, но смене статуса все равно нужно работать со списком. Как изловчиться, чтобы просто шелкать по груди без выбора списка?
|
|
Сообщ.
#11
,
|
|
|
|
ButtonStyle=cbsNone
|
|
Сообщ.
#12
,
|
|
|
|
действительно список пропал
, но теперь приходиться вводить руками true/false...а хотелось бы просто щелкать по полю... |
|
Сообщ.
#13
,
|
|
|
|
Подробней, если можно.
ButtonStyle дает возможность выбора (или нет из допустимых значений) из PickList. У меня поле int(bool) при OnClick(On...) pole1=!pole1 и подставка галочки в зависимости от значения поля. |
|
Сообщ.
#14
,
|
|
|
|
у меня есть DbGrid, построенный на основе ADOTable.
В таблице есть поле, которое принимает true/false. Хочу чтобы в гриде на месте этого поля были галочки при true в таблице... Сейчас у меня чтобы поставить галочку нужно в гриде (в соответстующем поле грида) открыть список и выбрать true. Спрашиваю как сделать так, чтобы галочка снималась/выставлялась шелчком мыши. Я не пойму, что за событие OnClick? |
|
Сообщ.
#15
,
|
|
|
|
У DBGrid есть событие OnCellClick по нему меняеш значение нужного тебе поля у текущей записи.
|