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

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

Автор: vladman
Дата сообщения: 27.07.2009 13:36
zzz78

Цитата:
Нужно чтобы сворачивание/разворачивание групп делалось не до записей а до последнего сгруппированного уровня.

<YourcxGridDBTableView>.ViewData.Records[0].Expand(True); для одной записи
<YourcxGridDBTableView>.ViewData.Expand(True); для всего View
подробнее - ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_Custom_ExpandCollapseRows.htm
Автор: Funky Max
Дата сообщения: 28.07.2009 07:32
cxDBTreeList необходимо вписать свое значение в футер колноки.

В событии OnCustomDrawFooterCell пишу примерно следующее

if (AViewInfo->Column->Column == MyTreeCOLUMN1) {
AViewInfo->Text="мой текст";
}

Компилятор ругается мол свойство Text не имеет доступа на запись.

Как запихать в ячейку футера cxDBTreeList свое значение? или альтернативный вопрос, как сделать что бы в футере суммировались значения колонок только level==0.
Заранее спасибо
Автор: zzz78
Дата сообщения: 28.07.2009 08:47
Похоже у меня некая похожая задача. Только с гридом.
Нужно просуммировать в вышестоящие уровни уже цифры показанные на группе level=0.
Т.к. на уровне level=0 обрабатываю и меняю выводимые цифры.
Например:

Организация
----Договор

Дебет Кредит
ЗАО "Рога и копыта" 10 20
Договор №1 10 0
Договор №2 0 20
накладная №456 -80 -80
накладная №455 120 120
накладная №457 -20 -20

На уровне "Договор" сумма в зависимости от знака показыватся либо в поле Дебет либо Кредит. И теперь нужно на уровне "Организация" взять суммы с уровня находящегося ниже.
Автор: vladman
Дата сообщения: 28.07.2009 11:36
Funky Max

Цитата:
cxDBTreeList необходимо вписать свое значение в футер колноки....
как сделать что бы в футере суммировались значения колонок только level==0

Обработать событие onSummary

Код: procedure <YourForm>.<YourcxTreeListSummary>(ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
var OutArguments: TcxSummaryEventOutArguments);
var
i: integer;
vAOutValue: integer;
begin
vAOutValue := 0;
if <YourcxTreeList>.Nodes.Root.Count = 0 then exit;
for i:=0 to <YourcxTreeList>.Nodes.Root.Count - 1 do
vAOutValue:= vAOutValue + <YourcxTreeList>.Nodes.Root.Items[i].Values[0];
OutArguments.SummaryValue := vAOutValue;
OutArguments.Done := true;
end;
Автор: LamoKamatoznoye
Дата сообщения: 28.07.2009 13:12
vladman

а если столбцов с футером куча и маленькая тележка как тогда быть? я не совсем врубаюсь в принцип работы этого события.
Автор: vladman
Дата сообщения: 28.07.2009 15:50
LamoKamatoznoye

Цитата:
а если столбцов с футером куча и маленькая тележка как тогда быть

ASender: TcxDataSummaryItems укажет для какого TcxDataSummaryItems сработало событие
Автор: brookson
Дата сообщения: 28.07.2009 18:09
Помогите!

cxGrid, ввожу новую запись посредством навигатора, т.е. кнопка Append. Нажимаю Post. Стою на только что введённой записи. Как только с неё ухожу - всё, она для скроллинга недоступна.
Помогает переоткрыть таблицу. Соседние 2 грида нормально. Чувство, будто забыл что-то очевидное
Автор: volser
Дата сообщения: 28.07.2009 19:50
brookson
Какая версия и настройки грида?
Автор: vladman
Дата сообщения: 28.07.2009 20:55
brookson

Цитата:
Как только с неё ухожу - всё, она для скроллинга недоступна.

Симптомы очень похожие на то, что DataController не может выделить добавленную запись как уникальную, т.е проверьте настройки DataControllera касательно первичного ключа, и также то, каким образом обеспечивается уникальность новой записи в вашей таблице.
Автор: brookson
Дата сообщения: 28.07.2009 21:11
Первичный ключ есть, в гриде он прописан в KeyFieldNames. версия 40. Настройки грида боюсь ни при чём, т.к. уже пробовал даже скопировать его с работающего, и просто поля подставил другие.
Автор: vladman
Дата сообщения: 28.07.2009 21:15
brookson

