Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 671

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Есть форма с помощью нее при происходит экспорт в excel. При нажатии кнопки "В Excel" открывается окно для выбора куда сохранять файл xls и в диспетчере задач появляется процесс EXCEL.EXE. При нажатии сохранить процесс завершается, но если нажать отмена процесс остается висеть в диспетчере задач. Как сделать так чтобы при нажатии отмена процесс тоже завершался?

Приложение:
  1. unit Unit5;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Grids, StdCtrls, ComObj, Buttons, OleServer, ExcelXP, DateUtils,
  8. ComCtrls, ExtCtrls, Gauges, FileCtrl;
  9.  
  10. type
  11. TForm5 = class(TForm)
  12. StringGrid1: TStringGrid;
  13. BitBtn1: TBitBtn;
  14. ea: TExcelApplication;
  15. Gauge1: TGauge;
  16. SaveDialog1: TSaveDialog;
  17. procedure FormActivate(Sender: TObject);
  18. procedure BitBtn1Click(Sender: TObject);
  19.  
  20.  
  21.  
  22.  
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form5: TForm5;
  31. dir_:string;
  32. implementation
  33.  
  34. uses Unit3, Unit1, Unit2;
  35.  
  36. {$R *.dfm}
  37. procedure TForm5.BitBtn1Click(Sender: TObject);
  38. var
  39. Excel, WorkBook, Sheet:variant;
  40. i, j: integer;
  41. GridPrevFile,extens: string;
  42.  
  43. begin
  44. Excel:=CreateOleObject('Excel.Application');
  45. Excel.DisplayAlerts:=False;
  46. Workbook:=Excel.
  47. Workbooks.Add;
  48. if (SaveDialog1.Execute) then
  49. Workbook.SaveAs(Filename:=SaveDialog1.FileName)
  50. else abort;
  51. Sheet:= Workbook.ActiveSheet;
  52. Gauge1.MaxValue:=100;
  53. Gauge1.Progress:=0;
  54.  
  55.  
  56.  
  57.  
  58. begin
  59. for j:= 0 to StringGrid1.ColCount - 1 do
  60. Sheet.Cells[i+1, j+1]:= StringGrid1.Cells[j, i];
  61.  
  62.  
  63.  
  64. Excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 33;
  65. Excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 15;
  66. Excel.WorkBooks[1].WorkSheets[1].Columns[3].ColumnWidth := 10;
  67. Excel.WorkBooks[1].WorkSheets[1].Columns[4].ColumnWidth := 23;
  68. if StringGrid1.RowCount>0 then
  69. Gauge1.Progress:=Round(((i+1)*100)/StringGrid1.RowCount);
  70. end;
  71.  
  72. Workbook.Save;
  73. Workbook.Close;
  74. Excel.Quit;
  75. Excel:= UnAssigned;
  76. end;
  77.  
  78.  
  79.  
  80.  
  81.  
  82. procedure TForm5.FormActivate(Sender: TObject);
  83. var i:integer;
  84. begin
  85.  
  86. try
  87. DM.dbs.Open;
  88. dm.query.Open;
  89. DM.query.First;
  90. except
  91. on e: exception do showmessage(e.Message);
  92. end;
  93. stringgrid1.Visible:=false;
  94. i:=0;
  95.  
  96. DM.query.SQL.Text:='select (select F+'+char(39)+' '+char(39)+'+I+'+char(39)+' '+char(39)+'+O from owner where card_id=card.card_id),spiski.card_number,(select mobile_phone from owner where card_id=card.card_id),(select email_address from owner where card_id=card.card_id)'+
  97. 'from spiski inner join card on card.card_number=spiski.card_number where act_'+Form1.StringGrid1.cells[0,form1.StringGrid1.row]+'=1';
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105. StringGrid1.ColWidths[0] := 220;
  106. StringGrid1.ColWidths[1] := 100;
  107. StringGrid1.ColWidths[2] := 70;
  108. StringGrid1.ColWidths[3] := 130;
  109.  
  110. DM.query.Open;
  111. DM.query.First;
  112. while not DM.query.Eof do
  113. begin
  114. inc(i);
  115. stringgrid1.Cells[0,i]:=DM.query.Fields[0].AsString;
  116. stringgrid1.Cells[1,i]:=DM.query.Fields[1].AsString;
  117. stringgrid1.Cells[2,i]:=DM.query.Fields[2].AsString;
  118. stringgrid1.Cells[3,i]:=DM.query.Fields[3].AsString;
  119.  
  120.  
  121.  
  122. stringgrid1.RowCount:=i+1;
  123. DM.query.Next;
  124. end;
  125. stringgrid1.FixedRows:=1;
  126. stringgrid1.Visible:=true;
  127. DM.query.Close;
  128.  
  129. end;
  130. end.


slai Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: slai (статус: Посетитель)
Вопрос отправлен: 20 октября 2010, 03:19
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, slai!
В принципе у Вас уже все прописано. Только надо описать действия при отмене сохранения файла.
...
if (SaveDialog1.Execute) then
Workbook.SaveAs(Filename:=SaveDialog1.FileName)
else
begin
WorkBook.Close;
Excel.Quit;
Excel:= UnAssigned;
end;
...

В принципе логично при закрытии формы проверять запущен ли Excel и, если запущен, то закрывать.
Примерно так:

procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if VarIsEmpty(Excel) = false then
begin
Excel.Quit;
Excel:= UnAssigned;
end;
end;

Только надо переменную Excel объявить как глобальную переменную.
Удачи.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 20 октября 2010, 07:49
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 21 октября 2010, 05:34; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 20 октября 2010, 10:15 [#1]:

вставить в код abort, если пользователь решил не сохранять файл - это жестко.
Галочка "подтверждения прочтения" - вселенское зло.
Владимирович

Владимирович (статус: Посетитель), 20 октября 2010, 14:04 [#2]:

procedure TForm5.BitBtn1Click(Sender: TObject);
var
Excel, WorkBook, Sheet:variant;
i, j: integer;
GridPrevFile,extens: string;

begin
Excel:=CreateOleObject('Excel.Application');
Excel.DisplayAlerts:=False;
try
Workbook:=Excel.Workbooks.Add;
if (SaveDialog1.Execute) then
Workbook.SaveAs(Filename:=SaveDialog1.FileName)
else
exit;

...
// здесь ваш код работы с Excel
...
Workbook.Save;
Workbook.Close;
finally
Excel.Quit;
Excel:= UnAssigned;
end;
end;
slai

slai (статус: Посетитель), 21 октября 2010, 05:34 [#3]:

Владимирович:
Спасибо ваш вариант работает.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:58
Выполнено за 0.03 сек.