Подготовка отчёта в потоке

Mr. KonopkoMr. Konopko Белоруссия
отредактировано 17:13 Раздел: FastReport 4.0
Господа,

1. Мне бы хотелось подготовить отчёт b]TfrxReport.PrepareReport[/b в потоке, т.к. подготовка может занять много времени, а софт не должен "висеть". При этом хочется иметь возможность отменить подготовку в любой момент. Нашёл что-то по TfrxReport.EngineOptions.ReportThread, но как это работает и относится ли к делу вообще - непонятно. Печатать из потока не нужно. Отчёт с диалоговым окном.
Прошу разъяснить ситуацию.

2. Почему TfrxReport.Print выдаёт диалог на анг языке, хотя винда (ХР) у меня русская? :)
Мне нужен локализованных диалог.

Спасибо.

Версия компонентов 4.4.7

Комментарии

  • отредактировано 17:13
    1.Приблезительно так:

    в create:
    Report := TfrxReport.Create(nil);
    Report.EngineOptions.ReportThread := Self ; (self - текущий поток)
    Report.EngineOptions.EnableThreadSafe := True;
    Report.EngineOptions.DestroyForms := False;

    в execute :
    Report.PrepareReport;

    в Destroy:
    Report.free;

    Если выполнять в фоне диалоги лучше отключить.

    2. локализуйте FR.
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано November 2007
    написал: »
    1.Приблезительно так:

    в create:
    Report := TfrxReport.Create(nil);
    Report.EngineOptions.ReportThread := Self ; (self - текущий поток)
    Report.EngineOptions.EnableThreadSafe := True;
    Report.EngineOptions.DestroyForms := False;

    в execute :
    Report.PrepareReport;

    в Destroy:
    Report.free;

    Если выполнять в фоне диалоги лучше отключить.

    Вот что получается:

    Error
    The following error(s) have occured:

    System Error. Code: 5.

    Отказано в доступе


    ОК

    А как мне без диалоговых окон быть-то?! У меня вся суть отчёта в предварительной установке фильтров.
    ...
    
    type
      TPrepareThread = class(TThread)
      private
        FReport: TfrxReport;
      protected
        procedure Execute; override;
      public
        constructor Create;
        property Report: TfrxReport read FReport write FReport;
      end;
    
    implementation
    
    
    constructor TPrepareThread.Create;
    begin
      inherited Create(True);
      FReport := TfrxReport.Create(nil);
      FReport.EngineOptions.ReportThread := Self;
      FReport.EngineOptions.EnableThreadSafe := True;
      FReport.EngineOptions.DestroyForms := False;
    end;
    
    procedure TPrepareThread.Execute;
    begin
      FReport.PrepareReport;
    end;
    
    end.
    

    Ошибка вылетает на PrepareReport в Execute;
    Может чёго неверно делаю?
  • отредактировано 17:13
    Попробуйте перенести создание отчета в execute :
    procedure TPrepareThread.Execute;
    begin
      FReport := TfrxReport.Create(nil);
      FReport.EngineOptions.EnableThreadSafe := True;
      FReport.EngineOptions.DestroyForms := False;
      FReport.EngineOptions.ReportThread := Self;
      FReport.EngineOptions.SilentMode := True;
      FReport.LoadFromFile('c:\R1.fr3');
      FReport.PrepareReport;
    end;
    

    Диалоги должны выводится.
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано 17:13
    написал: »
    Попробуйте перенести создание отчета в execute :
    ...
    Диалоги должны выводится.

    Сделал. Диалогов нет.
    Если выставить FReport.EngineOptions.SilentMode := False;
    то появляется ошибка:


    Error
    The following error(s) have occured:

    Access violation at address 0050ECE7 in module 'FastReport.exe'. Read of address 00000008


    ОК

    Что делать?
  • отредактировано 17:13
    Вероятнее всего , что вы обращаетесь к объекту Report уже после уничтожения потока.
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано 17:13
    написал: »
    Вероятнее всего , что вы обращаетесь к объекту Report уже после уничтожения потока.

    Да ничего подобного.
    Приложил файлик - посмотрите поток:
  • отредактировано 17:13
    В аттаче элементарный пример, все работает (включая диалоги - первый поток).
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано 17:13
    Спасибо за пример.

    Но у меня в отчёте идёт подключение к базе данных. Просто подставляя свой отчёт в ваш пример, диалогов не видно и отчёт не препаривается.

    Прикладываю свой отчёт:
  • отредактировано 17:13
    Если компонент отчета создается динамически. то все датасеты нужно подключать вручную Report.DataSets.Add(frxDbDataSet);
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано November 2007
    написал: »
    Если компонент отчета создается динамически. то все датасеты нужно подключать вручную Report.DataSets.Add(frxDbDataSet);

    Как это пользовать?

    У меня в отчёте БД и запрос к ней. Ну меняю запрос в зависимости от параметров в диалоге.
    Куда этот DataSet прикручивать-то?

    Кстати, если в основном потоке мой отчёт запустить, то всё работает без всяких ДатаСетов, несмотря на то, что frxReport генерится в рантайме.
    А в отдельном потоке работают только простые отчёты, а как только добавляешь БД - всё, отчёт не хочет генериться.

    Что делать?
  • Mr. KonopkoMr. Konopko Белоруссия
    отредактировано 17:13
    Дайте справку, мне срочно нужен качественный и быстрый суппорт!
    Компоненты куплены, уши шефу маслом намазаны, а прога всё ещё не работает...

    Алярма! :)
  • отредактировано 17:13
    Mr. Konopko написал: »
    Дайте справку, мне срочно нужен качественный и быстрый суппорт!
    На форуме никто не гарантирует быстрого ответа, форум существует в основном для общения пользователей.
    Для саппорта есть хелпдеск.

    Я так понял вы используете ADO ?
    ADO это com, в многопоточном приложении нужно вызывать CoInitializeEx(nil, COINIT_MULTITHREADED) перед созданием ком объекта в потоке.
    Т.е. получается :
    if Assigned(ComObj.CoInitializeEx) then
        CoInitializeEx(nil, COINIT_MULTITHREADED)
      else
        CoInitialize(nil);
      try
        FReport.LoadFromFile(FReportName);
        FReport.PrepareReport;
      finally
        CoUninitialize;
      end;
    

    Пример в аттаче .

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

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