Цитата:
Первичный ключ есть, в гриде он прописан в KeyFieldNames

Ну тогда нужен пример..
Автор: afiget
Дата сообщения: 28.07.2009 23:32
brookson, и поле, указанное в KeyFieldNames действительно является ключевым?
И в датасет тоже указано правильное ключевое поле?
Тогда, +1 vladman: пример в студию.

Автор: volser
Дата сообщения: 29.07.2009 00:04
brookson
При вставке записи в датасет ключевое поле заполняется?
Автор: Dart_Veider
Дата сообщения: 29.07.2009 04:33
народ, неужели никто не может помочь??? уже писал
"не могу поставить devexpress 45 на делфи 2009. пробовал ставить на двух машинах, на одной виста, на другой хр. не встают ни там, ни там. стоят апдейты на делфи 1 и 2. проблема в чем: установка вроде проходит, но не компилится. и при запуске делфи выдает ошибки что не найдены файлы bpl. искал их поиском в корневом диске - нет таких файлов. что делать не знаю. подскажите в чем траблы?"
, да так никто ничего путнего не ответил. давайте уже помогать ближнему своему )))
Автор: Funky Max
Дата сообщения: 29.07.2009 06:12
vladman

Цитата:
ASender: TcxDataSummaryItems укажет для какого TcxDataSummaryItems сработало событие


А из ASender можно как нибудь вытянуть index данного SummaryItem
чтобы указать его в
vAOutValue:= vAOutValue + <YourcxTreeList>.Nodes.Root.Items[i].Values[SUMMARY_ITEM_INDEX] ???
Автор: brookson
Дата сообщения: 29.07.2009 09:53
Я приведу пример, но как?
Есть таблица (IBTable), в ней ключевое поле (генератор, триггер). Оно заполняется, т.е. после Post смотрю в базу - есть. И это поле указано ключевым в гриде. Ошибиться нельзя, оно выбирается из списка полей таблицы.
Настройки вьюхи в основном по умолчанию, только некоторые OptionsBehavior изменены.
Скажите, какие значение, я приведу.
Автор: jonikDk
Дата сообщения: 29.07.2009 09:56
Dart_Veider

Цитата:
но не компилится.

значит попробуй ручками откомпилить
Автор: Dart_Veider
Дата сообщения: 29.07.2009 10:04

Цитата:
Dart_Veider

Цитата:
но не компилится.

значит попробуй ручками откомпилить


пробовал, выдает ошибки, типа такой

Package c:\Documents and Settings\All Users\Документы\Rad Studio\6.0\Bpl\dxGDIPlusD12.bpl can't be installed because it is not a design time package.
Автор: f3ka
Дата сообщения: 29.07.2009 10:16
Dart_Veider
ну дык по русски же написано что это not design time package (значит runtime package) и значит что его инсталлить НЕ НАДО... ему надо сказать только compile... для того чтоб все заработало надо сначала все runtime packages скомпилить а потом все design time package скомпилить и заинсталлить...
Автор: Dart_Veider
Дата сообщения: 29.07.2009 11:38
f3ka

Цитата:
ну дык по русски же написано что это not design time package (значит runtime package) и значит что его инсталлить НЕ НАДО... ему надо сказать только compile... для того чтоб все заработало надо сначала все runtime packages скомпилить а потом все design time package скомпилить и заинсталлить...


а не проясните чем runtime packages отличаются от design time package, и как их отличить? и еще вопрос: в какой последовательности все это ставить?
Автор: vladman
Дата сообщения: 29.07.2009 12:03
Funky Max

Цитата:
А из ASender можно как нибудь вытянуть index данного SummaryItem

Можно конечно: ASender.Items[<YourSummaryIndex>]
Автор: f3ka
Дата сообщения: 29.07.2009 12:05
Dart_Veider
грубо говоря, runtime packages содержат сам функционал, а design time packages то как это будет отображаться этот функционал. отличаются чаще всего приписками типа dcl, vcl для design packages. а вот в какой последовательности (именно пакеты по зависимостям) это ставить это я не знаю...
Автор: Funky Max
Дата сообщения: 29.07.2009 12:06

