度々ですがよろしくおねがいします。
QuickReportで複数のマスタ作成画面からリスト物のレポートを動的に切り替えて出力したいと考えています。
QuickReport上に
TableとTitleBandを乗せておき
このTableをQuickReportのDataSetに設定
Table.TableNameは空白のままで…
各作業フォームから
procedure TForm***.ButtonClick;
begin
//前処理
QuickReport.Bands.HasDetail := True;
QuickReport.DataSet.Close;
QuickReport.Table.TableName := 'Mastar***.DB';
with TQRDBText.Create(QuickReport) do
begin
Parent := QuickReport.Bands.DetailBand;
Name := 'Code';
Dataset := QuickReport.Table;
DataField := 'Code';
Size.Top := 2;
Size.Left := 10;
end;
with TQRDBText.Create(QuickReport) do
begin
Parent := QuickReport.Bands.DetailBand;
Name := 'Name';
Dataset := QuickReport.Table;
DataField := 'Name';
Size.Top := 2;
Size.Left := 25;
end;
//印刷
QuickReport.Table.Active := True;
QuickReport.Preview;
//後処理
QuickReport.Table.Active := False;
QuickReport.Bands.HasDetail := False;
end;
大体こんな感じです。
レポートは初期生成のままです。
1回目の表示は上手く表示されるんですが、2回目別のデータベースを参照すると文字化けしたり、きちんとフィールドを参照できなくなったりします。
うまく、リセットする方法はないんでしょうか?
レポート自体を動的生成するしかないですか?
見たところコードと名称だけのようなので、単純に設計時に二つQRDBTextを配置しておいてDataSet・DataFieldの値を切り替えるのはダメなのでしょうか?
はずしていたらごめんなさい_(._.)_
さらに3つめのTQxprとかの動的生成があったりするので、生成部分は呼び出し側によって変更してあります。
なので、解放とかはhasDetail := False;が楽かなぁと思ったんですが。
QRDBTextを動的生成でしたね、、失礼しました。
私の場合はそのような高度なことはしたことがないので設計時に必要な分だけ
配置しておきDataSet・DataField・Enabledを切り分けて使用していました。
Report自体も常に作成・廃棄しておりましたので今回の回答は間違っていますね。
失礼しました_(._.)_
レポートの共有に断念しそうです。
ところで、生成廃棄は
QuickReport := TQuickReport.Create(self);
・
・
・
QuickReport.Free;
でされてるんですか?
試してみましたが、2度目の生成で既に存在するとエラーが出ました。
私の環境では上記の様な形でエラーは出ませんね。
念のためTry〜Finallyで破棄するのがいいのではないかと思います。
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickReport := TQuickReport.Create(self);
try
QuickReport.PreviewModal;
finally
QuickReport.Free;
end;
end;
はずしていたらごめんなさい_(._.)_
> with TQRDBText.Create(QuickReport) do
> begin
> Parent := QuickReport.Bands.DetailBand;
勘違いでなのか、タイプミスなのか知りませんが・・・
これで生成されるTQRDBTextの所有者は、QuickReportであり、
DetailBandではありません。表示上、DetailBandにしているだけで、
HasDetail = False にすることで、DetailBandが亡くなっても
TQRDBTextのインスタンスは残ったままです。
もしかすると、DetailBand自身、消えていない可能性もあるかもしれません。
やっぱり、hasBandを外しても解放されないんですか。
前に質問してBandを解放したら一緒に解放されるみたいなことを教えてもらったんで信じてみたんですが…
とりあえず、Report自体を生成廃棄する方向で制作することにしました。
ども、ありがとうございます。
> やっぱり、hasBandを外しても解放されないんですか。
ちゃうちゃう!
> with TQRDBText.Create(QuickReport) do
開放したければ、これじゃなくて、
with TQRDBText.Create(QuickReport.Bands.DetailBand) do
Owner と Parent の違い理解して。
ツイート | ![]() |