Неправильное отображение Dbcrosscorner

отредактировано April 2014 Раздел: FastReport 4.0
Доброго всем времени суток!

В отчете используется DB Cross-tab. У него 3 строки, 1 столбец, 1 ячейка. При определенных условиях необходимо удалять одну(первую) из строк.
Делаю это в коде (не в скрипте) таким образом
TfrxDBCrossView *DBCross1;
DBCross1 = (TfrxDBCrossView *) Имя_формы->frxRep->FindObject("DBCross1");
if (условие_при _котором_нужно_меньше_строк)
{
 DBCross1->RowLevels=DBCross1->RowLevels-1;
 DBCross1->RowFields->Delete(DBCross1->RowFields->IndexOf("Имя_строки_которую_нужно_удалить"));
}
И строка действительно удаляется, НО Название (или corner) этой строки не удаляется, а удаляется при этом название последней строки.
Оч. сложно на пальцах, поэтому в приложениях: файл report - сам макет, файл result1 - ситуация, когда мы ничего не удаляем динамически, файл result2 - ситуация, когда динамически удалена 1 строка.
ПРОБЛЕМА: В файлике result2 над Подподгруппами должен быть Заголовок3 (как в result1), а не Заголовок2.

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

Комментарии

  • gpigpi
    отредактировано April 2014
    Не совсем то, что Вам нужно, но пример показывает, что проще построить кросс с нуля, чем возиться с его структурой
    procedure TForm1.Button1Click(Sender: TObject);
    var
      DBCross: TfrxDBCrossView;
    
      procedure EditCross(Cross: TfrxDBCrossView; CellName: String);
      var
        i, j, k: Integer;
        TempStream: TMemoryStream;
        Own: TComponent;
        Par: TfrxComponent;
      begin
        if Cross = nil then exit;
        with Cross do
        begin
          for i := 0 to CellFields.Count - 1 do
            if CellFields[i] = CellName then
            begin
              CellFields.Delete(i);
              for j := i to CellLevels - 2 do
              begin
                CellHeaderMemos[j].AssignAll(CellHeaderMemos[j + 1]);
                CellMemos[j].AssignAll(CellMemos[j + 1]);
                CellFunctions[j] := CellFunctions[j+1];
              end;
              for j := 0 to CellLevels - 2 do
              begin
                if j >= i then
                k := j + 1
                else k := j;
                CellMemos[(CellLevels - 1) * RowLevels + j].AssignAll(CellMemos[CellLevels * RowLevels + k]);
                CellFunctions[(CellLevels - 1) * RowLevels + j] := CellFunctions[CellLevels * RowLevels + k];
              end;
              CellLevels := CellLevels - 1;
              break;
            end;
          end;
        end;
    begin
      frxReport1.LoadFromFile(FAppPath + '65.fr3');
      DBCross := frxReport1.FindObject('Cross1') as TfrxDBCrossView;
      EditCross(DBCross, 'Year');
      DBCross := frxReport1.FindObject('Cross1') as TfrxDBCrossView;
      EditCross(DBCross, 'Days');
      frxReport1.DesignReport();
    end;
    
  • отредактировано 21:21
    gpi написал: »
    проще построить кросс с нуля
    Это не проблема, но как при динамическом создании подобраться к тому самому DBCorner (причем желательно делать это не через скрипт + и создавать cross тоже не через скрипт желательно(но это разрешимо, я думаю)). Потому как даже в скрипте я не смогла выловить ни хоть какое-нибудь его свойство, ни событие при печати.
    По поводу события при печати:
    по идее вот это
    procedure DBCross1OnPrintRowHeader(Memo: TfrxMemoView; HeaderIndexes, HeaderValues, Value: Variant);
    begin
    MessageDlg(VarToStr(HeaderValues[1]), mtError, mbOK + mbCancel, 0);
    end;
    
    должно последовательно выводить нам все данные строк, но в момент вывода Corner он выводит сообщение с пустым текстом (хотя другие данные по подподгруппам выводит нормально).
    Еще обнаружила, что эти Corner невозможно переименовать даже через Object Inspector (наивно предполагала, что удаляются последние из созданных, и решила переопределить имена).

  • gpigpi
    отредактировано 21:21
    TfrxCrossView.CornerMemos
  • отредактировано 21:21
    gpi написал: »
    TfrxCrossView.CornerMemos
    Извиняюсь, но что-то не соображу до сих пор. CornerMemos - это массив текстовых полей этих самых corner, да? Попытки в скрипте как-нибудь подобраться к тексту определенного DBCross1Cornera оказались безрезультатными. Так что, если не затруднит, кусочек кода напишите, пожалуйста. И еще, если я ничего не путаю, то TfrxCrossView и TfrxDBCrossView - вещи разные, а у меня именно 2 вариант. Или это неважно в данном случае?
    Кстати, спасибо за помощь, уже не впервые оказанную. :)
  • gpigpi
    отредактировано 21:21
    написал:
    CornerMemos - это массив текстовых полей этих самых corner, да?
    Да
    В скрипте
    procedure Cross1OnBeforePrint(Sender: TfrxComponent);
    begin
        Cross1Corner3.Text:='123456';                                  
    end;
    
    В Delphi
    TfrxCrossView(frxReport1.FindObject('Cross1')).CornerMemos[3].Text:='123456';
    
    написал:
    И еще, если я ничего не путаю, то TfrxCrossView и TfrxDBCrossView - вещи разные, а у меня именно 2 вариант. Или это неважно в данном случае?
    Не важно
  • отредактировано 21:21
    gpi написал: »
    Да
    Спасибо Вам ОГРОМНОЕ. Все получилось.
    Пишу на си, поэтому немного другой синтаксис:
    TfrxDBCrossView *DBCross1;
    DBCross1 = (TfrxDBCrossView *)Имя_формы->frxRep->FindObject("DBCross1");
    DBCross1->CornerMemos[3]->Text = "Заголовок2";
    
    ps не знаю, как не заметила CornerMemos у кросса в коде, когда искала.

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

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