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

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

Автор: Man_Without_Face
Дата сообщения: 29.10.2010 10:06
marser
Спасибо за помощь, но все равно ничего не получается...

Как альтернатива:
Фильтр привязан к дата сету, пускай так и остается. Одна проблема остается - сортировка должна попасть в отчет. Как узнать по какому полю был отсортирован грид и в каком порядке (убывание, возрастание)? Тогда может сделаю сортировку по датасету или в отчете.
Автор: serbr
Дата сообщения: 29.10.2010 10:11

Цитата:
[/q][q]Думаю, что нет. Только ручной правкой модулей dfm и pas.

Спасибо все получилось
Автор: linker_2009
Дата сообщения: 29.10.2010 10:20
Man_Without_Face
У колонки есть свойство SortIndex, если по нему отсортировано в нем 0
В свойстве SortOrder - soDescending или soAscending. Можно в цикле пробежатся по видимым полям и проверить только свойство SortOrder, если по колонке не сортировали будет soNone.

Добавлено:
это для не сгруппированых вьюхах
Автор: mdid
Дата сообщения: 29.10.2010 10:46
народ up'аю свой пост...мож все таки кто знает

есть cxGrid1BandedTableView и высота колонки занимает высоту трех колонок(так и надо)..но не надо что бы новая запись тоже имела такую высоту...то есть как указать высоту записи?а то она автоматически ровняется высоте шапки
Автор: Man_Without_Face
Дата сообщения: 29.10.2010 11:12
X11
Попробовал взять кусок процедуры из вашего класса (в датасете поля создал вручную):
procedure TcxGridToMemTable.LoadSelectedRecords;
[more]
fMemData.Close;
fmemData.Open;
with cxGridOXDBTableView1, cxGridOXDBTableView1.DataController do
begin
beginupdate;
try
for I := 0 to GetSelectedCount - 1 do
begin
ARowIndex := GetSelectedRowIndex(I);
ARowInfo := GetRowInfo(ARowIndex);
if ARowInfo.Level < Groups.GroupingItemCount then
Continue
else
begin

fMemData.Append;
for f := 0 to ColumnCount - 1 do
if fMemData.FindField(columns[f].DataBinding.Field.FieldName) <> nil then
begin
FieldVal := Values[ARowInfo.RecordIndex, columns[f].Index];
fMemData.FieldByName(columns[f].DataBinding.Field.FieldName).Value := FieldVal;
end;//for f := 0 to ColumnCount - 1 do
fMemData.post;


end;
end;//for I := 0 to GetSelectedCount - 1 do
finally
endupdate;
end;
end;//with
[/more]
В итоге в отчет попадает только одна строка (со всеми полями), причем та на которой стояло выделение в гриде. В чем может быть причина?
Автор: marser
Дата сообщения: 29.10.2010 11:18
mdid
Если не отвечают, значит вопрос задан непонятно.
Например, так в шапке:
----------------------
|Колонка1| |
|---------|Колонка3|
|Колонка2| |
----------------------
Так новая запись:
----------------------
| | |
|---------| |
| | |
----------------------
А что хотим?
Автор: mdid
Дата сообщения: 29.10.2010 11:24
нене..шапка состоит из одной колонки только много строчной
----------------
| надпись |
| просто |
| длинная |
-----------------
и новая запись тож выглядит как шапка
----------------
| |
| |
| |
-----------------
а надо
----------------
| |
-----------------

игрался вроде с CellAutoHeight и DataRowHeight..но эффекта 0
Автор: linker_2009
Дата сообщения: 29.10.2010 11:26
Man_Without_Face
Причина в том что вы проходитесь только по выделеным строкам о чем говорят строки
"for I := 0 to GetSelectedCount - 1 do" и "GetSelectedRowIndex(I);"
Автор: X11
Дата сообщения: 29.10.2010 11:30

Цитата:
procedure TcxGridToMemTable.LoadSelectedRecords;


Цитата:
В итоге в отчет попадает только одна строка (со всеми полями), причем та на которой стояло выделение в гриде. В чем может быть причина?

Прочитай название процедурки
Слово Selected о чем-нибудь говорит?

Добавлено:
Хоть бы на код посмотрел. Там же цикл идёт только по выделенным записям.

Добавлено:
Там же есть еще procedure LoadAllRecords();

