Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 3)

Автор: SANiMirrorOfLight
Дата сообщения: 15.10.2009 14:13
TORSER7

Подскажите, как вы обращаетесь к столбцу через "Tag" ?
Автор: volser
Дата сообщения: 15.10.2009 14:26
SANiMirrorOfLight
Это плохой тон использовать "Tag". Лучше не использовать.
Автор: TORSER7
Дата сообщения: 15.10.2009 14:45
SANiMirrorOfLight

Например,так:

Предварительно (программно при создании или в Дизайнере) присваиваем
Tag колонок уникальные числовые значения. Например, порядковые номера колонок.
Далее в программе для колонки со значением Tag=к можно выполнить такой
фрагмент (для С++):


for (int i=0;i<ComponentCount;i++)
{
if ( Components[i]->ClassNameIs("TcxGridDBColumn") && Components[i]->Tag==k )
{
((TcxGridDBColumn *)Components[i])->Visible=false;
break;
}
}

Кстати,в Tag можно хранить не только числовое значение,но и ссылку.
Системой это свойство не анализируется,поэтому используем как хотим.


Добавлено:
volser

А что-же тут плохого ? Как иначе идентифицировать нужную колонку ?
Автор: AK 666
Дата сообщения: 15.10.2009 14:53
Уважаемые Гуру:
перефразирую свой [more=вопрос]Третий день бьюсь:
D9 DevEx46 /Interbase/:

В базе:
Counters(ID int, sName:varchar(50), bCalculated numeric(1,0))
Indication(ID int,CounterID int, iValue int, dWhen : DATE)
Rate(ID int, CounterID int, dWhen DATE, fRate:float)

Вычисляемые:
Counters:
SUM float = функция создающая в рантайме TIBQuery c select из вьюшки которая использует Indication и Rate

Indication:
Rate = функция создающая в рантайме TIBQuery c select из вьюшки которая использует Rate
Prev = функция создающая в рантайме TIBQuery c select из вьюшки которая использует сам Rate
cValue = (iValue - Prev) *Rate

работа непосредственно с БД и таблицами выполена, все работает как надо.

Теперь: Использую cxGrid:

_object dbgMain: TcxGrid
__object lvCounters: TcxGridLevel
___GridView = tvCounters
___object lvIndication: TcxGridLevel
____GridView = tvIndication
___object lvRate: TcxGridLevel
____GridView = tvRate
__end
_end

как заставить показать (пересчитать) fkCalculated в Counters когда пользователь изменил данные в Rate ?

что пробовалось:
- <таблица>.Resync где <таблица> - Counetrs и Indication = вылет по Запись не найдена и аксесс виолэйшн
- tvCounters.DataController.RefreshExternalData; - вылет
- tvCounters.ViewData.RefreshRecords; - ничего не меняется
- Counters.Refresh - вылет.

Если НЕ использовать cxGrid (т.е. все таблицы разложить по всей форме приложения) - проблем нет.

я подозреваю, что когда пытаюсь передёрнуть вышестоящий грид, текущий теряет фокус.

Ктонить знает куда копать или чем себя стукнуть?[/more] :

