Глюки rxDBGrid

Модераторы: alexs, Модераторы

Re: Глюки rxDBGrid

Сообщение haword » 16.02.2012 20:34:14

alexs только не говори что это фичи :)

1) процедура OutCaptionCellText
Если TitleStyle стоит не tsNative то бакграунд заголовков таблицы не прорисовывается. А не tsNative всегда при создании нового компонента. Разкомментировал Canvas.FillRect(aRect);
и все встало на свои места. Не ужели этот баг еще никто не заметил?
2) При включении в опциях OptionRx параметра rdgFilter, компонент все заголовки рисует со стилем Italic. Лечение:
- убрать в constructor TRxColumnFilter.Create(Owner: TRxColumn) строчки присваивающие в наглую шрифтам стиль Italic, ибо нафиг не надо, кому надо выставит сам, иначе от этого стиля не избавишься.
- в процедуре TRxDBGrid.DefaultDrawFilter ищем и убиваем строчки в этой процедуре

Код: Выделить всё
  if (dgIndicator in Options) and (aCol = 0) then
  begin
    Canvas.FillRect(aRect);
    DrawCellGrid(aCol, aRow, aRect, aState);
    exit;
  end;
  DrawCellGrid(aCol, aRow, aRect, aState);

а вместо них вставляем

Код: Выделить всё
if (dgIndicator in Options) and (aCol = 0) then
  begin
    if (TitleStyle = tsNative) then
      DrawThemedCell(aCol, aRow, aRect, aState)
    else
    begin
      Canvas.FillRect(aRect);
      DrawCellGrid(aCol, aRow, aRect, aState);
    end;
    exit;
  end;

  if (TitleStyle = tsNative) then
    DrawThemedCell(aCol, aRow, aRect, aState)
  else
  begin
    Canvas.FillRect(aRect);
    DrawCellGrid(aCol, aRow, aRect, aState);
  end;


далее ищем

Код: Выделить всё
  ft:=Canvas.Font;

и заменяем на эти две
Код: Выделить всё
    ft:=TFont.Create;
    ft.Assign(Canvas.Font);

ищем

Код: Выделить всё
  with TRxColumn(Columns[MyCol]).Filter do
    begin
      Canvas.Brush.Color := Color;
      Canvas.FillRect(aRect);


заменяем на

Код: Выделить всё
    with TRxColumn(Columns[MyCol]).Filter do
    begin
      if (TitleStyle <> tsNative) then
      begin
        Canvas.Brush.Color := Color;
        Canvas.FillRect(aRect);
      end;


далее ищем ниже и убираем
Код: Выделить всё
   Canvas.Font:=ft;

и заменяем на
Код: Выделить всё
   Canvas.Font.Assign(ft);
    ft.Free;


3) для меня баг для кого то может быть и фича :) Короче, если выставить в опциях rdgFilter то фильтр появляется но пустой а при закрытии датасета грида вообще фильтр скрывается. правим:
- procedure TRxDBGrid.OnFilter(Sender: TObject) - после строк
Код: Выделить всё
  ...
    C.Filter.ValueList.Add(C.Filter.EmptyValue);
  end;

добавляем
Код: Выделить всё
  if not DataSource.DataSet.Active then
   exit;

- правим procedure TRxDBGrid.LinkActive(Value: boolean);
ищем
CalcStatTotals;
добавляем после нее
Код: Выделить всё
      if rdgFilter in OptionsRx then
         OnFilter(nil);

далее ищем ниже
OptionsRx := OptionsRx - [rdgFilter];
удаляем и добавляем
Код: Выделить всё
        if rdgFilter in OptionsRx then
           OnFilter(nil);

и еще с футером такие же изменения по замене DrawCellGrid на DrawThemedCell вроде бы работает так как надо. мне :)


Изображение
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Глюки rxDBGrid

Сообщение alexs » 24.02.2012 01:49:44

haword
Спасибо за подробный разбор и патчики.
Включил всё.

Информация для всех:
Я решил немного переработать свойство у грида, которые относятся к строке итогов.
Теперь это будет группироватья в одном комплексном свойстве. Для плавного перехода временно будут поддерживаться старые свойства, но они будут помечены как устаревшие. В дальнейшем они будут по умолчанию выклчены (вернуть их можно будет через define компилятора).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение dunin » 24.02.2012 09:37:31