Добавлено:
LoadAllRecords учитывает только видимые записи, т.е. пользователь может отфильтровать грид, правильно? А значт в отчёт должны попасть только те записи, которые видит пользователь.

Ну и в догонку. Перед вызовом можно определить сколько записей выделено. Если одна или ни одной, то вызываем LoadAllRecords, если больше одной, то значит пользователь специально выделил те записи, которые хочет экспортировать или отправить в отчёт и значит нужно вызвать LoadSelectedRecords.
Я лично сделал 2 кнопки: экспортировать всё и экспортировать выделенные записи. Это на тот случай, если нужно экспортировать или распечатать только одну запись.

Добавлено:
Man_Without_Face, посмотри ещё вот это сообщение
Там приведен пример, как работать с TfrxUserDataSet.
Но тот код я не анализировал.
Автор: Man_Without_Face
Дата сообщения: 29.10.2010 11:59
X11
Спасибо большое, все получилось то что хотел


Цитата:
Прочитай название процедурки
Слово Selected о чем-нибудь говорит?

Я так понял, что одна все записи экспортирует (независимо стоит или нет фильтр), а другая с фильтром.

Ну да, туговато у меня с гридом (и не только).

Автор: marser
Дата сообщения: 29.10.2010 12:04
mdid
А если попробовать в дизайнере заголовок сделать однострочным, HeaderAutoHight := True, а в коде программы написать:
Column1.Caption := 'надпись' + #13#10 + 'просто' + #13#10 + 'длинная';
Автор: Man_Without_Face
Дата сообщения: 29.10.2010 12:58
Простой вопрос, но не могу найти:
в cxGrid два уровня (главный и дочерний). Как сделать что бы раскрывшийся плюсик оставался, а не закрывался при переходе на след. запись. И там и там включен гридмоде, если отключаю не работает ничего (или неправильно).
Автор: mdid
Дата сообщения: 29.10.2010 13:15
marser
неа...не выходит(заголовки не расширяются)...блина пипец... какая ширина заголовка такая и высота строки
Автор: marser
Дата сообщения: 29.10.2010 13:46
mdid

Цитата:
неа...не выходит

Я создал пустой проект. Бросил на форму TcxGridBandedTableView. Поставил
cxGrid1BandedTableView1.OptionsView.HeaderAutoHight := True, cxGrid1BandedTableView1.OptionsView.Navigator := True. Создал колонку cxGrid1BandedTableView1Column1. В обработчике события формы OnCreate написал: cxGrid1BandedTableView1Column1.Caption := 'надпись' + #13#10 + 'просто' + #13#10 + 'длинная'. Запустил программу. Заголовок высотой в 3 строки. Нажал на навигаторе "+". Появилась новая запись высотой в 1 строку.
Автор: mdid
Дата сообщения: 29.10.2010 13:56
хм...мож я с настройками перемудрил...потому как заголовок у меня все равно в одну строку и видно только среднее слово..дет подлая галка все портит...в общем пасиба...суть понял
ПС
получилось..пасиб...влияло значение Headerheight отличное от нуля
Автор: vladman
Дата сообщения: 31.10.2010 09:19
Man_Without_Face

Цитата:
Как сделать что бы раскрывшийся плюсик оставался, а не закрывался при переходе на след. запись

У вас в выборке для дочернего View должны быть записи для всех записей из главного View.
Автор: vladman
Дата сообщения: 31.10.2010 13:06
X11

Цитата:
Нужно получить в cxGrid FocusedRecord, т.е. выбранную запись.
Это правильный код или есть более "умный"?

Можно и попроще если под словом "выбранную" вы понимаете именно запись на которой в данный момент находится фокус, т.е. -
AFocusedRecord := <Your>cxGridTableView.Controller.FocusedRecord
Автор: Bill_PHO
Дата сообщения: 31.10.2010 15:14
Не подскажет ли кто, как правильно решить следующее:
нужно, чтобы в дереве, представленном cxDBTreeList, не раскрывались узлы, у которых колонки таблицы, отображаемой деревом, имеют некоторое значение К.
Автор: jukol
Дата сообщения: 31.10.2010 15:24
Уважаемые коллеги, прошу помощи! В C++ Builder (RAD Studio 2010) работаю с базой ElevateDB. Импортирую данные из текстовых файлов в формате CSV в несколько таблиц базы. Для просмотра размещаю на формеTAdvOfficePager из TMS и в run-time добавляю к нему страницы (TAdvOfficePage) - по одной для каждой таблицы БД. На каждой странице динамически размещаю TcxGrid, добавляю к ней TcxGridLevel, создаю TcxGridDBTableView и связываю его с соответствующей таблицей БД (TEDBTable). До этого момента все нормально работает. Но при попытке закрытия некоторой страницы TAdvOfficePage программа надолго "задумывается", особенно если в соответствующей таблице БД много записей (в моем случае около 50 тыс.). Сначала думал, что так долго закрывается таблица БД, но эксперименты показали, что виновата TcxGrid. Пробовал вызывать grid->BeginUpdate() и grid->EndUpdate() - не помогает. В чем может быть причина и как ускорить удаление страниц со встроенными TcxGrid?
    
