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

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

Автор: salexn1
Дата сообщения: 20.09.2010 17:34
Man_Without_Face
т.е. вы открываете DataSet, в поле А - пустая строка и Вы хотите, чтобы вместо пустой строки выводился какой-то текст?

Если так, то у возможно покатит для этих целей метод поля - GetText, ну или отрисовывайте сами на гриде - метод CustomDrawCell
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 17:45

Цитата:
т.е. вы открываете DataSet, в поле А - пустая строка и Вы хотите, чтобы вместо пустой строки выводился какой-то текст?

Да

Цитата:
GetText

В событии поля (у грида) OnGetDataText пишу:

procedure TfrmMain.cxGridOXDBTableView1Price_BYRGetDataText(
Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
if cdsOX.FieldByName('price_byr').asstring = '' then
cxGridOXDBTableView1Column1.EditValue := '0';

end;
запускаю, полей много, прокручиваю скролл на то поле и выскакивает ошибка: StackOverflow


Добавлено:
Delphi 2007, DevExpress v48
Автор: volser
Дата сообщения: 20.09.2010 18:23
Man_Without_Face
Нужно данные брать с самого грида через Values, а не с датасета.
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 18:44
volser
Может я не так понял, но такого свойства нет:
cxGridOXDBTableView1Price_byr.value

Добавлено:
Я понимаю так:
if cxGridOXDBTableView1.DataController.Values[] = '' then
cxGridOXDBTableView1Price_byr.EditValue := '0';
Но что в скобках?
Автор: Sufferer
Дата сообщения: 20.09.2010 20:27
Подскажите как в cxGrid настроить группировку данных по дате в стиле Оутлока. В демке девковской это есть, а вот как это настроить я так и не понял. Перетыкал кучу свойств, а результата нет.

Автор: volser
Дата сообщения: 20.09.2010 22:50
Man_Without_Face
Values[] - это индексатор, на вход которого нужно передать номер столбца и строки. Номер столбца можно взять в cxGridOXDBTableView1Price_byr или в Sender: TcxCustomGridTableItem; - если это один и тот же столбец. Номер строки ARecordIndex: Integer;.
Автор: marser
Дата сообщения: 21.09.2010 07:35
Sufferer
cxGridTableView.OptionsView.GroupRowStyle := grsOffice11


Добавлено:
Man_Without_Face

Код: procedure TfrmMain.cxGridOXDBTableView1Price_BYRGetDataText(
Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
if VarIsNull(ARecord.Values[Sender.Index]) or (VarToStr(ARecord.Values[Sender.Index]) = '') then
AText := '0';
end;
Автор: Man_Without_Face
Дата сообщения: 21.09.2010 08:14
marser
volser
Если так:
procedure TfrmMain.cxGridOXDBTableView1Price_BYRGetDataText(
Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
if VarIsNull(cxGridOXDBTableView1.DataController.Values[cxGridOXDBTableView1Price_byr.Index, cxGridOXDBTableView1Price_byr.index])
or (VarToStr(cxGridOXDBTableView1.DataController.Values[cxGridOXDBTableView1Price_byr.Index, cxGridOXDBTableView1Price_byr.index]) = '') then
cxGridOXDBTableView1Price_byr.EditValue := '0';
end;
то в грид загружаются данные, но когда прокручиваеш скролл на то поле, вылетает ошибка: Stack overflow.

Добавлено:
Или почему в свойствах (properties -> currencyedit) не работает свойство NullString. Выставляю 0, но при редактировании ячейки, там все равно ' '.

Добавлено:
Сделал так:
if VarIsNull(cxGridOXDBTableView1.DataController.Values[cxGridOXDBTableView1Price_byr.Index, cxGridOXDBTableView1Price_byr.index])
or (VarToStr(cxGridOXDBTableView1.DataController.Values[cxGridOXDBTableView1Price_byr.Index, cxGridOXDBTableView1Price_byr.index]) = '') then
AText := '0';
в столбце появляются нули, но это аналог NullString. При сохранении пустая строка.
Автор: salexn1
Дата сообщения: 21.09.2010 10:04
Man_Without_Face
ну конечно будет пустая! т.к. это только для просмотра!!!

если нужно, чтобы там были 0 - возьмите и запустите SQL один раз

Код:
update table set field = '0' where field is null or field = ''
Автор: Sufferer
Дата сообщения: 21.09.2010 10:55

Цитата:
Sufferer
cxGridTableView.OptionsView.GroupRowStyle := grsOffice11

Ну это я и так понял, но это только первый шаг который ничего визуально не меняет. Что дальше-то?
Автор: Man_Without_Face
Дата сообщения: 21.09.2010 10:57
Всем большое спасибо.

salexn1
Данные беру из xml файла.

Это то что надо:

Цитата:
while not DataSet.Eof do
begin
if DataSet.FieldByName('aaaa').IsNull or (trim(DataSet.FieldByName('aaaa').AsString) = '') then
begin
DataSet.Edit;
DataSet['aaaa'] = '0';
DataSet.Post;
end;
DataSet.Next;
end


И такой вопрос - эти записи аналогичны?:
dataset.FieldByName('aaa').asstring := '0';
и
dataset['aaa'] := '0';
Или в чем различие?
Автор: salexn1
Дата сообщения: 21.09.2010 11:03
Man_Without_Face
аналогичны. Для скорости лучше для начала найти поле и работать с полем напрямую...
Типа так:


var
aField: TField;
begin
aField := aDataSet.FindField('aaa');
aField.Value := '0';
end;


Но тут производительность будет заметна только при большом количестве обращений к полю
Автор: marser
Дата сообщения: 21.09.2010 11:39
Sufferer

Цитата:
Ну это я и так понял, но это только первый шаг который ничего визуально не меняет. Что дальше-то?

Как это не меняет? Если Вы имеете введу сделать как в Office11GroupRowStyleDemo, то
достаточно сгруппировать по какой-нибуть колонке и установить cxGridTableView.OptionsView.GroupRowStyle := grsOffice11. Ну и cxGrid.LookAndFeel влияет на внешний вид.


Добавлено:
Обратите ещё внимание на свойства cxGridTableView.DateTimeHandling
Автор: Man_Without_Face
Дата сообщения: 21.09.2010 16:30
Подскажите как или где прочитать, чтобы в cxGrid отредактированные ячейки изменяли цвет шрифта. Поиск ничего не дал. Спасибо.
Автор: salexn1
Дата сообщения: 21.09.2010 17:03
Man_Without_Face
Вопросы
1. Какие компоненты доступа к данным?
2. Как изменяются данные: непосредственно в гриде или в отдельном окне?
Автор: volser
Дата сообщения: 21.09.2010 19:31
Man_Without_Face
На изменение ячейки куда то сохранять пару (номер колонки, номер столбца). В событии CustomDrawCell подсвечивать ячейки.
Автор: Sufferer
Дата сообщения: 21.09.2010 22:32

Цитата:
Как это не меняет? Если Вы имеете введу сделать как в Office11GroupRowStyleDemo, то
достаточно сгруппировать по какой-нибуть колонке и установить cxGrid1TableView1.OptionsView.GroupRowStyle := grsOffice11. Ну и cxGrid.LookAndFeel влияет на внешний вид.

А вот так, не меняет и все
Вот по шагам как я делаю, может это объяснит где грабли:
1. OptionsView.GroupRowStyle := grsOffice11
2. Иду в Customize для cxGrid1, выбираю вкладку Summary далее вкладка Groups. Добавляю новую группу. Для этой группы добавляю элемент. Определяю для этого элемента свойства:
Column - первую колоеку из набора
FieldName - колонку содержащую даты
Kind - Количество
3. Выставляю все флаги в DateTimeHandling.Filters.
Никакого эффекта на любом этапе.


Добавлено:
Хотя если подумать, то у меня и группировки собственно никакой не происходит. Почему?

Добавлено:
Все! Понял! Блин оказалось надо было еще GroupIndex для колонки изменить.
Автор: BlackVetal
Дата сообщения: 22.09.2010 06:15
Man_Without_Face
Как вариант можно использовать события RowStyle и RowCellStyle ... а вот факт того, что данные в ячейке изменились - то тут надо думать, как узнать, что в ячейке изменились данные, т.к. вроде сохранение происходит сразу ...
Автор: marser
Дата сообщения: 22.09.2010 08:07
Sufferer

Цитата:
2. Иду в Customize для cxGrid1, выбираю вкладку Summary далее вкладка Groups. Добавляю новую группу...

Ой как изощрённо. На GroupBox панели написано: "Drag a column header here to group by that column" (Для группировки перенесите сюда заголовок колонки). Берёте мышкой заголовок колонки и переносите на GroupBox панель. Это не проще?
Автор: Man_Without_Face
Дата сообщения: 22.09.2010 08:20
salexn1

Цитата:
Какие компоненты доступа к данным?

ClientDataSet, DataSource

Цитата:
Как изменяются данные: непосредственно в гриде или в отдельном окне?

Непосредственно в гриде

volser

Цитата:
На изменение ячейки куда то сохранять пару (номер колонки, номер столбца). В событии CustomDrawCell подсвечивать ячейки.

Это все конечно интересно, но если бы я еще знал как это программно сделать?

А если не цвет текста менять, а цвет ячейки. Это проще будет?


Автор: X11
Дата сообщения: 22.09.2010 09:13

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

EmmediatePost отключить и сравнивать Value, EditValue, EditingValue. В справке посмотрите чем отличаются EditValue и EditingValue
Автор: Sufferer
Дата сообщения: 24.09.2010 10:45
Привет!
В cxGrid есть поле типа ExtLookupComboBox
Как его правильно настроить, что-бы в выпадающем списке выводились только записи связанные по мастер-ключу и при вводе нового значения автоматом проставлялось ключевое поле от мастер-табли?
Автор: X11
Дата сообщения: 24.09.2010 11:20
А в чём сложность. Как настраивал и что не получилось?
Автор: afiget
Дата сообщения: 24.09.2010 12:54
Sufferer
Например, в TcxCustomDropDownEditProperties.OnInitPopup делать фильтр по источнику данных (можно и обновлять запрос с параметром) или по View, который используется в ExtLookupComboBox.
Автор: asi81
Дата сообщения: 24.09.2010 15:38
Добрый день!

Есть здесь кто-нибудь, работающий на билдер? У меня не работает OnGetContentStyle в cxGride!!! Кроме того вызывает явное сомнеие сама декларация ивента (devExpress 52)

void __fastcall TBeaconTableFrame::MainGridStylesGetContentStyle(
TcxCustomGridTableView *Sender, TcxCustomGridRecord *ARecord,
TcxCustomGridTableItem *AItem, TcxStyle *AStyle)

хотя в примере указано

void Form1::cxGridUsersDBCardViewStylesGetContentStyle(
TcxCustomGridTableView *Sender, TcxCustomGridRecord *ARecord,
TcxCustomGridTableItem *AItem, TcxStyle *&AStyle)

фигня в том что
AStyle = MyStyle работать не будет(как в примере), так как это не ссылка на указатель!!!!

Или я конкретно чегото не догоняю???
Автор: AvGSoft
Дата сообщения: 24.09.2010 17:12
asi81
Вот рабочий код только не для cxGrid, а для cxDBTreeList но суть не меняется

Код:
void __fastcall TfrmNodes::dbtNodeListStylesGetContentStyle(TcxCustomTreeList *Sender,
         TcxTreeListColumn *AColumn, TcxTreeListNode *ANode, TcxStyle *&AStyle)

{
    switch (ANode->Values[dbtclmnSCode->ItemIndex].intVal)
    {
        case 5:
        case 12:
            AStyle = dmMain->stylTeh;
        break;
    }
}
Автор: asi81
Дата сообщения: 24.09.2010 18:29
AvGSoft
А для какого конкретно GridView Вы пробовали?

Я пробовал с TcxGridDBTableView. Сейчас еще раз пробовал - все равно эффект наблюдается.
Автор: bekturov
Дата сообщения: 26.09.2010 11:00
Здравствуйте !
Столнуля с проблемной: D2010 + все апдейты и DevExpress 6.52.

Создаем новую форму, кидаем TActionList, добавляем TAction, привязываем горячую клавишу, в OnExecute пишем raise Exception.Create('test'). Кидаем на форму dxBarManager, добавляем dxBar, на dxBar кидаем dxBarButton, к которому привязываем созданный ранее Action. Вызываем форму модально, нажимаем горячую клавишу, получаем ошибку, после чего ФОРМА ЗАКРЫВАЕТСЯ. т.е. у меня получается, если форма открыта модально, Action привязан к dxBar'у и вызван именно горячей клавишей, то если в OnExecute возникает ошибка то форма закрывается Никто не сталкивался с таким поведением ?

Добавлено:
судя по всему, косяк в 6.52, откатился на 6.48 все нормально
Автор: AvGSoft
Дата сообщения: 26.09.2010 14:45
asi81
Как раз для него и пробывал (TcxGridDBTableView). Скорее всего ищи проблемы в RAD'е т.к. он генерит евенты
Автор: AvGSoft
Дата сообщения: 27.09.2010 09:21
bekturov
Чет я либо неправильно воспроизвожу ситуацию, либо я тебя не понял.
Но на RAD 2010 + 52 девки при проделывании всех действий и вызова формы модально все работает нормально вываливается исключение как и положено хоть по нажатию, хоть по горячей клавише.
Правда пробовал на C++Builder'e (throw(Exception("Test"));)
Так что проблема скорее не в девках.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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