alexs, поставь себе в подпись плз где последний снапшот RX качать - каждый раз кучу времени трачу пока найду. :|
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Глюки rxDBGrid

Сообщение Padre_Mortius » 24.02.2012 10:17:28

dunin, в ссылках на главной странице смотреть lazarus-ccr.
P.S. надо бы не забыть ev напомнить об этом
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Глюки rxDBGrid

Сообщение haword » 24.02.2012 15:11:16

насчет фильтров в гриде, если будет время повожусь еще сам, так как было бы очень удобно если бы в выпадающем списке можно было бы метить нужные поля а не выбирать одно для фильтра, плюс ко всему еще желательно разрешить ввод в поле фильтра текста и по нему уже делать фильтрацию.
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Глюки rxDBGrid

Сообщение alexs » 24.02.2012 19:42:39

haword
Там сейчас просто комбобоксик используется. Твой вариант - надо делать сложный контрол с выпадающим окном группы чекбоксов.
Мысль хорошая. Если получится - будет круто.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение haword » 24.02.2012 23:47:17

это чудо называется CheckListBox , его можно попробовать припахать.
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Глюки rxDBGrid

Сообщение ronin » 27.02.2012 20:35:33

обнаружил ещё одну проблему: при добавлении строки методом Append и попытке выполнить Post для датасета вылетает ошибка TApplication.HandleException List index (2) out of bounds причём ругается всегда на индекс добавляемой строки, т.е. в данном примере в гриде было 2 строки, а добавляемая является третьей по счёту

пару дней убил на то чтобы понять где искать ошибку, под отладкой отловить не получается, ибо останов (ElistError) постоянно происходит в модуле Zeos'а вот в этом месте

Код: Выделить всё
function TZAbstractRODataset.GetFieldData(Field: TField;
  Buffer: Pointer): Boolean;
var
  ColumnIndex: Integer;
  RowBuffer: PZRowBuffer;
begin
место останова if GetActiveBuffer(RowBuffer) then
  begin
    ColumnIndex := DefineFieldIndex(FieldsLookupTable, Field);
    RowAccessor.RowBuffer := RowBuffer;
    if Buffer <> nil then     


но чутьё подсказывает что не в этом дело, т.к. попробовал стандартный грид, всё нормально, ошибок нету

если автор обратит внимание на данный пост и поможет попытаться решить проблему буду очень благодарен

p.s. скачал последнюю ночную сборку rxfpc + zeos 7 из svn

Добавлено спустя 4 минуты 42 секунды:
ещё забыл добавить что ошибка не проявляется если в таблице нет строк
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение .wOvAN » 28.02.2012 07:09:04

Патч (rxdbgrid.pas)

тут вылазит ошибка

Код: Выделить всё
procedure TRxDBGrid.WMVScroll(var Message: TLMVScroll);
.....

if (not DataSource.DataSet.Active) then exit;       


исправление

Код: Выделить всё

procedure TRxDBGrid.WMVScroll(var Message: TLMVScroll);
.....
if (not assigned (DataSource)) or (not assigned (DataSource.DataSet)) or (not DataSource.DataSet.Active) then exit;                       

.wOvAN
постоялец
 
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12

Re: Глюки rxDBGrid

Сообщение ronin » 28.02.2012 12:36:02

это к моему вопросу отношение имеет?

при ошибке выдаёт следующее:

TApplication.HandleException List index (3) out of bounds
Stack trace:
$0044E41F


каждый раз одно и то же

Добавлено спустя 2 минуты 17 секунд:
ещё хотел отметить что при Insert всё проходит гладко, без ошибок, потому что добавляемая строка не является последней, при Append ошибка

Добавлено спустя 56 минут 39 секунд:
нашёл процедуру в которой происходит ошибка

Код: Выделить всё
procedure TRxDBGrid.ErrorPo(DataSet: TDataSet; E: EDatabaseError;
  var DataAction: TDataAction);
var
  i: integer;