Автор: TechnoDreamer
Дата сообщения: 31.10.2010 20:51
Bill_PHO, в OnExpanding проверяйте. Allow:=false что бы запретить
Автор: Bill_PHO
Дата сообщения: 31.10.2010 22:02
TechnoDreamer

Да. Работает. Спасибо.
Автор: vladman
Дата сообщения: 31.10.2010 22:14
jukol

Цитата:
создаю TcxGridDBTableView и связываю его с соответствующей таблицей БД (TEDBTable)...В чем может быть причина и как ускорить удаление страниц со встроенными TcxGrid?

Перед удалением страницы, отвяжите ваш TEDBTable от TableView.
Автор: jukol
Дата сообщения: 31.10.2010 22:34
vladman:

Цитата:
Перед удалением страницы, отвяжите ваш TEDBTable от TableView.


А как это сделать? Безрезультатно пробовал следующее:
TcxGridLevel* level=grid->Levels->Items[0];
level->Active=false; // не помогает

TcxGridDBTableView* view=(TcxGridDBTableView*)level->GridView;
view->ClearItems(); // не помогает
view->DataController->DataSource=NULL; // не помогает

TDataSource* DataSource=view->DataController->DataSource;
TEDBTable* table=(TEDBTable*)DataSource->DataSet;
DataSource->DataSet=NULL; // не помогает
table->Close(); // не помогает

Что можно еще попробовать?
Автор: TechnoDreamer
Дата сообщения: 01.11.2010 01:00
Такая задача:
есть группа tcxDBCalcEdit и кнопка. При нажатии на кнопку значения комбиков (вернее полей БД к которым они привязаны) заполняются автоматически.
И есть булево поле в БД - AutoCalculated. Если данные заполнены с помощью кнопки автовычисления, то оно ставится в True.
Вот тут и столкнулся с проблемой - если какое либо из полей изменено пользователем вручную, то поле AutoCalculated надо поменять в false. Как это красиво сделать ума не приложу (причем надо универсально, так как комбиков\полей - много).
OnChange не подходит, т.к. я не могу определить - поменял ли пользователь значение сам или там просто загрузилось значение другой записи.
Автор: BlackVetal
Дата сообщения: 01.11.2010 07:02
TechnoDreamer
А чем тебе не нравиться OnChange ? Напиши одну обработку и подставляй в каждый комбик ...
Автор: marser
Дата сообщения: 01.11.2010 08:03
TechnoDreamer

Цитата:
OnChange не подходит, т.к. я не могу определить - поменял ли пользователь значение сам или там просто загрузилось значение другой записи
В обработчике события OnChange:

Код: if TcxCalcEdit(Sender).ModifiedAfterEnter then
begin
......
end;
Автор: TechnoDreamer
Дата сообщения: 01.11.2010 08:48
BlackVetal, так не в этом вопрос то был.

marser, спасибо. Самое смешное, что я пробывал это метод, но походу код написал для одного комбика, а проверял на другом
Автор: vladman
Дата сообщения: 01.11.2010 11:00
jukol

Цитата:
Что можно еще попробовать?

тогда давайте код показывающий как создаете, как уничтожаете. Посмотрим.
Автор: Vital283
Дата сообщения: 01.11.2010 12:36
А как можно получить из TcxGridDBTableView
значение поля строки, на котором остановился пользователь?
И записать в переменную

Автор: f3ka
Дата сообщения: 01.11.2010 12:44
Vital283

Код: Var := <YourcxGridDBTableView>.DataController.Values[<YourcxGridDBTableView>.DataController.FocusedRecord.RecordID, <YourColumnName>.IndexID];

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


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