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

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

Автор: LePeR
Дата сообщения: 08.08.2011 16:53
Вот код:
procedure Tmain.tvRubricLostrubricPropertiesCloseUp(Sender: TObject);
var
i,rubric_id:integer;
s:variant;
begin
for i:=0 to tvRubric.DataController.GetSelectedCount-1 do
begin
rubric_id:=tvRubric.DataController.Values[tvRubric.DataController.GetSelectedRowIndex(i),tvRubric.FindItemByName('tvRubricRubric_id').Index];
with dm.t_pricelink do begin
if Locate('inet_rubric_id',rubric_id,[loCaseInsensitive]) then Edit else Insert;
FieldValues['inet_rubric_id']:=rubric_id;
FieldValues['lost_rubric_id']:=tvRubricLostRubric.EditValue;
ShowMessage(VarToStr(tvRubricLostRubric.EditValue));
Post;
end;
end;
dm.q.Requery();
end;

соответственно tvRubricLostRubric - колонка с LookupComboBox, данные в грид попадают из TAdoQuery, соответственно как я понимаю по логике при выборе значения из Combobox'а датасет не обновляется, соответственно значение не выбирается, соответственно EditValue всегда возвращает null
Автор: X11
Дата сообщения: 08.08.2011 16:55
Чтобы программно сфокусировать выбрать запись в cxGrid не достаточно выполнять cxGrid1.SetFocus. Нужно ещё выполнять:


Код: with TcxGridDBTableView1 do
if DataController.RecordCount > 0 then
Controller.FocusedRow.Selected := True;
Автор: Cryogen2003
Дата сообщения: 08.08.2011 16:59
LePeR
Я конечно все понимаю, но причем тут CloseUp? А не проще ли привязаться к OnChange и OnEditValueChange и думаю будет тебе счастье
Автор: LePeR
Дата сообщения: 08.08.2011 17:03
Собственно dfm:
object tvRubricLostrubric: TcxGridDBColumn
Caption = 'Рубрика'
DataBinding.FieldName = 'lostrubric_id'
PropertiesClassName = 'TcxLookupComboBoxProperties'
Properties.KeyFieldNames = 'uin_rubrik'
Properties.ListColumns = <
item
FieldName = 'r_name'
end>
Properties.ListOptions.ShowHeader = False
Properties.ListSource = dm.d_rubrics
Properties.OnCloseUp = tvRubricLostrubricPropertiesCloseUp
end

Добавлено:
Cryogen2003

В том то и дело, что эти обработчики вообще не работают, видимо потому что запись не appendиться.
Автор: Cryogen2003
Дата сообщения: 08.08.2011 17:11
LePeR
что-то тут не так, у меня вроде все работало.
В DataModeController.syncMode что стоит?
просто если стоит true, то такой вещью как locate уже лучше не пользоваться (просто потом проблем не оберешься)
Автор: LePeR
Дата сообщения: 08.08.2011 18:22
syncMode менял - не помогло. Думается что проблема не в девках, а в настройках ADO. Или в том что я просто не знаю как обращаться с ADOQuery.

Добавлено:
Решил вопрос поставив в колонку LookUp Gridmode=true, после этого курсор в лукапной таблице ожил.
Кстати никто не в курсе, как после переоткрытия датасета вернуть курсор на то же место? Можно конечно запоминать позицию, но может есть какая-то специальная процедура?
Автор: nil46
Дата сообщения: 08.08.2011 20:30
Проблема с группировкой

procedure TSomeForm.GridColumnGetDisplayText(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: string);
begin
if ARecord.Values[GridColumn1.Index] = 2 then
AText := APrefix + AText;
end;


Как только перетаскиваю какой-либо текстовый столбец на панель группирования, сразу крэш:
raised exception class EVariantTypeCastError with message 'Could not convert variant of type (UnicodeString) into type (Double)'.

Без группировки значения ARecord.Values[GridColumn1.Index] в диапазоне 0, 1, 2.
Скорее всего после группировки значения в ARecord меняются и ARecord.Values[GridColumn1.Index] возвращает не Integer a что-то другое.