begin
  if FFooterOptions.Active and (DatalinkActive) then
    for i := 0 to Columns.Count - 1 do
      if not TRxColumn(Columns[i]).Footer.ErrorTestValue then//здесь вылетает исключение
      begin
        FInProcessCalc := -1;
        Break;
      end;
  if Assigned(F_EventOnPostError) then
    F_EventOnPostError(DataSet, E, DataAction);
end;


функция ErrorTestValue

Код: Выделить всё
function TRxColumnFooter.ErrorTestValue: boolean;
var
  F: TField;
begin
  Result := True;
  if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
  begin
    F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
    if Assigned(F) then
      if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
      begin
        if FValueType in [fvtMax, fvtMin] then
          if not (F.IsNull) and (FTestValue = F.AsDateTime) then
            Result := False
          else
          if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
            case FValueType of
              fvtMax: FTestValue := Max(FTestValue, TDateTime(F.OldValue));
              fvtMin: FTestValue := Min(FTestValue, TDateTime(F.OldValue));
            end;
      end
      else
      if (FValueType in [fvtMax, fvtMin]) and not (F.IsNull) and
        (FTestValue = F.AsFloat) then
        Result := False
      else
        case FValueType of
          fvtSum:
            if F.DataSet.RecordCount = 0 then
            begin
              if not F.IsNull then
                FTestValue := FTestValue - F.AsFloat;
            end
            else
            begin
              if F.OldValue <> null then//здесь вылетает исключение
                FTestValue := FTestValue + Float(F.OldValue);
              if not F.IsNull then
                FTestValue := FTestValue - F.AsFloat;
            end;
          fvtMax:
            if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
              FTestValue := Max(FTestValue, Float(F.OldValue));
          fvtMin:
            if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
              FTestValue := Min(FTestValue, Float(F.OldValue));
        end;
  end;
end;


место где вылетает исключение отмечено комментом

понять почему так происходит пока не могу, у меня используется footer, и некоторые поля обозначены как required, исключение вылетает как раз после обработки исключения незаполненного обязательного поля

Добавлено спустя 13 минут 4 секунды:
кстати, ту же самую ошибку наблюдаю при закрытии формы, у меня на закрытие формы стоит закрытие датасета, вот в момент закрытия датасета перед закрытием формы вылетает данная ошибка, теперь я точно уверен что это проблема грида, попробую поискать ошибку, жду ответа автора :)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение .wOvAN » 28.02.2012 13:48:43

Код: Выделить всё
if F.OldValue <> null then//здесь вылетает исключение
                FTestValue := FTestValue + Float(F.OldValue);

Может тоже проверить на Null перед использованием

Код: Выделить всё
if not F.IsNull then
  if F.OldValue <> null then
                FTestValue := FTestValue + Float(F.OldValue);
.wOvAN
постоялец
 
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12

Re: Глюки rxDBGrid

Сообщение ronin » 28.02.2012 15:54:09

действительно помогло :)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 29.02.2012 00:03:41

Учёл замечания - проверьте.
.wOvAN писал(а):Может тоже проверить на Null перед использованием

Вот этот кусок кода писал не я, поэтому сейчас и не вспомню что там было. Но на первый взгляд там принципиальная ошибка - пытаемся взять данные при пустом наборе данных. Я сейчас просто закоментил код и написал коментарий (напоминалку) на будущее.
Проверьте - если всё нормально, то переработаю процедуру.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение ronin » 29.02.2012 11:04:55

как я писал выше, такая же ошибка ещё есть где то в какой то процедуре или функции данного модуля, которая проявляется при закрытии датасета и закрытии формы с гридом, потому что данный баг исчез после того как добавил проверку на null, но на закрытие баг остался, я просто пока временно убрал закрытие датасета при закрытии формы
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 01.03.2012 00:20:44

ronin писал(а):как я писал выше, такая же ошибка ещё есть где то в какой то процедуре или функции данного модуля, которая проявляется при закрытии датасета и закрытии формы с гридом


Можно пример программы багом?

Желательно построить на базе rxMemDataSet-а чтобы мнеьше с зависимостями мчаться.
Я пробовал на его базе и на базе FBDataSet-а сделать. Не получается впоймать ошибку.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Пред.След.

Вернуться в RxLib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru