いつもお世話になっております。
DelphiEx2+Excel2010にて帳票を作成しておりますが、改ページをいれるプログラムにて、スレッドが解放されず、困っています。
下記ソースを実行したところ、イベント内でExcelを格納した変数をunassignedしているにも関わらず、Excelのスレッドが解放されません。EXE終了後、スレッドは解放されます。
自力で調査をしたのですが、レイトバインドしたとき、PageBreakを実行するとこの現象が起こるらしいところまではわかったのですが、その先がわかりません。どなたがご存知の方がいらっしゃったら、ご教授願います。
↓以下、サンプルコード
procedure TForm1.Button1Click(Sender: TObject);
var
vExcel : variant; //Excel.Application
bAlert : boolean;
begin
vExcel := CreateOleObject('Excel.Application');
bAlert := vExcel.DisplayAlerts;
vExcel.DisplayAlerts := false;
try
vExcel.Visible := true;
vExcel.WorkBooks.Add;
//------------------------------------------
// 問題のソースコード [PageBreakの追加]
// コメントアウトすると、スレッドが残らない
//------------------------------------------
vExcel.ActiveSheet.Range[vExcel.ActiveSheet.Cells[2,1],
vExcel.ActiveSheet.Cells[3,3]].PageBreak := true;
finally
vExcel.ActiveWorkBook.Close;
vExcel.DisplayAlerts := bAlert;
vExcel.quit;
vExcel := unassigned;
end;
end;
ヘルプみると、PageBreakてRowsとかColumnsに対してxlPageBreakManualかxlPageBreakNoneを設定するってなってるんですけど。
A2:C3の範囲に対してPageBreakの設定て出来るんでしょうか?
後、PageBreakに設定するのはTreu/Falseじゃないようなので、なにがしかのエラーが起こってるのが原因でExcelが終了出来てないんじゃないでしょうか?
ttp://msdn.microsoft.com/en-us/library/office/ff193644.aspx
レスありがとうございます。
ご指摘の通り、行に対して改造ページを設定することで、問題なく動作いたしました。これで回避できそうです。ありがとうございます。
[NG]vExcel.ActiveSheet.Range[vExcel.ActiveSheet.Cells[2,1],
vExcel.ActiveSheet.Cells[3,3]].PageBreak := true;
[OK]vExcel.ActiveSheet.Rows[4].PageBreak := true;
なお、PageBreakに関しては、True/Falseでもなぜか動くようです。
改ページの方法に関しては、以下のURLにVB.NETで同じような現象があるようで、メモリの解放の方法に問題があるようですが、Delphiで同様なやり方がわからず、困っていました。ただ、ご教授いただいた通り、メソッドの変更で対応したいと思います。ありがとうございました。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=3129&reno=3125&oya=3117&mode=msgview&page=1680
ツイート | ![]() |