Подскажите плз, как обойти такую ситуацию.
Автор: BlackVetal
Дата сообщения: 09.08.2011 05:47
nil46
Возможно после группировки у GridColumn1.Index другое значение и происходит крэш, здесь возможно использовать не индекс и имя колонки ?
Автор: marser
Дата сообщения: 09.08.2011 06:59
nil46

Цитата:
Как только перетаскиваю какой-либо текстовый столбец на панель группирования, сразу крэш:
raised exception class EVariantTypeCastError with message 'Could not convert variant of type (UnicodeString) into type (Double)'.


Код: if VarSameValue(ARecord.Values[GridColumn1.Index], 2) then
Автор: wbsg
Дата сообщения: 09.08.2011 09:25
X11

Цитата:
Чтобы программно сфокусировать выбрать запись в cxGrid не достаточно выполнять cxGrid1.SetFocus. Нужно ещё выполнять:
 

Код:
with TcxGridDBTableView1 do
  if DataController.RecordCount > 0 then
    Controller.FocusedRow.Selected := True;

и это работает, если грид привязан к НД.
 
А У меня грид не привязан к НД.
Как в этом случае сфокусировать, выбрать грид, сделать его активным?


TcxGridDBTableView1.DataController.FocusedRecordIndex := 0;

По крайней мере, у меня все работает именно таким образом.
Ну, естественно, надо проверить на то, что есть хоть одна запись.
Автор: nil46
Дата сообщения: 09.08.2011 15:07
BlackVetal
Нет GridColumn1.Index не меняется.

После группировки среди ARecord-ов есть строчки где все value типа string (строка по которой идет группировка).

marser
Соглашусь - решил с помощью проверки VarType и игнорорования стринговых значений.

Всем спс за ответы.
Автор: X11
Дата сообщения: 10.08.2011 11:43
Раньше был код:


Код: procedure TfrmMain.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to GetExtendedStylePainters.Count - 1 do
bcSkin.Items.Add(GetExtendedStylePainters.Names);

bcSkin.ItemIndex := 0;
end;
Автор: Bill_PHO
Дата сообщения: 10.08.2011 12:32
Буду признателен, если кто покажет, как правильно обрабатывать несколько выделенных строк в cxGrid (например, удалить их).
Автор: tanaseduard
Дата сообщения: 10.08.2011 12:41
Bill_PHO

cxGridView.Controller.SelectedRowCount
cxGridView.Controller.SelectedRows
cxGridView.Controller.SelectedRecordCount
cxGridView.Controller.SelectedRecords
Обрабатываешь массивы.

Удалять или из DataSet если DBView или через cxGrid.DataController.DeleteRecord
Автор: Bill_PHO
Дата сообщения: 10.08.2011 12:44
tanaseduard

спасибо.
Автор: X11
Дата сообщения: 10.08.2011 13:16
Могут быть подводные камни, если пользователь сгруппировал записи, этот код должен отработать корректно.


Код:
Var
i: integer;
ARowIndex: Integer;
ARowInfo: TcxRowInfo;
begin
with dbgAnnotations.DataController do
if DataSet.RecordCount <= 0 then exit;

with dbgAnnotations.DataController do
begin
beginupdate;
Screen.Cursor := crHourGlass;
try
for I := 0 to GetSelectedCount - 1 do
begin
ARowIndex := GetSelectedRowIndex(I);
ARowInfo := GetRowInfo(ARowIndex);
if ARowInfo.Level < Groups.GroupingItemCount then
Continue
else
begin


//что-то делаем с выделенными записями
if Values[ARowInfo.RecordIndex, dbgAnnotationsID_USER.Index] = UserData.UserID then
DM.fibDB.Execute('delete from TAnnotations where ID = ' + VarToStr(Values[ARowInfo.RecordIndex, dbgAnnotationsID.Index]));

end;//else
end;//for
finally
endupdate;
Screen.Cursor := crDefault;
end;//try
end;//with
Автор: Bill_PHO
Дата сообщения: 10.08.2011 13:47
X11
Спасибо.
Все получилось.
Автор: andreybear
Дата сообщения: 11.08.2011 05:12
Всем привет!
Столкнулся с такой проблемой.
В коде закрашиваю ячейки в gride на событии OnCustomDrawCell. Корректно закрашиваются только отображаемые в начале данные, т.е. если данных в таблице много, то просле прокрутки scrollbar'ом закраска ячеек не соответствует той, которая должна быть.

Вот код закрашивания по условию.

Код: procedure TFormReadings.CustDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
var ADone: Boolean);
var itemI, recI: integer;
begin
try
recI := AViewInfo.RecordViewInfo.Index;
itemI := AViewInfo.Item.Index;
// Если массив инициализирован
if Assigned(FColor) then
// Если индекс текущей записи меньше количества записей и >= 0
// без проверки возникает ошибка при создании новой записи
if ((recI < (Length(FColor)))
and (recI >= 0)) then
case FColor[recI, itemI] of
1: // Желтый - запись об объекте есть в табл. норм, но не попадает
// во временной интервал действия нормы
begin
ACanvas.FillRect(AViewInfo.Bounds,$0083C6CB);
end;
2: // Голубой - показатель ниже нормы
begin
ACanvas.FillRect(AViewInfo.Bounds,$00FBA8A4);
end;
3: // Зеленый - показатель в норме
begin
ACanvas.FillRect(AViewInfo.Bounds,$00A8FBA4);
end;
4: // Красный - показатель выше нормы
begin
ACanvas.FillRect(AViewInfo.Bounds,$00B5A4FB);
end;
5: // Серый - нет записи об объекте в табл. норм
begin
ACanvas.FillRect(AViewInfo.Bounds,$00C1C1C1);
end;
end;
except
on E: Exception do
MessageBox(handle, PChar('Ошибка при отрисовке ячейки! ')
+ E.Message, PChar('Ошибка!'), MB_OK + MB_ICONERROR);
end;
end;
Автор: BlackVetal
Дата сообщения: 11.08.2011 06:05
andreybear
проверь индексы, по которым выбирается цвет - возможно у тебя индексы некорректные. еще IMXO нужно поставить отрисовку баграунда ячейки "по умолчанию", то есть перед тем как закрашивать в какой-то конкретный цвет - нужно ставить какой-то цвет по умолчанию (белый, серый или еще какой)
Автор: marser
Дата сообщения: 11.08.2011 06:54
andreybear
А зачем Вы сами пытаетесь раскрашивать? Я имею ввиду ACanvas.FillRect(...). Не надо мешать гриду самому раскрашивать. Достаточно просто указать ACanvas цвет фона и шрифта. Например

Код: ACanvas.Brush.Color := clYellow;
ACanvas.Font.Color := clRed;
Автор: andreybear
Дата сообщения: 11.08.2011 07:47
BlackVetal
Проверял индексы неоднократно. После построения таблицы массив с "цветами" не изменяется, размер массива соответствует размеру таблицы, т.е. каждой ячейке таблицы соответствует ячейка массива.

Цитата:
еще IMXO нужно поставить отрисовку баграунда ячейки "по умолчанию", то есть перед тем как закрашивать в какой-то конкретный цвет - нужно ставить какой-то цвет по умолчанию (белый, серый или еще какой)

Что вы имеете ввиду? Например, ACanvas.Brush.Color := clWhite в начале процедуры CustDrawCell (см. фрагмент кода ниже).
Прикрепляю еще 3 скриншота таблицы: 1 - состояние сразу после загрузки; 2 - состояние после прокрутки вниз; 3 - возвращение в исходное состояние (прокрутка вверх).
1. http://imageshack.us/photo/my-images/59/scrin3.jpg/
2. http://imageshack.us/photo/my-images/405/scrin4.jpg/
3. http://imageshack.us/photo/my-images/62/scrin5s.jpg/
На скриншотах 1 и 3 одно отображаются одни и те же ячейки, однако после прокрутки вниз и возвращения в исходное положение закрашены они по-разному! Массив, в зависимости от содержимого которого окрашиваются ячейки во время прокрутки вниз-вверх не менялся, никаких изменений, кроме собственно прокрутки не производилось.