Цитата:
Можно конечно: ASender.Items[<YourSummaryIndex>]


не не, мне как раз и надо узнать индекс с которым сейчас работает событие onSummary, что бы дальше его передать в нужное место)
Автор: vladman
Дата сообщения: 29.07.2009 12:07
Dart_Veider

Цитата:
в какой последовательности все это ставить?

А в каком виде у вас
Цитата:
devexpress 45
. Архив с исходными файлами и пакетами или инсталлятор?

Добавлено:
Funky Max

Цитата:
мне как раз и надо узнать индекс с которым сейчас работает событие onSummary,

Ясно. Если я правильно понимаю, у вас 4-ая версия TreeList. Какую конкретно задачу вы хотите решить?

Добавлено:
brookson

Цитата:
Я приведу пример, но как?

Сделать маленькое приложение состоящее из одной формы и грида отображающего проблему. Конечно, и БД нужна с этой таблицей (или часть БД), чтобы быть уверенным что проблема не в БД.
Автор: Funky Max
Дата сообщения: 29.07.2009 12:16
vladman

ТриЛист 2 уровня, дочерний и родительский. По дефолту ТриЛист суммирует в футер все что находится в конкретной колонке, т.е. и детей и родителей. Мне же надо суммировать только значения записей 0го родительского уровня, что бы 1й дочерний уровень в сумме не учитывался... вот так. При этом полей очень много и пользователь их может менять местами по своему усмотрению.
П1 П2 П3 ....
Родитель 1 25 ... ...
Родитель 2 17
Потомок 1 10
Потомок 2 7
Родитель3 15

СУММА 57

Автор: vladman
Дата сообщения: 29.07.2009 13:00
Funky Max

Цитата:
ТриЛист 2 уровня, дочерний и родительский

У меня установлен TreeList v.5. В нем совсем другой обработчик onSummary. Так что проверить не могу. Но когда-то решал эту проблему следующим образом:


Код: procedure <YourForm>.<YourcxDBTreeList>Summary(ASender: TcxDataSummaryItems;
Arguments: TcxSummaryEventArguments;
var OutArguments: TcxSummaryEventOutArguments);
begin
if ASender.DataController.Values[Arguments.RecordIndex,
<YourcxDBTreeList>.ColumnByName('<YourPARENT_IDColumnName>').ItemIndex] <> 0 then
OutArguments.Done:=True;
end;
Автор: Funky Max
Дата сообщения: 29.07.2009 13:19
чет не прокатывает(((( может как то через aSender вылезти на Node и узнать если HasParent == true то не считать...
Автор: brookson
Дата сообщения: 29.07.2009 13:43
Вот пример - small.rar
База bb.fdb там же. Всё лишнее убрал, не работает всё равно.
Автор: vladman
Дата сообщения: 29.07.2009 13:58
Funky Max

Цитата:
чет не прокатывает

Может Parent_ID для корневых значений у вас равно не 0, а -1, например, проверьте.

Цитата:
мне б просот индекс колонки вытащить к которой текущий summary просчитывается

В обработчике onSummary есть Arguments: TcxSummaryEventArguments.
Опять же проверить не могу, попробуйте так:
if TcxTreeListColumn(Arguments.SummaryItem.ItemLink) = <YourColumn>

Добавлено:
brookson

Цитата:
Вот пример

вот, то что и следовало доказать:

procedure TF_mca.ADMNewRecord(DataSet: TDataSet);
begin
adm.FieldByName('admin_id').AsInteger:=0;
end;

Грид же до рефреша ничего не знает о сработавшем генераторе на стороне сервера и подменившем ваш 0 на верное (следующее) значение.
Автор: brookson
Дата сообщения: 29.07.2009 14:52
vladman
Получается, что событие Post (нажатие кнопки) надо вылавливать, и делать вручную рефреш?

Я говорил о еще двух гридах, в которых нормально вставляется. Посмотрел: в одном и правда после post делается Close/Open. В другом такого нет - но работает.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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