Как заставить TcxGrid / TcxDBTableView показать обновлённые данные CalculatedField`сов
после того как пользователь изменил данніе в сублевелном TcxDBTableView ?

Спасибо
Автор: JohnSilver182
Дата сообщения: 15.10.2009 14:59
ПРо HTML .
В базе храняться страницы в HTML формате . Просто Текст . Хочу видеть это на экране . Но не могу понять где в Девках нужный компонент .
Автор: TORSER7
Дата сообщения: 15.10.2009 15:15
JohnSilver182

А TcxDBBlobEdit не пробовал ?
Автор: SANiMirrorOfLight
Дата сообщения: 15.10.2009 15:17
volser
Использование "Columns[i]" не возможно по причине того, что нужно обращатся к конкретным колонкам, а при изменении их порядка в гриде - номер меняется.
Автор: f3ka
Дата сообщения: 15.10.2009 15:24
SANiMirrorOfLight
ну проверяйте еще DataBinding.DataField
Автор: AK 666
Дата сообщения: 15.10.2009 15:49
SANiMirrorOfLight

Цитата:
Использование "Columns[ i ]" не возможно по причине того, что нужно обращатся к конкретным колонкам, а при изменении их порядка в гриде - номер меняется.


i - конкретной колонки можно получить по имени поля.
Автор: duce2
Дата сообщения: 15.10.2009 16:25
SANiMirrorOfLight
например так (это кусок из OnCustomDrawCell)

if (AViewInfo.GridRecord.Values[tvVIEW_1STATUS.Index] = 10)
then Acanvas.Canvas.Font.Color := clGreen;

зеленый цвет, если значение поля в колонке СТАТУС = 10
Автор: f3ka
Дата сообщения: 15.10.2009 16:39
duce2
вообще то надо понимать про что спрашивают... человек хочет в цикле пройтись по ВСЕМ колонкам и посмотреть или поменять свойства колонок... ты же предлагаешь вариант доступа к значению конкретной колонки к тому же жестко привязаное к имени этой колонки... думать надо перед тем как писать!
Автор: vladman
Дата сообщения: 15.10.2009 17:00
SANiMirrorOfLight

Цитата:
спользование "Columns[i]" не возможно по причине того, что нужно обращатся к конкретным колонкам, а при изменении их порядка в гриде - номер меняется.

Каждая колонка это отдельный объект, у которого есть имя. Вот по этому имени и можете их (колонки) идентифицировать. Например cxGrid1TableView1Column1
Как вариант можно использовать функцию TcxCustomGridTableView.FindItemByName(const AName: string)
Еще можно использовать функцию TcxGridDBTableView.GetColumnByFieldName(const AFieldName: string)

Цитата:
Это плохой тон использовать "Tag". Лучше не использовать.

Ну почему плохой тон. У TcxCustomGridTableView есть даже функция FindItemByTag(ATag: Longint). DevExpress как раз советует ee использовать при создании Items и доступа к ним в рантайме.

Добавлено:
JohnSilver182

Цитата:
В базе храняться страницы в HTML формате . Просто Текст . Хочу видеть это на экране . Но не могу понять где в Девках нужный компонент .

К сожалению пока в DevExpress нет компонента, который бы смог отображать HTML. Но некий Robert Baker советует использовать tRichView для преобразования HTML <--> RTF, а затем использовать Richedit от DevExpress для отображения контента. Подробнее -
HTML in VerticalGrid Memo column
Автор: vladman
Дата сообщения: 15.10.2009 23:23
AK 666

Цитата:
Как заставить TcxGrid / TcxDBTableView показать обновлённые данные CalculatedField`сов
после того как пользователь изменил данніе в сублевелном TcxDBTableView ?

Выполнить refresh для датасета данные которого отображаются в TcxDBTableView. В вашем случае, если при рефреше происходит аксес ваилэйшн, то, скорее всего, у вашего TcxDBTableView обрабатываются какие-то события, в которых, по всей вероятности, и возникает ошибка.
Автор: JohnSilver182
Дата сообщения: 16.10.2009 09:44

Цитата:
К сожалению пока в DevExpress нет компонента, который бы смог отображать HTML. Но некий Robert Baker советует использовать tRichView для преобразования HTML <--> RTF, а затем использовать Richedit от DevExpress для отображения контента. Подробнее -
HTML in VerticalGrid Memo column


Да я понял что время нормальных HTML компонентов далеко .
Заюзал TWebBrowser .

Автор: AK 666
Дата сообщения: 16.10.2009 11:13
vladman


Цитата:
Выполнить refresh для датасета данные которого отображаются в TcxDBTableView. В вашем случае, если при рефреше происходит аксес ваилэйшн, то, скорее всего, у вашего TcxDBTableView обрабатываются какие-то события, в которых, по всей вероятности, и возникает ошибка.


ни у TIBDataSet ов ни у TcxGrid ни у TcxDBTableView ов обработчиков событий (пока ещё) нету. как я уже писал, если разбросать по форме TcxGridы в каждом свой TcxDBTableView - проблема исчезает.

Возникает только когда все собраны в единый TcxGrid и только когда Refresh делается на мастер TcxDBTableView при фокусе на child TcxDBTableView. Возможно надо сделать Refresh методом DevEx? Тогда каким?
Автор: afiget
Дата сообщения: 16.10.2009 11:14
JohnSilver182
Посмотри ThtmlViewer.
Автор: vladman
Дата сообщения: 16.10.2009 12:24
AK 666

Цитата:
Возникает только когда все собраны в единый TcxGrid и только когда Refresh делается на мастер TcxDBTableView при фокусе на child TcxDBTableView.

Давайте простой пример с базой. посмотрим.
Автор: duce2
Дата сообщения: 16.10.2009 12:47
f3ka
для начала я отвечал на вот это:
"Использование "Columns[i]" не возможно по причине того, что нужно обращатся к конкретным колонкам, а при изменении их порядка в гриде - номер меняется."


