CrossTab-JoinEquilCells

отредактировано December 2006 Раздел: FastReport 4.0
Ошибки
1. Ошибка Преобразование типов
{ check if previous memo has the same value and JoinEqualCells is True }
      if JoinEqualCells then
        if RowItem.IsTotal or ColumnItem.IsTotal then
          SameMemos[CellIndex] := nil
        else if (SameMemos[CellIndex] = nil) or RowItem.IsTotal or ColumnItem.IsTotal or  
// ----- испарвления
          ( TVarData(THackMemoView(SameMemos[CellIndex]).Value).VType<>TVarData(THackMemoView(Memo).Value).VType ) or
          ((TVarData(THackMemoView(SameMemos[CellIndex]).Value).VType=TVarData(THackMemoView(Memo).Value).VType)and
//----------
           (THackMemoView(SameMemos[CellIndex]).Value <> THackMemoView(Memo).Value)
           )
            then
          SameMemos[CellIndex] := Memo
        else
        begin
2. Если вешаю событие на OnPrintCell (даже пустое, без кода), то ошибка 'List index out of bounds(24)'
procedure TfrxCustomCrossView.DoOnCell(Memo: TfrxCustomMemoView;
  Row, Column, Cell: Integer; const Value: Variant);
var
  v: Variant;
begin
  if FOnPrintCell <> '' then
  begin
->    v := VarArrayOf([Integer(Memo), Row, Column, Cell, GetRowIndexes(Row),
      GetColumnIndexes(Column), Value]);
    if Report <> nil then
      Report.DoParamEvent(FOnPrintCell, v);
  end;
  if Assigned(FOnBeforePrintCell) then
    FOnBeforePrintCell(Memo, Row, Column, Cell, GetRowIndexes(Row),
      GetColumnIndexes(Column), Value);
end;
Точнее ошибка возникает в GetRowIndexes(Row), а FRows.count=24 . Могу выслать отчет.

Предложение:
-Если мне не нужны обозначение полей под словом Data, я их могу удалить, но столбик узкий остается. Хорошо бы его убрать
-Предположим, я убрал название полей. Но потом опять вошел в редактор CrossTab, что-то добавил/удалил и название опять появляется. Необходимо опять чистить
Вопрос:
1.По моему неверно работает JoinEquilCells? Каждый этаж ячейки объединяется независимо от значение в др. этажах этой ячнйки. Это неверно. Объединяется вся ячейка, если нет отличий во ВСЕХ этажах. Если есть отличие хотя бы в одном этаже, то ячейки объединятся быть не должны.(рис. 2)
2. Чем отличаются св-ва AllowDuplicates (Crosstab) и SuppressRepeated (TfrxMemoview)? И как они взаимодействуют, у кого приоритет?
3. Раньше обработка ячейки шла "по этажам" сверху вниз, что позволяло, например, окрашивать ВСЮ ячеку в зависимости от значения в самом верхнем "этаже". Теперь обработка идет слева-направо "по этажам". Как изменить что-то(цвет, шрифт..) 2-го "этажа" в зависимости от значения в 1-ом?

Комментарии

  • отредактировано 16:21
    1) не принимается. объединение не может, да и не должно, работать с режимом plain cells. Объединяться могут только однотипные ячейки.
    2) у меня без ошибок. FR4 последний?

    - у столбика можно отключить линии рамки. Он не убирается.
    - лучше, чем есть, сделать не получится...

    1) попробую поправить.
    2) SuppressRepeated в кроссе не работает. Это для обычных отчетов.
    3) Боюсь, что никак.
  • отредактировано December 2006
    1. С типами м.б. Вы правы, но у меня plain cells отключен, но ошибка иногда все равно вылетает. Видимо из-за исх.данных. По по-моему надо предотвратить возможность возникновения ошибки, тем более, что это ничем не грозит. Или сделать преобразование к string.
    2. Fr4 последний (вчерашний). Попробуйте увеличить у себя в примере этажность ячеки (у меня 6 этажей ). У меня 6 строк (дни недели)по 4 пары в день и 6 этажей в ячейке. Так вот, возникает ошибка, когда заполнен один день (6 этажей по 4 пары=24) и Row=24. (см рис)
    3.
    написал:
    Раньше обработка ячейки шла "по этажам" сверху вниз, что позволяло, например, окрашивать ВСЮ ячеку в зависимости от значения в самом верхнем "этаже". Теперь обработка идет слева-направо "по этажам". Как изменить что-то(цвет, шрифт..) 2-го "этажа" в зависимости от значения в 1-ом?
    Неужели никак нельзя просмотреть значение "этажа" над текущем?
    4. А уменьшить min ширину(<10 px) узкого столбца можно?
    5. Моя Реализация JoinEquilCells
    function TfrxCustomCrossView.IsEquilCells(ARow1, ACol1, ARow2, ACol2: Integer): boolean;
    var i:integer;
       Row: TfrxCrossRow;
       v1,v2:variant;
    begin
      Result := not((ARow1>=FRows.count) or (ARow1<0) or
                (ARow2>=FRows.count) or (ARow2<0) or
                (ACol1>=FColumns.count) or (ACol1<0) or
                (ACol2>=FColumns.count) or (ACol2<0)or
                (FRows[ARow1].FCellLevels<>FRows[ARow2].FCellLevels));
      if not Result then EXIT;
      Row := FRows[ARow1];
      for i:=0 to Row.FCellLevels-1 do
      begin
        v1:=GetValue(ARow1, ACol1, i);
        v2:=GetValue(ARow2, ACol2, i);
        if (v1<>v2){or VarIsNull(v1)or(VarType(v1)=varSingle)and(v1='')} then
        begin
         Result := false;
         BREAK;
        end;
       end;
    end;
    
          if JoinEqualCells then
            if RowItem.IsTotal or ColumnItem.IsTotal then
              SameMemos[CellIndex] := nil
            else if (SameMemos[CellIndex] = nil) or RowItem.IsTotal or ColumnItem.IsTotal or
              ( TVarData(THackMemoView(SameMemos[CellIndex]).Value).VType<>TVarData(THackMemoView(Memo).Value).VType )
              or
    // ----------МОИ
              ((TVarData(THackMemoView(SameMemos[CellIndex]).Value).VType=TVarData(THackMemoView(Memo).Value).VType)and
               (THackMemoView(SameMemos[CellIndex]).Value <> THackMemoView(Memo).Value)
               ) or
               not IsEquilCells(RowIndex div FCellLevels, i,RowIndex div FCellLevels, i-1)
    // ----------
                then
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.