marser
Пробовал по-разному, в том числе как вы предложили - не работает!

Код:
procedure TFormReadings.CustDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
var ADone: Boolean);
var itemI, recI: integer;
begin
try
ACanvas.Brush.Color := clWhite; // Цвет по умолчанию
recI := AViewInfo.RecordViewInfo.Index;
itemI := AViewInfo.Item.Index;
// Если массив инициализирован
if Assigned(FColor) then
// Если индекс текущей записи меньше количества записей и >= 0
// без проверки возникает ошибка при создании новой записи
if ((recI < (Length(FColor)))
and (recI >= 0)) then
begin
ACanvas.Font.Color := clBlack; // Цвет шрифта - черный
case FColor[recI, itemI] of
1: // Желтый - запись об объекте есть в табл. норм, но не попадает
// во временной интервал действия нормы
begin
//ACanvas.FillRect(AViewInfo.Bounds,$0083C6CB);
ACanvas.Brush.Color := $0083C6CB;
end;
2: // Голубой - показатель ниже нормы
begin
//ACanvas.FillRect(AViewInfo.Bounds,$00FBA8A4);
ACanvas.Brush.Color := $00FBA8A4;
end;
3: // Зеленый - показатель в норме
begin
//ACanvas.FillRect(AViewInfo.Bounds,$00A8FBA4);
ACanvas.Brush.Color := $00A8FBA4;
end;
4: // Красный - показатель выше нормы
begin
//ACanvas.FillRect(AViewInfo.Bounds,$00B5A4FB);
ACanvas.Brush.Color := $00B5A4FB;
end;
5: // Серый - нет записи об объекте в табл. норм
begin
//ACanvas.FillRect(AViewInfo.Bounds,$00C1C1C1);
ACanvas.Brush.Color := $00C1C1C1;
end;
end;
end;
except
on E: Exception do
MessageBox(handle, PChar('Ошибка при отрисовке ячейки! ')
+ E.Message, PChar('Ошибка!'), MB_OK + MB_ICONERROR);
end;
end;
Автор: X11
Дата сообщения: 11.08.2011 08:59
Не понятно, что это за FColor м как он расчитывается
Автор: marser
Дата сообщения: 11.08.2011 09:13
andreybear

Цитата:
Думается, что рано или поздно кто-нибудь также столкнется с подобной проблемой

Да нет там никакой проблемы. Попробуйте написать простой пример

Код: procedure TFormReadings.CustDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
var ADone: Boolean);
begin
if (AViewInfo.GridRecord.Index = 2) and (AViewInfo.Item.Index = 2) then
ACanvas.Brush.Color := clRed;
end;
Автор: vladman
Дата сообщения: 11.08.2011 09:26
andreybear

Цитата:
Проверял индексы неоднократно.

Попробуйте заменить recI := AViewInfo.RecordViewInfo.Index; на recI := AViewInfo.GridRecord.RecordIndex;
Автор: andreybear
Дата сообщения: 11.08.2011 10:09
Это двумерный массив, содержащий значения от 0 до 5. 1..5 - соответствуют цветам, которые описаны в коде. 0 - не соответствует никакому цвету.
Есть некоторые показатели для конкретных объектов (например, объекты: Всас, Д 400 мм, Д 500 мм; показатели: уровень, давление, расход), для каждого показателия объекта определена норма. При загрузке значений конкретного показателя объекта в таблицу производится сверка с нормами для этого показателя.
Если норма задана, то в зависимости от результатов сравнения в массив проставляются цифры 2..4 (2 - ниже нормы, 3 - норма, 4 - выше нормы). 1 - норма для показателя объекта есть, но либо кончился срок действия, либо показание не попадает во временной интервал. 5 - вообще нет записи в таблице норм. 0 используется в данном случае для указания на то, что не требуется закрашивание (колонка "Дата" в таблице).
Индексы первого измерения соответствуют индексам записей таблицы(Records), индексы второго измерения соответствуют индексам колонок таблицы(Items).
Данные хранятся в СУБД Oracle.
Я могу скинуть куда-нибудь немалый исходный код, однако дело тут не в массиве, о чем свидетельствуют скриншоты 3-5.
Заметил такую особенность - если изначально загрузить не много данных(столько, чтоб данные умещались таблице при развернутой на весь экран форме), уменьшить размер формы(у таблицы Align = Client), чтоб появились скролбары в таблице, затем поскролить вверх/вниз(соответственно закраска ячеек станет неправильной) (скрин 6), затем растянуть форму так, чтоб все данные уместились в таблице и исчезли скролбары, то в этом случае закраска становится корректной прям на глазах!(скрин 7)
Уже давненько пытаюсь найти решение этой проблемы или причину, которая к привела к ее возникновению, но что-то пока не получается. Хотел было отказаться от этой затеи, однако эта функция одно из обязательных требований заказчика.
Скрин 6 http://imageshack.us/photo/my-images/696/scrin6.jpg/
Скрин 7 http://imageshack.us/photo/my-images/580/scrin7.jpg/

Добавлено:
marser
Действительно, простой пример работает!
vladman

Цитата:
Попробуйте заменить recI := AViewInfo.RecordViewInfo.Index; на recI := AViewInfo.GridRecord.RecordIndex;

Точно в цель! Вы случайно не экстрасенс? Сразу же увидели причину!
vladman, marser, BlackVetal
Огромное человеческое спасибо! Несколько дней убил на поиск ошибки, уже и не знал, что делать, а вы прям махом помогли разобраться!
Автор: Alien92
Дата сообщения: 11.08.2011 10:59
Добрый день, у меня возникла такая проблема:
Во время работы программы при нажатии на кнопку, TcxGrid должен заполняться из ini файла(их может быть несколько, а может быть и ни одного, соответственно количество строк = количеству ini файлов), заполнение происходит нормально, но при повторном нажатии на кнопку, если файлы остались те же, или их стало больше, всё нормально, т.е. TcxGrid обновляет окно, но если например файла было 2, а после повторного нажатия кнопки их нет вообще, то в окне TcxGrid продолжают висеть те же 2 файла, хотя должно быть просто чистое окно.
Может кто сталкивался с таким, подскажите, в чём может быть проблема?
Заранее благодарен
Автор: X11
Дата сообщения: 11.08.2011 11:18

Цитата:
Может кто сталкивался с таким, подскажите, в чём может быть проблема?

Конечно. Проблема в 17ой строке.
Автор: mdid
Дата сообщения: 11.08.2011 11:24
Alien92
что такое TcxGrig?у меня просто нет такого это TcxGrid?
Автор: Alien92
Дата сообщения: 11.08.2011 11:44
mdid
Да, так оно и есть, опечатался.
X11
Собственно, вот код, но тут только заполнение, а меня интересует процесс очистки...
    TcxCustomDataController *dc = NULL;
    dc = cxGrid1->Levels->Items[0]->GridView->DataController;
    dc->RecordCount = 0;

    ++dc->RecordCount;
    dc->Values[i][0] = inifile->ReadString("***","***","***");
    dc->Values[i][1] = inifile->ReadString("***","***","***");
    dc->Values[i][2] = inifile->ReadString("***","***","***");
    dc->Values[i][3] = inifile->ReadString("***","***","***");
    dc->Values[i][4] = inifile->ReadString("***","***","***");
    dc->Values[i][5] = inifile->ReadString("***","***","***");
    dc->Values[i][6] = sFileName;

    TcxCustomDataController *dc1 = dc->GetDetailDataController(i,0);

    ++dc1->RecordCount;
    dc1->Values[i][0] = inifile->ReadString("***","***","***");
    dc1->Values[i][1] = inifile->ReadString("***","***","***");
    dc1->Values[i][2] = inifile->ReadString("***","***","***");
    dc1->Values[i][3] = inifile->ReadString("***","***","***");
    dc1->Values[i][4] = inifile->ReadString("***","***","***");
    dc1->Values[i][5] = inifile->ReadString("***","***","***");
    i++;
Автор: marser
Дата сообщения: 11.08.2011 12:09
Alien92

Код: а меня интересует процесс очистки

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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