"ты же предлагаешь вариант доступа к значению конкретной колонки к тому же жестко привязаное к имени этой колонки... думать надо перед тем как писать!"

да, я не увидел, с чего начинался вопрос, и дал ответ как обращаться К КОНКРЕТНОЙ КОЛОНКЕ, так и есть.

спасибо за призыв думать, но прибереги его для своих знакомых, корректность и вежливость никто не отменял.
Автор: TORSER7
Дата сообщения: 16.10.2009 13:21
Разыскивается редактор TcxIntEdit (его на палитре почему-то нет).

Другими словами, требуется ввести целое (именно целое) число с ограничением
разрядности MaxLength. И чтобы вставку из буфера обмена запретить.
Казалось,простая задача.А не получается.
Автор: SANiMirrorOfLight
Дата сообщения: 16.10.2009 13:28
duce2
Мне нужно, чтоб я галочками мог отмечать какие столбцы в гриде показывать, и хочется написать код болле "красиво", при нажатии кнопки, дожны перебираться все столбцы и в соотведствии с чекбоксом отображаться или нет. Можно просто для каждого столбца писать строчку кода, но таблица не одна и солбцов не мало, хочется это дело както автоматизировать.


PS. не могу найти dxCustomDocControl, где его искать подскажите?
Автор: volser
Дата сообщения: 16.10.2009 13:33
TORSER7
Такого компонента нет в стандартной поставке. Напишите свой компонент под свои нужды.
Автор: f3ka
Дата сообщения: 16.10.2009 13:33
SANiMirrorOfLight
ну вообще то в DEVEXPRESS реализован необходимый функционал для настройки видимости колонок в cxGrid! советую почитать хелп про TcxGridPopupMenu...
Автор: SANiMirrorOfLight
Дата сообщения: 16.10.2009 13:34
vladman
Получается мне для цикла использование Tag самый удобный вариант.
А для этих методов надо тогда ещё и список имён колонок ранить(мне кажется, что не очень подходит):
TcxCustomGridTableView.FindItemByName(const AName: string)
TcxGridDBTableView.GetColumnByFieldName(const AFieldName: string)

Огромное спасибо всем кто помогает


Добавлено:
f3ka
Спасибо, посмотрю, но PopupMenu не очень подходит, хотелось вынести все настройки на отдельную панельку
Автор: volser
Дата сообщения: 16.10.2009 13:39
SANiMirrorOfLight
Еще есть такая фича cxGrid1DBTableView1.OptionsCustomize.ColumnsQuickCustomization.
Автор: f3ka
Дата сообщения: 16.10.2009 13:39
SANiMirrorOfLight
я не сказал что это как то тяжело настраивается через попап меню... через попап вызывается ОТДЕЛЬНАЯ ПАНЕЛЬКА при помощи которой можно настроить видимость и порядок колонок...
Автор: TORSER7
Дата сообщения: 16.10.2009 14:01
SANiMirrorOfLight

Включите у TcxGridDBTableView свойство OptionCustomize.ColumnsQuickCustomization

Слева появится дополнительная колонка в которой можно будет делать выбор.
Автор: SANiMirrorOfLight
Дата сообщения: 16.10.2009 14:06
f3ka
Чтото я не совсем понял как его использовать. Я в компоненте TcxGridPopupMenu установил свойство UseBuiltInPopupMenus в True, добавил в PoppupMenus элемент, установил gvhtColumnHeaders в True, указал GridViews и PopupMenu (PopupMenu пустой компонент без каких-либо элементов). Что нужно сделать ещё, что отобразилось встроенное меню?

volser
ColumnsQuickCustomization получается то что надо, без лишней мороки, спасибо)))))
Автор: TORSER7
Дата сообщения: 16.10.2009 14:09
volser


Цитата:
Такого компонента нет в стандартной поставке. Напишите свой компонент под свои нужды.


Да знаю,что нет. Хотелось бы получить другой ответ.
Автор: SANiMirrorOfLight
Дата сообщения: 16.10.2009 14:09
TORSER7
Спасибо уже посмотрел, то что надо.

f3ka
С PopupMenu всёравно хочется разобраться
Автор: f3ka
Дата сообщения: 16.10.2009 14:16
SANiMirrorOfLight
вот как раз в данном случае не надо было добавлять элемент в PopupMenus... встроенное меню вызывается при клике как раз на заголовках или футерах... UseBuiltInPopupMenus = True э то правильно... вот через меню и вызывается ColumnsQuickCustomization, к тому же там еще много чего есть

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.